package handler

import (
	"kemendagri/sipd/services/master-sipd/controllers"
	"log"
	"strconv"

	"github.com/go-playground/validator/v10"
	"github.com/gofiber/fiber/v2"
)

type SubKegiatanHandler struct {
	Controller *controllers.SubKegiatanController
	Validate   *validator.Validate
}

func NewSubKegiatanHandler(app *fiber.App, vld *validator.Validate, controller *controllers.SubKegiatanController) {
	handler := &SubKegiatanHandler{
		Controller: controller,
		Validate:   vld,
	}

	// public route
	rpub := app.Group("/subkegiatan")
	rpub.Get("/", handler.Index)
	rpub.Get("/:id/:tahun", handler.View)
	// rpub.Post("/", handler.Create)
	// rpub.Put("/:id", handler.Update)
	// rpub.Delete("/:id", handler.Delete)
}

// Index func for get lists of Sub Kegiatan.
//
//	@Summary		get lists of Sub Kegiatan
//	@Description	get lists of Sub Kegiatan
//	@Tags			Master Sub Kegiatan
//	@Accept			json
//	@Param			page	query	int		false	"Halaman yang ditampilkan"
//	@Param			limit	query	int		false	"Jumlah data per halaman, maksimal 50 data"
//	@param			filter	query	string	false	"Key value pencarian ([kode_sub_kegiatan,nama_sub_kegiatan,tahun,daerah_khusus,jenis_pemda]). Contoh: kode_sub_kegiatan.1.01.02.1.01.01 -> (akan menampilkan data dengan kode sub kegiatan = '1.01.02.1.01.01')"
//	@Produce		json
//	@success		200	{array}		models.MstSubKegiatanModel	"Success"
//	@Failure		400	{object}	utils.RequestError			"Bad request"
//	@Failure		401	{object}	utils.RequestError			"Unauthorized"
//	@Failure		404	{object}	utils.RequestError			"Not found"
//	@Failure		422	{array}		utils.RequestError			"Data validation failed"
//	@Failure		500	{object}	utils.RequestError			"Server error"
//	@Router			/subkegiatan [get]
func (h *SubKegiatanHandler) Index(c *fiber.Ctx) error {

	page, err := strconv.Atoi(c.Query("page", "1"))
	if err != nil {
		return err
	}
	log.Println("page: ", page)

	var limit int
	limit, err = strconv.Atoi(c.Query("limit", "20"))
	if err != nil {
		return err
	}
	log.Println("page: ", page)

	//limit max 50
	if limit > 50 {
		limit = 50
	}

	resp, totalCount, pageCount, err := h.Controller.Index(page, limit, c.Query("filter", ""))

	if err != nil {
		return err
	}

	log.Printf("totalCount: %d, perPage: %d, pageCount: %d\n", totalCount, limit, pageCount)

	c.Append("x-pagination-total-count", strconv.Itoa(totalCount))
	c.Append("x-pagination-page-count", strconv.Itoa(pageCount))
	c.Append("x-pagination-page-size", strconv.Itoa(limit))
	if page > 1 {
		c.Append("x-pagination-previous-page", strconv.Itoa(page-1))
	}
	c.Append("x-pagination-current-page", strconv.Itoa(page))
	if page < pageCount {
		c.Append("x-pagination-next-page", strconv.Itoa(page+1))
	}

	return c.JSON(resp)

}

// Index func for get detail of Sub Kegiatan.
//
//	@Summary		get detail of Sub Kegiatan
//	@Description	get detail of Sub Kegiatan
//	@Tags			Master Sub Kegiatan
//	@Accept			json
//	@Param			id		path	int	false	"data yang dipilih berdasarkan id sub kegiatan"
//	@Param			tahun	path	int	false	"data yang dipilih berdasarkan tahun"
//	@Produce		json
//	@success		200	{object}	models.MstSubKegiatanDetilModel	"Success"
//	@Failure		400	{object}	utils.RequestError				"Bad request"
//	@Failure		401	{object}	utils.RequestError				"Unauthorized"
//	@Failure		404	{object}	utils.RequestError				"Not found"
//	@Failure		422	{array}		utils.RequestError				"Data validation failed"
//	@Failure		500	{object}	utils.RequestError				"Server error"
//	@Router			/subkegiatan/{id}/{tahun} [get]
func (h *SubKegiatanHandler) View(c *fiber.Ctx) error {
	id, err := c.ParamsInt("id", 0)
	if err != nil {
		return err
	}

	tahun, err := c.ParamsInt("tahun", 0)
	if err != nil {
		return err
	}

	resp, err := h.Controller.View(id, tahun)

	if err != nil {
		return err
	}

	return c.JSON(resp)
}

