package main

import (
	"flag"
	"log"

	"github.com/gofiber/fiber/v2/middleware/cors"
	"github.com/pyroscope-io/pyroscope/pkg/agent/profiler"
	"github.com/sujit-baniya/fiber-boilerplate/app"
	"github.com/sujit-baniya/fiber-boilerplate/migrations"
	"github.com/sujit-baniya/fiber-boilerplate/pkg/models"
	"github.com/sujit-baniya/fiber-boilerplate/pkg/services"
	"github.com/sujit-baniya/fiber-boilerplate/rest/routes"
	"github.com/sujit-baniya/fiber-boilerplate/utils"
)

func main() {
	configFile := flag.String("config", "config.yml", "User Config file from user")
	migrate := flag.Bool("migrate", false, "Update db structure")
	flag.Parse()

	// Cargar configuración
	app.Load(*configFile)

	// Configurar Pyroscope profiler
	if app.Http.Profiler.Enabled {
		_, _ = profiler.Start(profiler.Config{
			ApplicationName: app.Http.Server.Name,
			ServerAddress:   app.Http.Profiler.Server,
		})
	}

	// Actualizar versión del servidor
	app.Http.Server.Version = app.Version

	// Habilitar CORS
	app.Http.Server.App.Use(cors.New(cors.Config{
		AllowOrigins: "*",
		AllowMethods: "GET,POST,PUT,DELETE,OPTIONS",
		AllowHeaders: "Content-Type, Authorization",
	}))

	if *migrate {
		// Ejecutar migraciones
		migrations.Migrate()
	} else {
		// Crear/actualizar tablas de Renovaciones e idempotente)
		migrations.MigrateRenovaciones()
		// Crear/actualizar tablas de Portal, Telegram y Proyectos
		migrations.MigratePortal()
		// Crear tabla de Landing Generator
		migrations.MigrateLanding()
		// Crear tablas de integraciones y pasarelas si no existen
		if err := app.Http.Database.DB.AutoMigrate(
			// Tablas base del sistema (columnas nuevas)
			&models.Users{},
			&models.Roles{},
			&models.Submodules{},
			&models.QueryHistory{},
			&models.OssApi{},
			&models.QrVcard{},
			&models.VcfVcard{},
			&models.HostingerConfig{},
			&models.CloudflareConfig{},
			&models.BoldConfig{},
			&models.BoldWebhookLog{},
			&models.BoldCallbackLog{},
			&models.DlocalPaymentLog{},
			// Documentación por SaaS
			&models.SaasProducto{},
			&models.DocCategoria{},
			&models.DocPagina{},
			// Integraciones SaaS (dispatcher de pagos)
			&models.SaasApiConfig{},
			&models.SaasDispatchLog{},
			// Notificaciones
			&models.NotifEventoConfig{},
			&models.SistemaNotificacion{},
			&models.ServidorAlertaUmbral{},
			// Shield
			&models.ShieldConfig{},
			// Partner
			&models.PartnerRecurso{},
			&models.PartnerComunicado{},
			// Portal: recuperación de contraseña
			&models.PortalPasswordResetToken{},
			// Integración VCard API Admin
			&models.VcardApiConfig{},
			// Integración Coolify (multi-instancia)
			&models.CoolifyConfig{},
			// AI Config: campos del agente Telegram
			&models.AiConfig{},
			// Agente Telegram: historial y chats autorizados
			&models.TelegramAgentHistory{},
			&models.TelegramAgentAuth{},
			// Servidores: nuevos campos de agente + tabla join de integraciones
			&models.Servidor{},
			&models.ConxDb{},
			&models.ProvServidor{},
			// SMTP
			&models.SmtpConfig{},
			// WebSMS (LabsMobile)
			&models.WebSmsConfig{},
			&models.WebSmsLog{},
			&models.WebSmsWebhookLog{},
			// Contabilidad
			&models.Cuenta{},
			&models.Entidad{},
			&models.Transaccion{},
			&models.CuentaCobro{},
			&models.CuentaPagar{},
			&models.ConsolidadoMensual{},
			// Historial de métricas del agente
			&models.ServidorMetricasHistory{},
			// Monitor de disponibilidad de URLs
			&models.UrlMonitor{},
			&models.UrlMonitorLog{},
			// Tablero de tareas
			&models.Tarea{},
			&models.TareaComentario{},
			// Soporte: webhook de correo entrante
			&models.SoporteWebhookConfig{},
			// Automatización de cotizaciones, contratos, actas y cuentas de cobro con IA
			&models.PlantillaDocumento{},
			&models.Tarifa{},
			&models.DocumentoGenerado{},
			&models.Arquitectura{},
		); err != nil {
			// AutoMigrate se detiene en el primer error: si esto falla, todos los
			// modelos que venían después en la lista se quedan sin crear en silencio.
			log.Printf("[MIGRATE] Error en AutoMigrate: %v", err)
		}
		// Seed automático (idempotente) de módulos del sistema
		migrations.SeedRenovaciones()
		migrations.SeedIntegraciones()
		migrations.SeedPasarelas()
		migrations.SeedSaas()
		migrations.SeedServidores()
		migrations.SeedAdministracion()
		migrations.SeedPlantillasBase()
		migrations.SeedTelegram()
		migrations.SeedPortalClientes()
		migrations.SeedNotifDefaults()
		migrations.SeedShield()
		migrations.SeedPartnerRecursos()
		models.SeedContabilidad()
		models.SeedBalanceData()
		migrations.SeedContabilidadMenu()
		migrations.SeedWebSms()
		migrations.SeedUrlMonitor()
		migrations.SeedTareas()
		migrations.SeedAutomatizacionIA()
		// Cargar config SMTP desde BD (sobreescribe valores del .env/config.yml si hay registro activo)
		if smtpCfg, err := models.GetSmtpConfig(); err == nil {
			app.Http.Mail.Host = smtpCfg.Host
			app.Http.Mail.Port = smtpCfg.Port
			app.Http.Mail.Username = smtpCfg.Username
			app.Http.Mail.Password = utils.Decrypt(smtpCfg.Password, app.Http.Server.Key)
			app.Http.Mail.Encryption = smtpCfg.Encryption
			app.Http.Mail.FromAddress = smtpCfg.FromAddress
			app.Http.Mail.FromName = smtpCfg.FromName
			app.Http.Mail.SetupMailer()
			log.Println("[SMTP] Configuración cargada desde base de datos")
		} else {
			log.Println("[SMTP] Sin config en BD, usando valores del entorno")
		}
		// Iniciar cron de vencimientos
		services.IniciarCron()
		defer services.DetenerCron()
		// Cargar rutas
		routes.LoadRoutes(app.Http.Server.App)
		app.Http.Route404()
		log.Fatal(app.Http.Server.ServeWithGraceFullShutdown())
	}
}
