package controllers

import (
	"log"
	"time"

	"github.com/gofiber/fiber/v2"
	"github.com/sujit-baniya/fiber-boilerplate/app"
	"github.com/sujit-baniya/fiber-boilerplate/pkg/models"
)

// RunSeed ejecuta el seed de módulos/submodulos del sistema de forma idempotente.
// GET /app/run-seed — requiere sesión activa.
func RunSeed(c *fiber.Ctx) error {
	if err := seedModulo("Integraciones", "Conexión con servicios externos: Hostinger, Cloudflare y más", []seedEntry{
		{"Hostinger", "Panel de VPS, dominios, hosting y DNS de Hostinger", "/app/hostinger"},
		{"Cloudflare", "Gestión de zonas, DNS, SSL y firewall en Cloudflare", "/app/cloudflare"},
		{"Coolify", "Gestión de aplicaciones, servicios, bases de datos y deployments con Coolify", "/app/coolify"},
		{"Pasarelas de Pago", "Configuración de Bold, dLocal y otras pasarelas", "/app/pasarelas-pago"},
	}); err != nil {
		return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
	}

	if err := seedModulo("Conexiones", "Gestión de servidores y conexiones de base de datos", []seedEntry{
		{"Conexiones DB", "Lista y configuración de conexiones de base de datos", "/app/conexion_db"},
		{"Query Runner", "Editor SQL: ejecutar consultas, exportar y ver historial", "/app/query-runner"},
		{"Conexiones SSH", "Gestión de conexiones SSH a servidores", "/app/conexion_ssh"},
	}); err != nil {
		return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
	}

	if err := seedModulo("Renovaciones", "Gestión de contratos, clientes y notificaciones de vencimiento", []seedEntry{
		{"Contratos", "Gestión de contratos y vencimientos", "/app/contratos"},
		{"Clientes", "Clientes y datos de contacto", "/app/clientes"},
		{"Servicios", "Catálogo de servicios", "/app/servicios"},
		{"Plantillas Correo", "Editor de plantillas de correo", "/app/plantillas-correo"},
		{"Reglas de Aviso", "Reglas de notificación automática", "/app/reglas-notificacion"},
		{"Historial Notif.", "Historial de correos enviados", "/app/historial-notificaciones"},
		{"Config. SMTP", "Configuración del servidor de correo", "/app/smtp-config"},
	}); err != nil {
		return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
	}

	if err := seedModulo("Integraciones", "Conexión con servicios externos: Hostinger, Cloudflare y más", []seedEntry{
		{"Telegram", "Notificaciones y alertas por Telegram", "/app/telegram"},
	}); err != nil {
		return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
	}

	if err := seedModulo("SaaS", "Gestión de productos SaaS e integraciones de pago", []seedEntry{
		{"Productos SaaS", "Gestión de productos SaaS y su documentación asociada", "/app/saas"},
		{"Integraciones SaaS", "Callbacks de pago hacia APIs externas y logs de despacho", "/app/saas-api"},
	}); err != nil {
		return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
	}

	if err := seedModulo("Portal de Clientes", "Portal de clientes: proyectos, facturas y accesos", []seedEntry{
		{"Proyectos", "Gestión de proyectos y avances del portal", "/app/proyectos"},
		{"Facturas", "Gestión de facturas y pagos por cliente", "/app/facturas"},
		{"Portal Usuarios", "Usuarios con acceso al portal de clientes", "/app/portal-usuarios"},
	}); err != nil {
		return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
	}

	return c.JSON(fiber.Map{
		"ok":      true,
		"message": "Seed ejecutado correctamente. Recarga la página de Roles.",
	})
}

type seedEntry struct{ title, desc, url string }

func seedModulo(titulo, descripcion string, entries []seedEntry) error {
	db := app.Http.Database.DB

	var modulo models.Modules
	if err := db.Where("title = ?", titulo).First(&modulo).Error; err != nil {
		modulo = models.Modules{
			Title:       titulo,
			Description: descripcion,
			ModifiedAt:  time.Now(),
		}
		if err := db.Create(&modulo).Error; err != nil {
			log.Printf("[SEED] Error creando módulo '%s': %v", titulo, err)
			return err
		}
		log.Printf("[SEED] Módulo '%s' creado (ID %d)", titulo, modulo.ID)
	} else {
		log.Printf("[SEED] Módulo '%s' ya existe (ID %d)", titulo, modulo.ID)
	}

	var insertados []models.Submodules
	for _, e := range entries {
		var sub models.Submodules
		if err := db.Where("url = ?", e.url).First(&sub).Error; err != nil {
			sub = models.Submodules{
				Title:       e.title,
				Description: e.desc,
				Url:         e.url,
				ModuleId:    modulo.ID,
				ModifiedAt:  time.Now(),
			}
			if err := db.Create(&sub).Error; err != nil {
				log.Printf("[SEED] Error creando submódulo '%s': %v", e.title, err)
				continue
			}
			log.Printf("[SEED] Submódulo '%s' creado (ID %d)", e.title, sub.ID)
		} else {
			if sub.ModuleId != modulo.ID {
				db.Model(&sub).Update("module_id", modulo.ID)
			}
			log.Printf("[SEED] Submódulo '%s' ya existe (ID %d)", e.title, sub.ID)
		}
		insertados = append(insertados, sub)
	}

	var roles []models.Roles
	if err := db.Find(&roles).Error; err != nil {
		return err
	}
	for _, rol := range roles {
		if err := db.Model(&rol).Association("Submodules").Append(&insertados); err != nil {
			log.Printf("[SEED] Error asignando submódulos al rol '%s': %v", rol.Name, err)
		}
	}
	return nil
}