// // Create func for create new daerah.
// //
// //	@Summary		create new daerah
// //	@Description	create new daerah.
// //	@Tags			Ref Daerah
// //	@Accept			json
// //	@Param			payload	body	models.RefDaerahModelPayload	true	"Payload"
// //	@Produce		json
// //	@success		200	{object}	bool						"Create success"
// //	@Failure		400	{object}	utils.RequestError			"Bad request"
// //	@Failure		401	{object}	utils.RequestError			"Unauthorized"
// //	@Failure		404	{object}	utils.RequestError			"Not found"
// //	@Failure		422	{array}		utils.DataValidationError	"Data validation failed"
// //	@Failure		500	{object}	utils.RequestError			"Server error"
// //	@Security		ApiKeyAuth
// //	@Router			/daerah [post]
// func (h *DaerahHandler) Create(c *fiber.Ctx) error {
// 	// siapkan penampung payload dari fe
// 	payloadl := new(models.RefDaerahModelPayload)

// 	// baca kiriman dari fe
// 	err := c.BodyParser(payloadl)
// 	if err != nil {
// 		return err
// 	}

// 	// Validate form input
// 	err = h.Validate.Struct(payloadl)
// 	if err != nil {
// 		return err
// 	}

// 	err = h.Controller.Create(*payloadl)
// 	if err != nil {
// 		return err
// 	}

// 	return c.JSON("true")
// }

// // Create func for update daerah.
// //
// //	@Summary		update daerah
// //	@Description	update daerah.
// //	@Tags			Ref Daerah
// //	@Accept			json
// //	@Param			id		path	int								false	"data yang dipilih untuk diubah berdasarkan id daerah"
// //	@Param			payload	body	models.RefDaerahModelPayload	true	"Payload"
// //	@Produce		json
// //	@success		200	{object}	bool						"Update success"
// //	@Failure		400	{object}	utils.RequestError			"Bad request"
// //	@Failure		401	{object}	utils.RequestError			"Unauthorized"
// //	@Failure		404	{object}	utils.RequestError			"Not found"
// //	@Failure		422	{array}		utils.DataValidationError	"Data validation failed"
// //	@Failure		500	{object}	utils.RequestError			"Server error"
// //	@Security		ApiKeyAuth
// //	@Router			/daerah/{id} [put]
// func (h *DaerahHandler) Update(c *fiber.Ctx) error {
// 	id, err := c.ParamsInt("id", 0)
// 	if err != nil {
// 		return err
// 	}

// 	// siapkan penampung payload dari fe
// 	payloadl := new(models.RefDaerahModelPayload)

// 	// baca kiriman dari fe
// 	err = c.BodyParser(payloadl)
// 	if err != nil {
// 		return err
// 	}

// 	// Validate form input
// 	err = h.Validate.Struct(payloadl)
// 	if err != nil {
// 		return err
// 	}

// 	err = h.Controller.Update(id, *payloadl)
// 	if err != nil {
// 		return err
// 	}

// 	return c.JSON("true")
// }

// // Create func for delete daerah.
// //
// //	@Summary		delete daerah
// //	@Description	delete daerah.
// //	@Tags			Ref Daerah
// //	@Accept			json
// //	@Param			id	path	int	false	"data yang dipilih untuk dihapus berdasarkan id daerah"
// //	@Produce		json
// //	@success		200	{object}	bool						"Delete success"
// //	@Failure		400	{object}	utils.RequestError			"Bad request"
// //	@Failure		401	{object}	utils.RequestError			"Unauthorized"
// //	@Failure		404	{object}	utils.RequestError			"Not found"
// //	@Failure		422	{array}		utils.DataValidationError	"Data validation failed"
// //	@Failure		500	{object}	utils.RequestError			"Server error"
// //	@Security		ApiKeyAuth
// //	@Router			/daerah/{id} [delete]
// func (h *DaerahHandler) Delete(c *fiber.Ctx) error {
// 	id, err := c.ParamsInt("id", 0)
// 	if err != nil {
// 		return err
// 	}

// 	err = h.Controller.Delete(id)
// 	if err != nil {
// 		return err
// 	}

// 	return c.JSON("true")
// }
