package User

import (
	"net/http"

	dto "astrology-api/dto/astrology"
	"astrology-api/helpers"
	"astrology-api/services"

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

///////////////////////////////////////////////////////////
// Numerology Controller
///////////////////////////////////////////////////////////

type NumerologyController struct {
	service services.NumerologyService
}

func NewNumerologyController(service services.NumerologyService) *NumerologyController {
	return &NumerologyController{service: service}
}

///////////////////////////////////////////////////////////
// Report
///////////////////////////////////////////////////////////

func (c *NumerologyController) Report(ctx *gin.Context) {

	var request dto.NumerologyRequest

	if err := ctx.ShouldBindJSON(&request); err != nil {

		ctx.JSON(http.StatusBadRequest, helpers.ErrorResponse(err.Error()))

		return
	}

	userID := ctx.MustGet("user_id").(uint)

	response, err := c.service.Report(userID, request)

	if err != nil {

		ctx.JSON(http.StatusBadRequest, helpers.ErrorResponse(err.Error()))

		return
	}

	ctx.JSON(
		http.StatusOK,
		helpers.SuccessResponse("Numerology report fetched successfully.", response),
	)
}

///////////////////////////////////////////////////////////
// Day Number
///////////////////////////////////////////////////////////

func (c *NumerologyController) DayNumber(ctx *gin.Context) {

	var request dto.DayNumberRequest

	if err := ctx.ShouldBindJSON(&request); err != nil {

		ctx.JSON(http.StatusBadRequest, helpers.ErrorResponse(err.Error()))

		return
	}

	userID := ctx.MustGet("user_id").(uint)

	response, err := c.service.DayNumber(userID, request)

	if err != nil {

		ctx.JSON(http.StatusBadRequest, helpers.ErrorResponse(err.Error()))

		return
	}

	ctx.JSON(
		http.StatusOK,
		helpers.SuccessResponse("Day number fetched successfully.", response),
	)
}

///////////////////////////////////////////////////////////
// Numero Table
///////////////////////////////////////////////////////////

func (c *NumerologyController) Table(ctx *gin.Context) {

	var request dto.NumeroTableRequest

	if err := ctx.ShouldBindJSON(&request); err != nil {

		ctx.JSON(http.StatusBadRequest, helpers.ErrorResponse(err.Error()))

		return
	}

	userID := ctx.MustGet("user_id").(uint)

	response, err := c.service.Table(userID, request)

	if err != nil {

		ctx.JSON(http.StatusBadRequest, helpers.ErrorResponse(err.Error()))

		return
	}

	ctx.JSON(
		http.StatusOK,
		helpers.SuccessResponse("Numerology table fetched successfully.", response),
	)
}

///////////////////////////////////////////////////////////
// Radical Number
///////////////////////////////////////////////////////////

func (c *NumerologyController) RadicalNumber(ctx *gin.Context) {

	var request dto.RadicalNumberRequest

	if err := ctx.ShouldBindJSON(&request); err != nil {

		ctx.JSON(http.StatusBadRequest, helpers.ErrorResponse(err.Error()))

		return
	}

	response, err := c.service.RadicalNumber(request)

	if err != nil {

		ctx.JSON(http.StatusBadRequest, helpers.ErrorResponse(err.Error()))

		return
	}

	ctx.JSON(
		http.StatusOK,
		helpers.SuccessResponse("Radical number details fetched successfully.", response),
	)
}
