package controllers

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

// PasarelasPage renderiza la vista unificada de pasarelas de pago.
func PasarelasPage(c *fiber.Ctx) error {
	boldCfg, _ := models.GetBoldConfig()
	dlocalCfg, _ := models.GetLastActiveDlocalApi()

	data := fiber.Map{
		"Title":   "Pasarelas de Pago",
		"Bold":    boldCfg,
		"Dlocal":  dlocalCfg,
		"user":    c.Locals("user"),
		"modules": c.Locals("userModules"),
	}
	if err := c.Render("pasarelas_pago", data, "layouts/main"); err != nil {
		return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
	}
	return nil
}

// ─── Bold ─────────────────────────────────────────────────────────────────────

// SaveBoldConfig guarda o actualiza la configuración de Bold.
func SaveBoldConfig(c *fiber.Ctx) error {
	type body struct {
		ID            uint   `json:"id"             form:"id"`
		ApiKeyProd    string `json:"api_key_prod"    form:"api_key_prod"`
		SecretKeyProd string `json:"secret_key_prod" form:"secret_key_prod"`
		ApiKeyTest    string `json:"api_key_test"    form:"api_key_test"`
		SecretKeyTest string `json:"secret_key_test" form:"secret_key_test"`
		Modo          string `json:"modo"            form:"modo"`
		CallbackUrl   string `json:"callback_url"    form:"callback_url"`
		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.Modo == "" {
		b.Modo = "test"
	}

	cfg := models.BoldConfig{
		ApiKeyProd:    b.ApiKeyProd,
		SecretKeyProd: b.SecretKeyProd,
		ApiKeyTest:    b.ApiKeyTest,
		SecretKeyTest: b.SecretKeyTest,
		Modo:          b.Modo,
		CallbackUrl:   b.CallbackUrl,
		Nota:          b.Nota,
	}
	cfg.ID = b.ID

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

// GetBoldConfig devuelve la configuración activa de Bold (para cargar el form).
func GetBoldConfigAPI(c *fiber.Ctx) error {
	cfg, err := models.GetBoldConfig()
	if err != nil {
		return c.JSON(fiber.Map{"data": nil})
	}
	return c.JSON(fiber.Map{"data": cfg})
}

// ─── dLocal ───────────────────────────────────────────────────────────────────

// SaveDlocalConfig guarda o actualiza la configuración de dLocal.
func SaveDlocalConfigWeb(c *fiber.Ctx) error {
	type body struct {
		ID                 uint   `json:"id"                    form:"id"`
		AccessKeyID        string `json:"access_key_id"         form:"access_key_id"`
		AccessKeySecret    string `json:"access_key_secret"     form:"access_key_secret"`
		AccessKeyIDdev     string `json:"access_key_id_dev"     form:"access_key_id_dev"`
		AccessKeySecretdev string `json:"access_key_secret_dev" form:"access_key_secret_dev"`
		UrlProd            string `json:"url_prod"              form:"url_prod"`
		UrlDev             string `json:"url_dev"               form:"url_dev"`
		Modo               string `json:"modo"                  form:"modo"`
	}
	var b body
	if err := c.BodyParser(&b); err != nil {
		return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "body inválido"})
	}
	if b.Modo == "" {
		b.Modo = "dev"
	}

	cfg := models.DlocalApi{
		AccessKeyID:        b.AccessKeyID,
		AccessKeySecret:    b.AccessKeySecret,
		AccessKeyIDdev:     b.AccessKeyIDdev,
		AccessKeySecretdev: b.AccessKeySecretdev,
		UrlProd:            b.UrlProd,
		UrlDev:             b.UrlDev,
		Modo:               b.Modo,
		IsActive:           true,
	}
	cfg.ID = b.ID

	// Desactivar configs previas
	if cfg.ID == 0 {
		if err := models.CreateDlocalApi(&cfg); err != nil {
			return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
		}
	} else {
		if err := models.UpdateDlocalApi(&cfg); err != nil {
			return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
		}
	}
	return c.JSON(fiber.Map{"message": "Configuración dLocal guardada"})
}

// GetDlocalConfigAPI devuelve la configuración activa de dLocal.
func GetDlocalConfigAPI(c *fiber.Ctx) error {
	cfg, err := models.GetLastActiveDlocalApi()
	if err != nil {
		return c.JSON(fiber.Map{"data": nil})
	}
	return c.JSON(fiber.Map{"data": cfg})
}

// ─── Logs Bold ────────────────────────────────────────────────────────────────

// BoldWebhookLogs devuelve los logs de notificaciones con paginación y filtro por tipo.
// Query params: page (default 1), limit (default 25), tipo (SALE_APPROVED|SALE_REJECTED|...|TODOS)
func BoldWebhookLogs(c *fiber.Ctx) error {
	page := c.QueryInt("page", 1)
	limit := c.QueryInt("limit", 25)
	tipo := c.Query("tipo", "")
	if page < 1 {
		page = 1
	}
	logs, total, err := models.GetBoldWebhookLogsPaginated(page, limit, tipo)
	if err != nil {
		return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
	}
	return c.JSON(fiber.Map{
		"data":  logs,
		"total": total,
		"page":  page,
		"limit": limit,
	})
}

// BoldCallbackLogs devuelve los intentos de pago (visitas al callback) con paginación y filtro.
// Query params: page (default 1), limit (default 25), estado (pendiente|pagado|fallido|revertido|TODOS)
func BoldCallbackLogs(c *fiber.Ctx) error {
	page := c.QueryInt("page", 1)
	limit := c.QueryInt("limit", 25)
	estado := c.Query("estado", "")
	if page < 1 {
		page = 1
	}
	logs, total, err := models.GetBoldCallbackLogsPaginated(page, limit, estado)
	if err != nil {
		return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
	}
	return c.JSON(fiber.Map{
		"data":  logs,
		"total": total,
		"page":  page,
		"limit": limit,
	})
}

// ─── Logs dLocal ──────────────────────────────────────────────────────────────

// DlocalPaymentLogs devuelve los últimos 100 registros de pagos de dLocal.
func DlocalPaymentLogs(c *fiber.Ctx) error {
	logs, err := models.GetDlocalPaymentLogs(100)
	if err != nil {
		return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
	}
	return c.JSON(fiber.Map{"data": logs})
}
