package handler

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

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

type QuestionHandler struct {
	usecase domain.QuestionUsecase
}

func NewQuestionHandler(usecase domain.QuestionUsecase) *QuestionHandler {
	return &QuestionHandler{usecase: usecase}
}

func (h *QuestionHandler) ListByTestType(c *fiber.Ctx) error {
	testTypeID, _ := uuid.Parse(c.Params("test_type_id"))
	res, err := h.usecase.GetByTestType(c.Context(), testTypeID)
	if err != nil {
		return response.InternalError(c, err.Error())
	}
	return response.OK(c, "Success", res)
}

func (h *QuestionHandler) GetByID(c *fiber.Ctx) error {
	id, _ := uuid.Parse(c.Params("id"))
	res, err := h.usecase.GetByID(c.Context(), id)
	if err != nil {
		return response.NotFound(c, "Question not found")
	}
	return response.OK(c, "Success", res)
}

func (h *QuestionHandler) Create(c *fiber.Ctx) error {
	var q domain.Question
	if err := c.BodyParser(&q); err != nil {
		return response.BadRequest(c, "Invalid request body")
	}

	q.ID = uuid.New()
	
	// Assign IDs to items
	for _, item := range q.Items {
		item.ID = uuid.New()
		item.QuestionID = q.ID
	}
	
	if err := h.usecase.Create(c.Context(), &q); err != nil {
		return response.InternalError(c, err.Error())
	}
	return response.Created(c, "Question created", q)
}

func (h *QuestionHandler) Update(c *fiber.Ctx) error {
	id, _ := uuid.Parse(c.Params("id"))
	var q domain.Question
	if err := c.BodyParser(&q); err != nil {
		return response.BadRequest(c, "Invalid request body")
	}

	q.ID = id
	
	// Assign ID to items if any
	for _, item := range q.Items {
		if item.ID == uuid.Nil {
			item.ID = uuid.New()
		}
		item.QuestionID = q.ID
	}

	if err := h.usecase.Update(c.Context(), &q); err != nil {
		return response.InternalError(c, err.Error())
	}
	return response.OK(c, "Question updated", nil)
}

func (h *QuestionHandler) Delete(c *fiber.Ctx) error {
	id, _ := uuid.Parse(c.Params("id"))
	if err := h.usecase.Delete(c.Context(), id); err != nil {
		return response.InternalError(c, err.Error())
	}
	return response.OK(c, "Question deleted", nil)
}
