package main

import (
	"bamort/character"
	"bamort/config"
	"bamort/database"
	"bamort/equipment"
	"bamort/gsmaster"
	"bamort/importer"
	"bamort/logger"
	"bamort/maintenance"
	"bamort/pdfrender"
	"bamort/router"
	"bamort/transfer"
	"bamort/user"

	"github.com/gin-gonic/gin"
)

// @title Bamort API
// @version 1
// @description This is the API for Bamort
// @host localhost:8180
// @BasePath /
// @schemes http
func main() {
	// Verwende die globale Konfigurationsvariable (bereits in config.init() geladen)
	cfg := config.Cfg

	// Logger konfigurieren
	logger.SetDebugMode(cfg.DebugMode)
	if cfg.LogLevel == "DEBUG" {
		logger.SetMinLogLevel(logger.DEBUG)
	} else if cfg.LogLevel == "WARN" {
		logger.SetMinLogLevel(logger.WARN)
	} else if cfg.LogLevel == "ERROR" {
		logger.SetMinLogLevel(logger.ERROR)
	} else {
		logger.SetMinLogLevel(logger.INFO)
	}

	logger.Info("Bamort Server wird gestartet...")
	logger.Debug("Debug-Modus ist aktiviert")
	logger.Info("Environment: %s", cfg.Environment)
	logger.Info("testingDB Set: %s", cfg.DevTesting)
	logger.Info("Server Port: %s", cfg.ServerPort)

	// Gin-Modus basierend auf Environment setzen
	if cfg.IsProduction() {
		gin.SetMode(gin.ReleaseMode)
		logger.Info("Gin läuft im Release-Modus")
	} else {
		gin.SetMode(gin.DebugMode)
		logger.Debug("Gin läuft im Debug-Modus")
	}

	// Datenbank verbinden
	logger.Debug("Verbinde mit Datenbank...")
	database.ConnectDatabase()
	logger.Info("Datenbankverbindung erfolgreich")

	// Initialize PDF templates
	logger.Debug("Initialisiere PDF-Templates...")
	if err := pdfrender.InitializeTemplates("/app/default_templates", cfg.TemplatesDir); err != nil {
		logger.Warn("Fehler beim Initialisieren der Templates: %s", err.Error())
	} else {
		logger.Info("PDF-Templates erfolgreich initialisiert")
	}

	r := gin.Default()
	router.SetupGin(r)

	// Routes registrieren
	logger.Debug("Registriere API-Routen...")
	protected := router.BaseRouterGrp(r)
	// Register your module routes
	user.RegisterRoutes(protected)
	gsmaster.RegisterRoutes(protected)
	character.RegisterRoutes(protected)
	equipment.RegisterRoutes(protected)
	maintenance.RegisterRoutes(protected)
	importer.RegisterRoutes(protected)
	pdfrender.RegisterRoutes(protected)
	transfer.RegisterRoutes(protected)
	config.RegisterRoutes(protected)

	// Register public routes (no authentication)
	pdfrender.RegisterPublicRoutes(r)
	config.RegisterPublicRoutes(r)

	logger.Info("API-Routen erfolgreich registriert")

	// Server starten
	serverAddress := cfg.GetServerAddress()
	logger.Info("Server startet auf Adresse: %s", serverAddress)
	if err := r.Run(serverAddress); err != nil {
		logger.Error("Fehler beim Starten des Servers: %s", err.Error())
		panic(err)
	}
}
