package controllers

import (
	"fmt"
	"net/http"
	"strconv"

	"learnsteam/learsteam-quiz-api/internal/models"
	"learnsteam/learsteam-quiz-api/internal/services"

	"github.com/gin-gonic/gin"
)

type UserController interface {
	List(*gin.Context)
	Find(*gin.Context)
}

type userController struct {
	service      services.UserService
	tokenService services.TokenService
}

func NewUserController(service services.UserService, tokenService services.TokenService) UserController {
	return &userController{
		service:      service,
		tokenService: tokenService,
	}
}

// User List
//
// @Summary 		사용자 목록 가져오기
// @Description 사용자 목록을 가져옵니다.
// @Tags 				User
// @Accept json
// @Produce json
//
// @Param q query string false "검색어"
// @Param page query int false "페이지"
// @Param limit query int false "페이지 사이즈"
//
// @Success 200 {object} models.UserListResponse
// @Router /user  [get]
func (controller *userController) List(c *gin.Context) {
	q := c.DefaultQuery("q", "")
	page, err := strconv.Atoi(c.DefaultQuery("page", "1"))
	if err != nil {
		fmt.Println("error : page")
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	limit, err := strconv.Atoi(c.DefaultQuery("limit", "10"))
	if err != nil {
		fmt.Println("error : limit")
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	result, err := controller.service.List(q, page, limit)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	totalNumber, err := controller.service.Total(q)
	if err != nil {
		fmt.Println("error : list")
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	totalPage := int64(totalNumber/int64(limit) + 1)

	response := models.UserListResponse{
		Data:      *result,
		Total:     totalPage,
		Page:      page,
		TotalPage: totalPage,
		PageSize:  limit,
	}

	c.JSON(http.StatusOK, response)

	c.JSON(http.StatusOK, response)
}

// Get User
//
// @Summary 		사용자 정보 가져오기
// @Description	ID로 사용자 정보를 가져옵니다.
// @Tags 				User
// @Accept json
// @Produce json
//
// @Param id path string true "사용자 ID"
//
// @Success 200 {object} models.User
// @Router /user/{id} [get]
func (controller *userController) Find(c *gin.Context) {
	id := c.Param("id")
	user_id := c.GetString("sub")
	fmt.Println("id", id)
	fmt.Println("user_id", user_id)

	if user_id != id {
		c.JSON(http.StatusBadRequest, gin.H{"error": "Wrong user"})
		return
	}

	result, err := controller.service.Find(id)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, result)
}
