package controller

import (
	_const "chonho/const"
	"chonho/internal/api-v1/repository/product_repository"
	"chonho/internal/api-v1/usecase/product_usecase"
	_error "chonho/pkg/c_error"
	"github.com/gin-gonic/gin"
	"strconv"
)

type ProductController struct {
	Controller
	productUseCase product_usecase.ProductUseCase
}

func NewProductController(uc product_usecase.ProductUseCase) *ProductController {
	return &ProductController{
		productUseCase: uc,
	}
}

// ListProduct godoc
// @Summary Get product list
// @Tags Product
// @ID product-list
// @Accept json
// @Produce json
// @Param user_id query string false "Filter by User ID"
// @Param store_id query string false "Filter by Store ID"
// @Param category_id query string false "Filter by Category ID"
// @Param apartment_id query string false "Filter by Apartment ID"
// @Success 200 {object} entity.ListProductResponse
// @Success 401 {object} entity.Response
// @Failure 400 {object} entity.Response
// @Router /product [get]
// @Security ApiVersion
// @Security AppVersion
// @Security AppPlatform
func (c *ProductController) ListProduct(ctx *gin.Context) {
	var filter product_repository.ProductFilter

	sellerId, exist := ctx.GetQuery("seller_id")
	if exist {
		filter.SellerId, _ = strconv.ParseInt(sellerId, 10, 64)
	}

	storeId, exist := ctx.GetQuery("store_id")
	if exist {
		filter.StoreId, _ = strconv.ParseInt(storeId, 10, 64)
	}

	categoryId, exist := ctx.GetQuery("category_id")
	if exist {
		filter.CategoryId, _ = strconv.ParseInt(categoryId, 10, 64)
	}

	apartmentId, exist := ctx.GetQuery("apartment_id")
	if exist {
		filter.ApartmentId, _ = strconv.ParseInt(apartmentId, 10, 64)
	}
	filter.IgnoreDeleted = true
	data, err := c.productUseCase.GetProducts(filter)
	if err != nil {
		c.Failure(ctx, err)
	} else {
		c.Success(ctx, data)
	}
}

// GetProduct godoc
// @Summary Get product detail
// @Tags Product
// @ID product
// @Accept json
// @Produce json
// @Param id path int true "Product ID"
// @Success 200 {object} entity.GetProductResponse
// @Success 401 {object} entity.Response
// @Failure 400 {object} entity.Response
// @Router /product/{id} [get]
// @Security ApiVersion
// @Security AppVersion
// @Security AppPlatform
func (c *ProductController) GetProduct(ctx *gin.Context) {
	id, _ := strconv.ParseInt(ctx.Param("id"), 10, 64)
	if id < 1 {
		c.Failure(ctx, _error.New(_const.StatusBadRequest, "Invalid ID"))
		return
	}
	data, err := c.productUseCase.GetProduct(id)
	if err != nil {
		c.Failure(ctx, err)
	} else {
		c.Success(ctx, data)
	}
}
