package handlers

import (
	"net/http"
	"strconv"

	"github.com/labstack/echo/v4"

	"github.com/treytartt/honeydue-api/internal/apperrors"
	"github.com/treytartt/honeydue-api/internal/services"
)

// TaskTemplateHandler handles task template endpoints
type TaskTemplateHandler struct {
	templateService *services.TaskTemplateService
}

// NewTaskTemplateHandler creates a new task template handler
func NewTaskTemplateHandler(templateService *services.TaskTemplateService) *TaskTemplateHandler {
	return &TaskTemplateHandler{
		templateService: templateService,
	}
}

// GetTemplates handles GET /api/tasks/templates/
// Returns all active task templates as a flat list
func (h *TaskTemplateHandler) GetTemplates(c echo.Context) error {
	templates, err := h.templateService.GetAll()
	if err != nil {
		return err
	}

	return c.JSON(http.StatusOK, templates)
}

// GetTemplatesGrouped handles GET /api/tasks/templates/grouped/
// Returns all templates grouped by category
func (h *TaskTemplateHandler) GetTemplatesGrouped(c echo.Context) error {
	grouped, err := h.templateService.GetGrouped()
	if err != nil {
		return err
	}

	return c.JSON(http.StatusOK, grouped)
}

// SearchTemplates handles GET /api/tasks/templates/search/
// Searches templates by query string
func (h *TaskTemplateHandler) SearchTemplates(c echo.Context) error {
	query := c.QueryParam("q")
	if query == "" {
		return apperrors.BadRequest("error.query_required")
	}

	if len(query) < 2 {
		return apperrors.BadRequest("error.query_too_short")
	}

	templates, err := h.templateService.Search(query)
	if err != nil {
		return err
	}

	return c.JSON(http.StatusOK, templates)
}

// GetTemplatesByCategory handles GET /api/tasks/templates/by-category/:category_id/
// Returns templates for a specific category
func (h *TaskTemplateHandler) GetTemplatesByCategory(c echo.Context) error {
	categoryID, err := strconv.ParseUint(c.Param("category_id"), 10, 32)
	if err != nil {
		return apperrors.BadRequest("error.invalid_id")
	}

	templates, err := h.templateService.GetByCategory(uint(categoryID))
	if err != nil {
		return err
	}

	return c.JSON(http.StatusOK, templates)
}

// GetTemplate handles GET /api/tasks/templates/:id/
// Returns a single template by ID
func (h *TaskTemplateHandler) GetTemplate(c echo.Context) error {
	id, err := strconv.ParseUint(c.Param("id"), 10, 32)
	if err != nil {
		return apperrors.BadRequest("error.invalid_id")
	}

	template, err := h.templateService.GetByID(uint(id))
	if err != nil {
		return err
	}

	return c.JSON(http.StatusOK, template)
}
