// main.go с graceful shutdown
package main

import (
	"log"
	"os"
	"os/signal"
	"syscall"

	"api_bb/internal/app"
	"api_bb/internal/config"
	"api_bb/pkg/logger"

	"go.uber.org/zap"
)

func main() {
	// Загрузка конфигурации
	cfg := config.Load()

	// Инициализация логгера
	if err := logger.Init(
		os.Getenv("LOG_LEVEL"),
		os.Getenv("ENVIRONMENT"),
	); err != nil {
		log.Printf("Failed to initialize logger: %v", err)
		os.Exit(1)
	}
	defer logger.Sync()

	// Логируем начало работы
	logger.LogApplicationStart(os.Getenv("REST_API_VERSION"), os.Getenv("ENVIRONMENT"), "")

	// Создание и инициализация приложения
	application := app.NewApp(cfg)
	if err := application.Initialize(); err != nil {
		logger.Get().Fatal("failed to initialize application", zap.Error(err))
	}

	// Канал для graceful shutdown
	done := make(chan bool, 1)
	quit := make(chan os.Signal, 1)
	signal.Notify(quit, os.Interrupt, syscall.SIGTERM)

	// Запуск сервера в горутине
	go func() {
		if err := application.Start(); err != nil {
			logger.Get().Fatal("failed to start server", zap.Error(err))
		}
		done <- true
	}()

	// Ожидание сигнала shutdown
	<-quit
	logger.Get().Info("shutdown signal received")

	// Graceful shutdown приложения
	if err := application.Shutdown(); err != nil {
		logger.Get().Fatal("could not gracefully shutdown the application", zap.Error(err))
	}

	logger.LogApplicationShutdown("graceful shutdown")
	<-done
}