package middlewares

import (
	"strings"

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

// AuthServicioPago protege los endpoints públicos de la API de pagos externos
// (/api/v1/pagos-externos/*). Es independiente de la sesión/JWT interna: el
// caller es una aplicación de un tercero que solo tiene un token largo
// (Bearer) y opcionalmente está restringido a una o varias IPs/CIDRs. Si pasa,
// deja el *models.ServicioPagoExterno resuelto en Locals("servicio_pago").
func AuthServicioPago(c *fiber.Ctx) error {
	auth := c.Get("Authorization")
	token := strings.TrimSpace(strings.TrimPrefix(auth, "Bearer "))
	if token == "" || token == auth {
		return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": true, "message": "Falta el header Authorization: Bearer <token>"})
	}

	servicio, err := models.FindServicioPagoExternoActivoByToken(token)
	if err != nil {
		return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": true, "message": "Token inválido o servicio inactivo"})
	}

	if !servicio.IPPermitida(c.IP()) {
		return c.Status(fiber.StatusForbidden).JSON(fiber.Map{"error": true, "message": "IP no autorizada para este servicio"})
	}

	c.Locals("servicio_pago", servicio)
	return c.Next()
}
