package handlers

import (
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/google/uuid"

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

type ProgresoHandler struct {
	progresoRepo *repository.ProgresoRepository
}

func NewProgresoHandler(progresoRepo *repository.ProgresoRepository) *ProgresoHandler {
	return &ProgresoHandler{progresoRepo: progresoRepo}
}

// GetProgreso godoc
// @Summary Obtener todo el progreso
// @Description Obtiene todo el progreso del usuario autenticado
// @Tags progreso
// @Produce json
// @Security BearerAuth
// @Success 200 {array} models.Progreso
// @Router /api/progreso [get]
func (h *ProgresoHandler) GetProgreso(c *gin.Context) {
	userID, exists := c.Get("user_id")
	if !exists {
		c.JSON(http.StatusUnauthorized, gin.H{"error": "No autorizado"})
		return
	}

	progresos, err := h.progresoRepo.GetProgresoByUsuarioID(userID.(uuid.UUID))
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "Error al obtener progreso"})
		return
	}

	if progresos == nil {
		progresos = []models.Progreso{}
	}

	c.JSON(http.StatusOK, progresos)
}

// SaveProgreso godoc
// @Summary Guardar/actualizar progreso
// @Description Guarda o actualiza el progreso de un ejercicio
// @Tags progreso
// @Accept json
// @Produce json
// @Param progreso body models.Progreso true "Datos del progreso"
// @Security BearerAuth
// @Success 200 {object} map[string]string
// @Router /api/progreso [post]
func (h *ProgresoHandler) SaveProgreso(c *gin.Context) {
	userID, exists := c.Get("user_id")
	if !exists {
		c.JSON(http.StatusUnauthorized, gin.H{"error": "No autorizado"})
		return
	}

	var progreso models.Progreso
	if err := c.ShouldBindJSON(&progreso); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	progreso.UsuarioID = userID.(uuid.UUID)

	err := h.progresoRepo.SaveProgreso(&progreso)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "Error al guardar progreso: " + err.Error()})
		return
	}

	c.JSON(http.StatusOK, gin.H{"message": "Progreso guardado exitosamente"})
}

// GetResumen godoc
// @Summary Obtener resumen
// @Description Obtiene estadísticas del progreso del usuario (puntos totales, etc.)
// @Tags progreso
// @Produce json
// @Security BearerAuth
// @Success 200 {object} models.ResumenProgreso
// @Router /api/progreso/resumen [get]
func (h *ProgresoHandler) GetResumen(c *gin.Context) {
	userID, exists := c.Get("user_id")
	if !exists {
		c.JSON(http.StatusUnauthorized, gin.H{"error": "No autorizado"})
		return
	}

	resumen, err := h.progresoRepo.GetResumen(userID.(uuid.UUID))
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "Error al obtener resumen"})
		return
	}

	c.JSON(http.StatusOK, resumen)
}
