package handlers

import (
	"hamster-tycoon/storage/dao"
	"hamster-tycoon/storage/model"
	"hamster-tycoon/storage/validators"
	"hamster-tycoon/utils"
	"net/http"

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

func (hc *handlersContext) getAllCages(c *gin.Context) {
	cages, err := hc.db.GetAllCages()
	if err != nil {
		utils.GetLoggerFromCtx(c).WithError(err).Error("error while getting cages")
		utils.JSONErrorWithMessage(c.Writer, model.ErrInternalServer, "Error while getting cages")
		return
	}
	utils.JSON(c.Writer, http.StatusOK, cages)
}

func (hc *handlersContext) getACage(c *gin.Context) {
	cageID := c.Param("cageID")

	err := hc.validator.VarCtx(c, cageID, "uuid4")
	if err != nil {
		utils.JSONError(c.Writer, validators.NewDataValidationAPIError(err))
		return
	}

	cage, err := hc.db.GetCageByID(cageID)
	if e, ok := err.(*dao.Error); ok {
		switch {
		case e.Type == dao.ErrTypeNotFound:
			utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "Cage not found")
			return
		default:
			utils.GetLoggerFromCtx(c).WithError(err).WithField("type", e.Type).Error("error GetCage: get cage error type not handled")
			utils.JSONError(c.Writer, model.ErrInternalServer)
			return
		}
	} else if err != nil {
		utils.GetLoggerFromCtx(c).WithError(err).Error("error while get cage")
		utils.JSONError(c.Writer, model.ErrInternalServer)
		return
	}

	if cage == nil {
		utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "Cage not found")
		return
	}

	utils.JSON(c.Writer, http.StatusOK, cage)
}
