package handlers

import (
	"fmt"

	"github.com/gin-gonic/gin"
	"github.com/jackc/pgx/v5/pgxpool"
	"ticketing-backend/internal/services"
	"ticketing-backend/internal/utils"
)

type PromoHandler struct {
	pool         *pgxpool.Pool
	promoService *services.PromoService
}

func NewPromoHandler(pool *pgxpool.Pool, promoService *services.PromoService) *PromoHandler {
	return &PromoHandler{pool: pool, promoService: promoService}
}

// ValidatePromo - POST /api/promos/validate
func (h *PromoHandler) ValidatePromo(c *gin.Context) {
	userID, _ := c.Get("userId")
	userEmail, _ := c.Get("email")

	var req struct {
		Code       string  `json:"code" binding:"required"`
		EventID    string  `json:"eventId" binding:"required"`
		Amount     float64 `json:"amount" binding:"required"`
	}
	if err := c.ShouldBindJSON(&req); err != nil {
		utils.BadRequest(c, "Invalid request")
		return
	}

	validation, err := h.promoService.ValidatePromoCode(req.Code, userID.(string), userEmail.(string), req.EventID, req.Amount)
	if err != nil {
		utils.InternalError(c, "Failed to validate promo")
		return
	}

	utils.Success(c, gin.H{"validation": validation})
}

// CheckDomainPromo - GET /api/promos/domain
func (h *PromoHandler) CheckDomainPromo(c *gin.Context) {
	userEmail, _ := c.Get("email")
	eventID := c.Query("eventId")
	amount := c.Query("amount")

	var originalAmount float64
	if amount != "" {
		fmt.Sscanf(amount, "%f", &originalAmount)
	}

	validation, err := h.promoService.CheckDomainPromo(userEmail.(string), eventID, originalAmount)
	if err != nil {
		utils.Success(c, gin.H{"validation": map[string]interface{}{"valid": false, "discountAmount": 0, "finalAmount": originalAmount}})
		return
	}

	utils.Success(c, gin.H{"validation": validation})
}
