package controller

import (
	"strconv"

	"gitlab.com/mbugroup/lti-api.git/internal/modules/production/chickins/dto"
	service "gitlab.com/mbugroup/lti-api.git/internal/modules/production/chickins/services"
	validation "gitlab.com/mbugroup/lti-api.git/internal/modules/production/chickins/validations"
	"gitlab.com/mbugroup/lti-api.git/internal/response"

	"github.com/gofiber/fiber/v2"
)

type ChickinController struct {
	ChickinService service.ChickinService
}

func NewChickinController(chickinService service.ChickinService) *ChickinController {
	return &ChickinController{
		ChickinService: chickinService,
	}
}

// func (u *ChickinController) GetAll(c *fiber.Ctx) error {
// 	query := &validation.Query{
// 		Page:                  c.QueryInt("page", 1),
// 		Limit:                 c.QueryInt("limit", 10),
// 		ProjectFlockKandangId: uint(c.QueryInt("project_flock_kandang_id", 0)),
// 	}

// 	result, totalResults, err := u.ChickinService.GetAll(c, query)
// 	if err != nil {
// 		return err
// 	}

// 	return c.Status(fiber.StatusOK).
// 		JSON(response.SuccessWithPaginate[dto.ChickinListDTO]{
// 			Code:    fiber.StatusOK,
// 			Status:  "success",
// 			Message: "Get all chickins successfully",
// 			Meta: response.Meta{
// 				Page:         query.Page,
// 				Limit:        query.Limit,
// 				TotalPages:   int64(math.Ceil(float64(totalResults) / float64(query.Limit))),
// 				TotalResults: totalResults,
// 			},
// 			Data: dto.ToChickinListDTOs(result),
// 		})
// }

// func (u *ChickinController) GetOne(c *fiber.Ctx) error {
// 	param := c.Params("id")

// 	id, err := strconv.Atoi(param)
// 	if err != nil {
// 		return fiber.NewError(fiber.StatusBadRequest, "Invalid Id")
// 	}

// 	result, err := u.ChickinService.GetOne(c, uint(id))
// 	if err != nil {
// 		return err
// 	}

// 	return c.Status(fiber.StatusOK).
// 		JSON(response.Success{
// 			Code:    fiber.StatusOK,
// 			Status:  "success",
// 			Message: "Get chickin successfully",
// 			Data:    dto.ToChickinListDTO(*result),
// 		})
// }

func (u *ChickinController) CreateOne(c *fiber.Ctx) error {
	req := new(validation.Create)

	if err := c.BodyParser(req); err != nil {
		return fiber.NewError(fiber.StatusBadRequest, "Invalid request body")
	}

	results, err := u.ChickinService.CreateOne(c, req)
	if err != nil {
		return err
	}

	var (
		data    interface{}
		message = "Create chickin successfully"
	)
	if len(results) == 1 {
		data = dto.ToChickinListDTO(results[0])
	} else {
		message = "Create chickins successfully"
		data = dto.ToChickinListDTOs(results)
	}

	return c.Status(fiber.StatusCreated).
		JSON(response.Success{
			Code:    fiber.StatusCreated,
			Status:  "success",
			Message: message,
			Data:    data,
		})
}

func (u *ChickinController) GetOne(c *fiber.Ctx) error {
	param := c.Params("id")

	id, err := strconv.Atoi(param)
	if err != nil {
		return fiber.NewError(fiber.StatusBadRequest, "Invalid Id")
	}

	result, err := u.ChickinService.GetOne(c, uint(id))
	if err != nil {
		return err
	}

	return c.Status(fiber.StatusOK).
		JSON(response.Success{
			Code:    fiber.StatusOK,
			Status:  "success",
			Message: "Get chickin successfully",
			Data:    dto.ToChickinDetailDTO(*result),
		})
}

// func (u *ChickinController) UpdateOne(c *fiber.Ctx) error {
// 	req := new(validation.Update)
// 	param := c.Params("id")

// 	id, err := strconv.Atoi(param)
// 	if err != nil {
// 		return fiber.NewError(fiber.StatusBadRequest, "Invalid Id")
// 	}

// 	if err := c.BodyParser(req); err != nil {
// 		return fiber.NewError(fiber.StatusBadRequest, "Invalid request body")
// 	}

// 	result, err := u.ChickinService.UpdateOne(c, req, uint(id))
// 	if err != nil {
// 		return err
// 	}

// 	return c.Status(fiber.StatusOK).
// 		JSON(response.Success{
// 			Code:    fiber.StatusOK,
// 			Status:  "success",
// 			Message: "Update chickin successfully",
// 			Data:    dto.ToChickinListDTO(*result),
// 		})
// }

func (u *ChickinController) DeleteOne(c *fiber.Ctx) error {
	param := c.Params("id")

	id, err := strconv.Atoi(param)
	if err != nil {
		return fiber.NewError(fiber.StatusBadRequest, "Invalid Id")
	}

	if err := u.ChickinService.DeleteOne(c, uint(id)); err != nil {
		return err
	}

	return c.Status(fiber.StatusOK).
		JSON(response.Common{
			Code:    fiber.StatusOK,
			Status:  "success",
			Message: "Delete chickin successfully",
		})
}

func (u *ChickinController) Approval(c *fiber.Ctx) error {
	req := new(validation.Approve)

	if err := c.BodyParser(req); err != nil {
		return fiber.NewError(fiber.StatusBadRequest, "Invalid request body")
	}

	results, err := u.ChickinService.Approval(c, req)
	if err != nil {
		return err
	}

	var (
		data    interface{}
		message = "Submit chickin approval successfully"
	)
	if len(results) == 1 {
		data = dto.ToChickinListDTO(results[0])
	} else {
		message = "Submit chickin approvals successfully"
		data = dto.ToChickinListDTOs(results)
	}

	return c.Status(fiber.StatusOK).
		JSON(response.Success{
			Code:    fiber.StatusOK,
			Status:  "success",
			Message: message,
			Data:    data,
		})
}
