package handler

import (
	"lune/talentscale/internal/domain"
	"lune/talentscale/pkg/response"

	"github.com/gofiber/fiber/v2"
	"github.com/google/uuid"
)

type SubscriptionHandler struct {
	usecase domain.SubscriptionUsecase
}

func NewSubscriptionHandler(usecase domain.SubscriptionUsecase) *SubscriptionHandler {
	return &SubscriptionHandler{usecase: usecase}
}

type SubscribeRequest struct {
	PackageID string `json:"package_id"`
}

// Subscribe godoc
// POST /api/v1/subscriptions
func (h *SubscriptionHandler) Subscribe(c *fiber.Ctx) error {
	var req SubscribeRequest
	if err := c.BodyParser(&req); err != nil {
		return response.BadRequest(c, "Invalid request body: "+err.Error())
	}
	if req.PackageID == "" {
		return response.BadRequest(c, "package_id is required")
	}

	val := c.Locals("company_id")
	var companyID uuid.UUID
	if val != nil {
		if idStr, ok := val.(string); ok && idStr != "" {
			parsed, err := uuid.Parse(idStr)
			if err == nil {
				companyID = parsed
			}
		}
	}

	packageID, err := uuid.Parse(req.PackageID)
	if err != nil {
		return response.BadRequest(c, "invalid package_id format")
	}

	sub, err := h.usecase.Subscribe(c.Context(), companyID, packageID)
	if err != nil {
		return response.InternalError(c, err.Error())
	}

	return response.Created(c, "Subscribed successfully", sub)
}

// GetActive godoc
// GET /api/v1/subscriptions/active
func (h *SubscriptionHandler) GetActive(c *fiber.Ctx) error {
	val := c.Locals("company_id")
	var companyID uuid.UUID
	if val != nil {
		if idStr, ok := val.(string); ok && idStr != "" {
			parsed, err := uuid.Parse(idStr)
			if err == nil {
				companyID = parsed
			}
		}
	}

	sub, err := h.usecase.GetActiveSubscription(c.Context(), companyID)
	if err != nil {
		return response.NotFound(c, "No active subscription found")
	}

	return response.OK(c, "Active subscription retrieved", sub)
}
