package handlers

import (
	"net/http"
	"strconv"

	"github.com/gin-gonic/gin"

	"github.com/ren/econ/backend/internal/models"
	"github.com/ren/econ/backend/internal/repository"
)

type ContenidoHandler struct {
	contenidoRepo *repository.ContenidoRepository
}

func NewContenidoHandler(contenidoRepo *repository.ContenidoRepository) *ContenidoHandler {
	return &ContenidoHandler{contenidoRepo: contenidoRepo}
}

// GetModulos godoc
// @Summary Listar módulos
// @Description Lista todos los módulos disponibles
// @Tags contenido
// @Produce json
// @Security BearerAuth
// @Success 200 {array} models.ModuloResumen
// @Router /api/contenido/modulos [get]
func (h *ContenidoHandler) GetModulos(c *gin.Context) {
	modulos, err := h.contenidoRepo.GetModulos(c.Request.Context())
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "Error al obtener módulos"})
		return
	}

	if modulos == nil {
		modulos = []models.ModuloResumen{}
	}

	c.JSON(http.StatusOK, modulos)
}

// GetModulo godoc
// @Summary Obtener contenido de módulo
// @Description Obtiene el contenido de un módulo específico
// @Tags contenido
// @Produce json
// @Security BearerAuth
// @Param numero path int true "Número del módulo"
// @Success 200 {object} models.Modulo
// @Router /api/contenido/modulos/{numero} [get]
func (h *ContenidoHandler) GetModulo(c *gin.Context) {
	moduloNumero, err := strconv.Atoi(c.Param("numero"))
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "Número de módulo inválido"})
		return
	}

	modulo, err := h.contenidoRepo.GetModulo(c.Request.Context(), moduloNumero)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "Error al obtener módulo"})
		return
	}

	if modulo == nil || len(modulo.Ejercicios) == 0 {
		c.JSON(http.StatusNotFound, gin.H{"error": "Módulo no encontrado"})
		return
	}

	c.JSON(http.StatusOK, modulo)
}
