package routes

import (
	"github.com/gofiber/fiber/v2"
	"github.com/sujit-baniya/fiber-boilerplate/migrations"
	"github.com/sujit-baniya/fiber-boilerplate/rest/controllers"
	"github.com/sujit-baniya/fiber-boilerplate/rest/middlewares"
)

// RenovacionesRoutes registra todas las rutas del módulo de renovaciones/contratos
func RenovacionesRoutes(protected fiber.Router) {
	// ─── Servicios ───────────────────────────────────────────────────
	protected.Get("/servicios", middlewares.MenuMiddleware, controllers.ServiciosView)
	protected.Get("/api/servicios", controllers.GetServicios)
	protected.Get("/api/servicios/select", controllers.GetServiciosSelect)
	protected.Post("/api/servicios", controllers.CreateServicio)
	protected.Put("/api/servicios/:id", controllers.UpdateServicio)
	protected.Delete("/api/servicios/:id", controllers.DeleteServicio)

	// ─── Clientes ────────────────────────────────────────────────────
	protected.Get("/clientes", middlewares.MenuMiddleware, controllers.ClientesView)
	protected.Get("/api/clientes", controllers.GetClientes)
	protected.Get("/api/clientes/select", controllers.GetClientesSelect)
	protected.Post("/api/clientes", controllers.CreateCliente)
	protected.Put("/api/clientes/:id", controllers.UpdateCliente)
	protected.Delete("/api/clientes/:id", controllers.DeleteCliente)
	// Documentos de cliente
	protected.Get("/api/clientes/:clienteID/documentos", controllers.GetClienteDocumentos)
	protected.Post("/api/clientes/:clienteID/documentos", controllers.UploadClienteDocumentos)
	protected.Delete("/api/clientes/:clienteID/documentos/:docID", controllers.DeleteClienteDocumento)
	protected.Get("/api/clientes/:clienteID/documentos/:docID/download", controllers.DownloadClienteDocumento)

	// ─── Contratos ───────────────────────────────────────────────────
	protected.Get("/contratos", middlewares.MenuMiddleware, controllers.ContratosView)
	protected.Get("/api/contratos", controllers.GetContratos)
	protected.Post("/api/contratos", controllers.CreateContrato)
	protected.Put("/api/contratos/:id", controllers.UpdateContrato)
	protected.Delete("/api/contratos/:id", controllers.DeleteContrato)
	protected.Post("/api/contratos/:id/renovar", controllers.RenovarContrato)
	protected.Post("/api/contratos/:id/enviar-correo", controllers.EnviarCorreoContrato)
	protected.Get("/api/contratos/:id/historial", controllers.GetHistorialContrato)
	protected.Post("/api/contratos/:id/verificar-pago", controllers.VerificarPagoBold)
	protected.Post("/api/contratos/:id/marcar-pagado", controllers.MarcarPagoManual)

	// ─── Plantillas de correo ─────────────────────────────────────────
	protected.Get("/plantillas-correo", middlewares.MenuMiddleware, controllers.PlantillasView)
	protected.Get("/api/plantillas-correo", controllers.GetPlantillas)
	protected.Post("/api/plantillas-correo", controllers.CreatePlantilla)
	protected.Put("/api/plantillas-correo/:id", controllers.UpdatePlantilla)
	protected.Delete("/api/plantillas-correo/:id", controllers.DeletePlantilla)
	protected.Get("/api/plantillas-correo/:id/preview", controllers.PreviewPlantilla)
	protected.Post("/api/plantillas-correo/:id/test", controllers.TestEnvioPlantilla)
	protected.Post("/api/plantillas-correo/validate", controllers.ValidarPlantilla)

	// ─── Reglas de notificación ───────────────────────────────────────
	protected.Get("/reglas-notificacion", middlewares.MenuMiddleware, controllers.ReglasView)
	protected.Get("/api/reglas-notificacion", controllers.GetReglas)
	protected.Post("/api/reglas-notificacion", controllers.CreateRegla)
	protected.Put("/api/reglas-notificacion/:id", controllers.UpdateRegla)
	protected.Delete("/api/reglas-notificacion/:id", controllers.DeleteRegla)

	// ─── Historial de notificaciones ─────────────────────────────────
	protected.Get("/historial-notificaciones", middlewares.MenuMiddleware, controllers.HistorialView)
	protected.Get("/api/historial-notificaciones", controllers.GetHistorial)
	protected.Post("/api/historial-notificaciones/:id/reenviar", controllers.ReenviarNotificacion)
	protected.Get("/api/historial-notificaciones/:id/preview", controllers.VerPreviewLog)

	// ─── Configuración SMTP ───────────────────────────────────────────
	protected.Get("/smtp-config", middlewares.MenuMiddleware, controllers.SmtpConfigView)
	protected.Get("/api/smtp-config", controllers.GetSmtpConfig)
	protected.Post("/api/smtp-config", controllers.SaveSmtpConfig)
	protected.Post("/api/smtp-config/test", controllers.TestSmtpConfig)

	// ─── Automatización IA: Asistente (chat propio) ───────────────────
	protected.Get("/asistente", middlewares.MenuMiddleware, controllers.AsistenteView)
	protected.Post("/api/asistente/chat", controllers.PostAsistenteChat)
	protected.Delete("/api/asistente/historial", controllers.DeleteAsistenteHistorial)

	// ─── Automatización IA: Plantillas de documento ────────────────────
	protected.Get("/automatizacion/plantillas", middlewares.MenuMiddleware, controllers.PlantillasDocumentoView)
	protected.Get("/api/plantillas-documento", controllers.GetPlantillasDocumento)
	protected.Get("/api/plantillas-documento/:id", controllers.GetPlantillaDocumento)
	protected.Post("/api/plantillas-documento", controllers.CreatePlantillaDocumento)
	protected.Put("/api/plantillas-documento/:id", controllers.UpdatePlantillaDocumento)
	protected.Delete("/api/plantillas-documento/:id", controllers.DeletePlantillaDocumento)

	// ─── Automatización IA: Tarifas ─────────────────────────────────────
	protected.Get("/automatizacion/tarifas", middlewares.MenuMiddleware, controllers.TarifasView)
	protected.Get("/api/tarifas", controllers.GetTarifas)
	protected.Post("/api/tarifas", controllers.CreateTarifa)
	protected.Put("/api/tarifas/:id", controllers.UpdateTarifa)
	protected.Delete("/api/tarifas/:id", controllers.DeleteTarifa)

	// ─── Automatización IA: Arquitecturas ───────────────────────────────
	protected.Get("/api/arquitecturas", controllers.GetArquitecturas)
	protected.Post("/api/arquitecturas", controllers.CreateArquitectura)

	// ─── Automatización IA: Cotizaciones y documentos generados ────────
	protected.Post("/api/cotizaciones", controllers.CreateCotizacion)
	protected.Post("/api/contratos/:id/generar-documento", controllers.GenerarDocumentoContrato)
	protected.Get("/api/documentos-generados", controllers.GetDocumentosGenerados)
	protected.Get("/api/documentos-generados/:id/download", controllers.DownloadDocumentoGenerado)

	// ─── Diagnóstico ──────────────────────────────────────────────────
	protected.Post("/api/diagnostico/ciclo-notificaciones", controllers.EjecutarTestCiclo)

	// ─── Admin: seed de módulos (idempotente) ─────────────────────────
	protected.Post("/api/admin/seed-renovaciones", func(c *fiber.Ctx) error {
		migrations.SeedRenovaciones()
		return c.JSON(fiber.Map{"ok": true, "message": "Seed de Renovaciones ejecutado correctamente"})
	})
	protected.Post("/api/admin/seed-automatizacion-ia", func(c *fiber.Ctx) error {
		migrations.SeedAutomatizacionIA()
		return c.JSON(fiber.Map{"ok": true, "message": "Seed de Automatización IA ejecutado correctamente"})
	})
}
