package controller

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

type SellerProductController struct {
	Controller
	productUseCase product_usecase.ProductUseCase
}

func NewSellerProductController(uc product_usecase.ProductUseCase) *SellerProductController {
	return &SellerProductController{
		productUseCase: uc,
	}
}

// AddProduct godoc
// @Summary Add product
// @Tags Seller Product
// @ID seller-add-product
// @Accept json
// @Produce json
// @Param json body entity.AddSellerProductRequest true "Product data"
// @Success 200 {object} entity.AddSellerProductResponse
// @Success 401 {object} entity.Response
// @Failure 400 {object} entity.Response
// @Router /seller/product [post]
// @Security BearerAuth
// @Security ApiVersion
// @Security AppVersion
// @Security AppPlatform
func (h *SellerProductController) AddProduct(ctx *gin.Context) {
	var request entity.AddSellerProductRequest
	if h.WrapBindAndValidate(ctx, &request) {
		res, err := h.productUseCase.CreateProduct(h.GetLoggedUser(ctx), &request)
		h.WrapResponse(ctx, res, err)
	}
}

// UpdateProduct godoc
// @Summary Update product
// @Description Update product name, stock, img...
// @Tags Seller Product
// @ID seller-update-product
// @Accept json
// @Produce json
// @param id path integer true "Product ID"
// @Param json body entity.UpdateSellerProductRequest true "Product update data"
// @Success 200 {object} entity.UpdateSellerProductResponse
// @Success 401 {object} entity.Response
// @Failure 400 {object} entity.Response
// @Router /seller/product/{id} [post]
// @Security BearerAuth
// @Security ApiVersion
// @Security AppVersion
// @Security AppPlatform
func (h *SellerProductController) UpdateProduct(ctx *gin.Context) {
	var request entity.UpdateSellerProductRequest
	if h.WrapBindAndValidate(ctx, &request) {
		err := h.productUseCase.UpdateProduct(h.GetLoggedUser(ctx), h.GetParamIdInt64(ctx), &request)
		h.WrapResponse(ctx, err == nil, err)
	}
}

// DeleteProduct godoc
// @Summary DeleteProduct
// @Description delete product
// @Tags Seller Product
// @ID seller-delete-product
// @Accept json
// @Produce json
// @param id path integer true "Product ID"
// @Success 200 {object} entity.DeleteSellerProductResponse
// @Success 401 {object} entity.Response
// @Failure 400 {object} entity.Response
// @Router /seller/product/{id} [delete]
// @Security BearerAuth
// @Security ApiVersion
// @Security AppVersion
// @Security AppPlatform
func (h *SellerProductController) DeleteProduct(ctx *gin.Context) {
	err := h.productUseCase.DeleteProduct(h.GetLoggedUser(ctx), h.GetParamIdInt64(ctx))
	h.WrapResponse(ctx, err == nil, err)
}

// GetProduct godoc
// @Summary Get product detail for seller
// @Tags Seller Product
// @ID seller-product-detail
// @Accept json
// @Produce json
// @Param id path integer true "Product ID"
// @Success 200 {object} entity.GetSellerProductsResponse
// @Failure 400 {object} entity.Response
// @Router /seller/product/{id} [get]
// @Security BearerAuth
// @Security ApiVersion
// @Security AppVersion
// @Security AppPlatform
func (h *SellerProductController) GetProduct(ctx *gin.Context) {
	res, err := h.productUseCase.GetSellerProduct(h.GetLoggedUser(ctx), h.GetParamIdInt64(ctx))
	h.WrapResponse(ctx, res, err)
}

// GetProducts godoc
// @Summary Get product list
// @Tags Seller Product
// @ID seller-product-list
// @Accept json
// @Produce json
// @param status query integer false "filter by status"
// @param name query string false "filter by product name"
// @param store_id query integer false "filter by store id"
// @param apartment_id query integer false "filter by apartment id"
// @param stock_greater query integer false "query item has stock greater than a number"
// @param stock_less_than query integer false "query item has stock less than a number"
// @Success 200 {object} entity.GetSellerProductsResponse
// @Success 401 {object} entity.Response
// @Failure 400 {object} entity.Response
// @Router /seller/product [get]
// @Security BearerAuth
// @Security ApiVersion
// @Security AppVersion
// @Security AppPlatform
func (h *SellerProductController) GetProducts(ctx *gin.Context) {
	status := h.GetQueryInt(ctx, "status")
	filter := product_repository.ProductFilter{}

	if status == _const.ProductStatusPending || status == _const.ProductStatusAvailable {
		filter.Status = []int{status}
	} else {
		filter.Status = []int{_const.ProductStatusPending, _const.ProductStatusAvailable}
	}

	if value, _ := h.QueryInt(ctx, "store_id"); value != 0 {
		filter.StoreId = int64(value)
	}

	if value, has := h.QueryInt(ctx, "stock_greater"); has {
		filter.StockGreater = &value
	}

	if value, _ := h.QueryInt(ctx, "apartment_id"); value != 0 {
		filter.ApartmentId = int64(value)
	}

	if value, has := h.QueryInt(ctx, "stock_less_than"); has {
		filter.StockLessThan = &value
	}
	if value := ctx.Query("name"); value != "" {
		filter.Name = value
	}

	res, err := h.productUseCase.GetSellerProducts(h.GetLoggedUser(ctx), &filter)
	h.WrapResponse(ctx, res, err)
}
