package routes

import (
	"net/http"

	"github.com/gofiber/fiber/v2"
	"github.com/sujit-baniya/fiber-boilerplate/rest/controllers"
	apiControllers "github.com/sujit-baniya/fiber-boilerplate/rest/controllers/api"
	"github.com/sujit-baniya/fiber-boilerplate/rest/middlewares"
)

func UserRoutes(app fiber.Router) {
	protected := app.Group("/app").
		Use(
			middlewares.AuthWeb(),          // Middleware de autenticación
			middlewares.LoadUserMiddleware, // Middleware para cargar el usuario
		)

		// Rutas de la aplicación

		// web me redireccione a /
	protected.Get("/web", func(c *fiber.Ctx) error { return c.Redirect("/", http.StatusSeeOther) })
	app.Get("/web", func(c *fiber.Ctx) error { return c.Redirect("/", http.StatusSeeOther) })
	protected.Get("/", controllers.App)
	protected.Get("/dashboard", middlewares.MenuMiddleware, controllers.Dashboard)
	protected.Get("/modules", middlewares.MenuMiddleware, controllers.Modules) // Renderizar la vista
	protected.Get("/loadmodules", controllers.GetModules)                      // Obtener todos los módulos
	protected.Post("/modules", controllers.CreateModule)                       // Crear un nuevo módulo
	protected.Put("/modules/:id", controllers.UpdateModule)                    // Actualizar un módulo existente
	protected.Delete("/modules/:id", controllers.DeleteModule)                 // Eliminar un módulo

	// Rutas de roles
	protected.Get("/roles", middlewares.MenuMiddleware, controllers.Roles) // Renderizar la vista
	protected.Get("/loadroles", controllers.GetRoles)                      // Obtener todos
	protected.Post("/roles", controllers.CreateRole)                       // Crear
	protected.Put("/roles/:id", controllers.UpdateRole)                    // Actualizar
	protected.Delete("/roles/:id", controllers.DeleteRole)                 // Eliminar

	// Rutas de módulos
	protected.Get("/submodules", middlewares.MenuMiddleware, controllers.Submodules) // Renderizar la vista
	protected.Get("/loadsubmodules", controllers.GetSubmodules)                      // Obtener todos los módulos
	protected.Post("/submodules", controllers.CreateSubmodule)                       // Crear un nuevo módulo
	protected.Put("/submodules/:id", controllers.UpdateSubmodule)                    // Actualizar un módulo existente
	protected.Delete("/submodules/:id", controllers.DeleteSubmodule)                 // Eliminar un módulo

	// Rutas de usuarios
	protected.Get("/users", middlewares.MenuMiddleware, controllers.Users) // Renderizar la vista
	protected.Get("/loadusers", controllers.GetUsers)                      // Obtener
	protected.Post("/users", controllers.CreateUser)                       // Crear
	protected.Put("/users/:id", controllers.UpdateUser)                    // Actualizar
	protected.Put("/password/:id", controllers.UpdatePassword)             // Actualizar
	protected.Delete("/users/:id", controllers.DeleteUser)                 // Eliminar
	protected.Get("/user/:id", controllers.GetUser)                        // Buscar un usuario

	// Rutas de conexiones ssh
	protected.Get("/conexion_ssh", middlewares.MenuMiddleware, controllers.ConxSsh) // Renderizar la vista
	protected.Get("/loadconexionssh", controllers.GetConxSsh)                       // Obtener
	protected.Post("/conexionssh", controllers.CreateConxSsh)                       // Crear
	protected.Put("/conexionssh/:id", controllers.UpdateConxSsh)                    // Actualizar
	protected.Delete("/conexionssh/:id", controllers.DeleteConxSsh)                 // Eliminar

	// Rutas de conexiones db
	protected.Get("/conexion_db", middlewares.MenuMiddleware, controllers.ConxDb) // Renderizar la vista
	protected.Get("/loadconexiondb", controllers.GetConxDb)                       // Obtener
	protected.Post("/conexiondb", controllers.CreateConxDb)                       // Crear
	protected.Put("/conexiondb/:id", controllers.UpdateConxDb)                    // Actualizar
	protected.Delete("/conexiondb/:id", controllers.DeleteConxDb)                 // Eliminar

	// Rutas de servidor
	protected.Get("/servidor", middlewares.MenuMiddleware, controllers.Servidor)
	protected.Get("/loadservidorselect", controllers.GetServidor)
	protected.Get("/loadservidor", controllers.GetServidor)
	protected.Post("/servidor", controllers.CreateServidor)
	protected.Put("/servidor/:id", controllers.UpdateServidor)
	protected.Delete("/servidor/:id", controllers.DeleteServidor)

	// Rutas de proveedores de servidor
	protected.Get("/prov_servidor", middlewares.MenuMiddleware, controllers.ProvServidor)
	protected.Get("/loadprovservidor", controllers.GetProvServidor)
	protected.Post("/provservidor", controllers.CreateProvServidor)
	protected.Put("/provservidor/:id", controllers.UpdateProvServidor)
	protected.Delete("/provservidor/:id", controllers.DeleteProvServidor)

	// Rutas de tipos de servidor
	protected.Get("/tipo_servidor", middlewares.MenuMiddleware, controllers.TipoServidor)
	protected.Get("/loadtiposervidor", controllers.GetTipoServidor)
	protected.Post("/tiposervidor", controllers.CreateTipoServidor)
	protected.Put("/tiposervidor/:id", controllers.UpdateTipoServidor)
	protected.Delete("/tiposervidor/:id", controllers.DeleteTipoServidor)

	// Rutas de tipo db
	protected.Get("/tipo_db", middlewares.MenuMiddleware, controllers.TipoDb)
	protected.Get("/loadtipodb", controllers.GetTipoDb)
	protected.Post("/tipodb", controllers.CreateTipoDb)
	protected.Put("/tipodb/:id", controllers.UpdateTipoDb)
	protected.Delete("/tipodb/:id", controllers.DeleteTipoDb)

	// ─── Módulo de Renovaciones / Contratos ──────────────────────────
	RenovacionesRoutes(protected)

	// ─── Seed manual (admin) ────────────────────────────────────────────
	protected.Get("/run-seed", controllers.RunSeed)
	// ─── Query Runner (editor SQL) ────────────────────────────────────────────
	protected.Get("/query-runner", middlewares.MenuMiddleware, controllers.QueryRunnerPage)
	protected.Get("/query-runner/connections", controllers.GetConxDbList)
	protected.Get("/query-runner/databases", controllers.GetDatabases)
	protected.Get("/query-runner/tables", controllers.GetTables)
	protected.Get("/query-runner/test", controllers.TestConnection)
	protected.Post("/query-runner/run", controllers.RunQuery)
	protected.Get("/query-runner/history", controllers.GetHistory)
	protected.Delete("/query-runner/history", controllers.ClearHistory)
	protected.Post("/query-runner/export/csv", controllers.ExportCSV)
	protected.Post("/query-runner/export/json", controllers.ExportJSON)
	// ─── Hostinger API ────────────────────────────────────────────────
	protected.Get("/hostinger", middlewares.MenuMiddleware, controllers.HostingerConfigPage)
	protected.Post("/hostinger/config", controllers.SaveHostingerConfig)
	protected.Get("/hostinger/vps", controllers.GetHostingerVPS)
	protected.Get("/hostinger/domains", controllers.GetHostingerDomains)
	protected.Get("/hostinger/dns/:domain", controllers.GetHostingerDNS)
	protected.Get("/hostinger/orders", controllers.GetHostingerOrders)
	protected.Get("/hostinger/hosting", controllers.GetHostingerHosting)

	// ─── Cloudflare API ───────────────────────────────────────────────
	protected.Get("/cloudflare", middlewares.MenuMiddleware, controllers.CloudflareConfigPage)
	protected.Post("/cloudflare/config", controllers.SaveCloudflareConfig)
	protected.Get("/cloudflare/verify", controllers.VerifyCloudflareToken)
	protected.Post("/cloudflare/clean-token", controllers.CleanCloudflareToken)
	protected.Get("/cloudflare/user", controllers.GetCloudflareUser)
	protected.Get("/cloudflare/zones", controllers.GetCloudflareZones)
	protected.Get("/cloudflare/zones/:zone_id/dns", controllers.GetCloudflareDNS)
	protected.Post("/cloudflare/zones/:zone_id/dns", controllers.CreateCloudflareDNS)
	protected.Put("/cloudflare/zones/:zone_id/dns/:record_id", controllers.UpdateCloudflareDNS)
	protected.Patch("/cloudflare/zones/:zone_id/dns/:record_id", controllers.PatchCloudflareDNS)
	protected.Delete("/cloudflare/zones/:zone_id/dns/:record_id", controllers.DeleteCloudflareDNS)
	protected.Get("/cloudflare/zones/:zone_id/ssl", controllers.GetCloudflareSSL)
	protected.Get("/cloudflare/zones/:zone_id/firewall", controllers.GetCloudflareFirewall)

	// ─── Pasarelas de Pago ────────────────────────────────────────────
	protected.Get("/pasarelas-pago", middlewares.MenuMiddleware, controllers.PasarelasPage)
	// Bold
	protected.Get("/pasarelas/bold/config", controllers.GetBoldConfigAPI)
	protected.Post("/pasarelas/bold/save", controllers.SaveBoldConfig)
	protected.Get("/pasarelas/bold/logs", controllers.BoldWebhookLogs)
	protected.Get("/pasarelas/bold/callbacks", controllers.BoldCallbackLogs)
	// dLocal
	protected.Get("/pasarelas/dlocal/config", controllers.GetDlocalConfigAPI)
	protected.Post("/pasarelas/dlocal/save", controllers.SaveDlocalConfigWeb)
	protected.Get("/pasarelas/dlocal/logs", controllers.DlocalPaymentLogs)
	protected.Post("/pasarelas/dlocal/registro-pago", apiControllers.DlocalRegistrarPago)
	// Bold API (crear link, consultar estado)
	protected.Post("/pasarelas/bold/crear-link", apiControllers.BoldCreatePaymentLink)
	protected.Get("/pasarelas/bold/link/:linkID", apiControllers.BoldGetLinkStatus)

	// ─── Productos SaaS ──────────────────────────────────────────────────────
	protected.Get("/saas", middlewares.MenuMiddleware, controllers.SaasIndex)
	protected.Get("/loadsaas", controllers.GetSaasProductos)
	protected.Post("/saas", controllers.CreateSaasProducto)
	protected.Put("/saas/:id", controllers.UpdateSaasProducto)
	protected.Delete("/saas/:id", controllers.DeleteSaasProducto)

	// ─── Documentación: categorías globales ──────────────────────────────────
	protected.Get("/doc/categorias", middlewares.MenuMiddleware, controllers.DocCategoriasIndex)
	protected.Get("/doc/loadcategorias", controllers.GetDocCategorias)
	protected.Post("/doc/categorias", controllers.CreateDocCategoria)
	protected.Put("/doc/categorias/:id", controllers.UpdateDocCategoria)
	protected.Delete("/doc/categorias/:id", controllers.DeleteDocCategoria)

	// ─── Documentación: páginas ───────────────────────────────────────────────
	protected.Get("/doc/paginas", middlewares.MenuMiddleware, controllers.DocPaginasIndex)
	protected.Get("/doc/loadpaginas", controllers.GetDocPaginas)
	protected.Get("/doc/paginas/:id", controllers.GetDocPaginaDetalle)
	protected.Post("/doc/paginas", controllers.CreateDocPagina)
	protected.Put("/doc/paginas/:id", controllers.UpdateDocPagina)
	protected.Delete("/doc/paginas/:id", controllers.DeleteDocPagina)

	// ─── Documentación: lectura privada (usuario logueado) ───────────────────
	protected.Get("/docs/:saas", middlewares.MenuMiddleware, controllers.DocsPrivadoIndex)
	protected.Get("/docs/:saas/:slug", middlewares.MenuMiddleware, controllers.DocsPrivadaPagina)

	// ─── Integraciones SaaS (dispatcher de pagos) ─────────────────────────────
	protected.Get("/saas-api", middlewares.MenuMiddleware, controllers.SaasApiIndex)
	protected.Get("/loadsaasapi", controllers.GetSaasApiConfigs)
	protected.Post("/saas-api", controllers.CreateSaasApiConfig)
	protected.Put("/saas-api/:id", controllers.UpdateSaasApiConfig)
	protected.Delete("/saas-api/:id", controllers.DeleteSaasApiConfig)

	// Logs de despacho
	protected.Get("/saas-api/logs", middlewares.MenuMiddleware, controllers.SaasDispatchLogIndex)
	protected.Get("/loadsaasdispatchlogs", controllers.GetSaasDispatchLogs)

	// ─── Planes dLocal (gestión desde panel protegido) ────────────────────────
	protected.Get("/dlocal/planes", apiControllers.SeePlanes)
	protected.Post("/dlocal/planes", apiControllers.CreatePlan)
	protected.Get("/dlocal/planes/:planID", apiControllers.SeePlan)
	protected.Patch("/dlocal/planes/:planID", apiControllers.UpdatedPlan)
	protected.Patch("/dlocal/planes/:planID/subscription/:subscriptionId/deactivate", apiControllers.DeactivatePlan)
}
