package controllers

import (
	"github.com/gofiber/fiber/v2"
	"github.com/sujit-baniya/fiber-boilerplate/pkg/models"
	"github.com/sujit-baniya/fiber-boilerplate/pkg/services"
)

// ─── Configuración ────────────────────────────────────────────────────────────

// HostingerConfigPage renderiza la vista de gestión de Hostinger.
func HostingerConfigPage(c *fiber.Ctx) error {
	cfg, _ := models.GetHostingerConfig()
	if err := c.Render("hostinger", fiber.Map{
		"Title":   "Hostinger API",
		"Config":  cfg,
		"user":    c.Locals("user"),
		"modules": c.Locals("userModules"),
	}, "layouts/main"); err != nil {
		return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
	}
	return nil
}

// SaveHostingerConfig guarda o actualiza el token de Hostinger.
func SaveHostingerConfig(c *fiber.Ctx) error {
	type body struct {
		ID    uint   `json:"id" form:"id"`
		Token string `json:"token" form:"token"`
		Nota  string `json:"nota" form:"nota"`
	}
	var b body
	if err := c.BodyParser(&b); err != nil {
		return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "body inválido"})
	}
	if b.Token == "" {
		return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "token requerido"})
	}

	cfg := models.HostingerConfig{
		Nota:  b.Nota,
		Token: b.Token,
	}
	cfg.ID = b.ID

	if err := models.SaveHostingerConfig(cfg); err != nil {
		return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
	}
	return c.JSON(fiber.Map{"message": "Configuración guardada"})
}

// ─── Helpers ─────────────────────────────────────────────────────────────────

func hostingerClient() (*services.HostingerClient, error) {
	cfg, err := models.GetHostingerConfig()
	if err != nil {
		return nil, err
	}
	return services.NewHostingerClient(cfg.Token), nil
}

// ─── Endpoints de datos ───────────────────────────────────────────────────────

// GetHostingerVPS devuelve la lista de VPS/VMs.
func GetHostingerVPS(c *fiber.Ctx) error {
	client, err := hostingerClient()
	if err != nil {
		return c.Status(fiber.StatusServiceUnavailable).JSON(fiber.Map{
			"error": "No se encontró configuración activa de Hostinger",
		})
	}
	data, err := client.GetVPSList()
	if err != nil {
		return c.Status(fiber.StatusBadGateway).JSON(fiber.Map{"error": err.Error()})
	}
	return c.JSON(fiber.Map{"data": data})
}

// GetHostingerDomains devuelve el portafolio de dominios.
func GetHostingerDomains(c *fiber.Ctx) error {
	client, err := hostingerClient()
	if err != nil {
		return c.Status(fiber.StatusServiceUnavailable).JSON(fiber.Map{
			"error": "No se encontró configuración activa de Hostinger",
		})
	}
	data, err := client.GetDomains()
	if err != nil {
		return c.Status(fiber.StatusBadGateway).JSON(fiber.Map{"error": err.Error()})
	}
	return c.JSON(fiber.Map{"data": data})
}

// GetHostingerDNS devuelve los registros DNS de un dominio (:domain).
func GetHostingerDNS(c *fiber.Ctx) error {
	domain := c.Params("domain")
	if domain == "" {
		return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "dominio requerido"})
	}
	client, err := hostingerClient()
	if err != nil {
		return c.Status(fiber.StatusServiceUnavailable).JSON(fiber.Map{
			"error": "No se encontró configuración activa de Hostinger",
		})
	}
	data, err := client.GetDNSRecords(domain)
	if err != nil {
		return c.Status(fiber.StatusBadGateway).JSON(fiber.Map{"error": err.Error()})
	}
	return c.JSON(fiber.Map{"data": data, "domain": domain})
}

// GetHostingerOrders devuelve las órdenes de facturación.
func GetHostingerOrders(c *fiber.Ctx) error {
	client, err := hostingerClient()
	if err != nil {
		return c.Status(fiber.StatusServiceUnavailable).JSON(fiber.Map{
			"error": "No se encontró configuración activa de Hostinger",
		})
	}
	data, err := client.GetOrders()
	if err != nil {
		return c.Status(fiber.StatusBadGateway).JSON(fiber.Map{"error": err.Error()})
	}
	return c.JSON(fiber.Map{"data": data})
}

// GetHostingerHosting devuelve las cuentas de hosting.
func GetHostingerHosting(c *fiber.Ctx) error {
	client, err := hostingerClient()
	if err != nil {
		return c.Status(fiber.StatusServiceUnavailable).JSON(fiber.Map{
			"error": "No se encontró configuración activa de Hostinger",
		})
	}
	data, err := client.GetHostingAccounts()
	if err != nil {
		return c.Status(fiber.StatusBadGateway).JSON(fiber.Map{"error": err.Error()})
	}
	return c.JSON(fiber.Map{"data": data})
}
