package controller

import (
	"chonho/internal/api-v1/entity"
	"strconv"

	"chonho/internal/api-v1/usecase/store_usecase"
	"github.com/gin-gonic/gin"
)

type SellerStoreController struct {
	Controller
	storeUseCase store_usecase.StoreUseCase
}

func NewSellerStoreController(u store_usecase.StoreUseCase) *SellerStoreController {
	return &SellerStoreController{
		storeUseCase: u,
	}
}

// CreateStore godoc
// @Summary Create store
// @Tags Seller Store
// @ID user-store-create
// @Accept json
// @Produce json
// @Param json body entity.StoreCreateRequest true "Store data"
// @Success 200 {object} entity.StoreCreateResponse
// @Failure 400 {object} entity.Response
// @Router /seller/store [post]
// @Security BearerAuth
// @Security ApiVersion
// @Security AppVersion
// @Security AppPlatform
func (h *SellerStoreController) CreateStore(ctx *gin.Context) {
	var request entity.StoreCreateRequest
	if h.WrapBindAndValidate(ctx, &request) {
		res, err := h.storeUseCase.CreateStore(h.GetLoggedUser(ctx), &request, ctx)
		h.WrapResponse(ctx, res, err)
	}
}

// GetStore godoc
// @Summary Get store detail
// @Tags Seller Store
// @ID user-store-detail
// @Accept json
// @Produce json
// @Param id path integer true "Store ID"
// @Success 200 {object} entity.UserSingleStoreResponse
// @Failure 400 {object} entity.Response
// @Router /seller/store/{id} [get]
// @Security BearerAuth
// @Security ApiVersion
// @Security AppVersion
// @Security AppPlatform
func (h *SellerStoreController) GetStore(ctx *gin.Context) {
	idParams := ctx.Param("id")
	id, err := strconv.Atoi(idParams)
	if err != nil {
		h.Failure(ctx, err)
	} else {
		data, err := h.storeUseCase.SellerStoreDetail(h.GetLoggedUser(ctx).Id, int64(id), ctx)
		h.WrapResponse(ctx, data, err)
	}
}

// UpdateStore godoc
// @Summary Update store detail
// @Tags Seller Store
// @ID user-store-update
// @Accept json
// @Produce json
// @Param id path integer true "Store ID"
// @Param json body entity.StoreCreateRequest true "Store new info"
// @Success 200 {object} entity.Response
// @Failure 400 {object} entity.Response
// @Router /seller/store/{id} [post]
// @Security BearerAuth
// @Security ApiVersion
// @Security AppVersion
// @Security AppPlatform
func (h *SellerStoreController) UpdateStore(ctx *gin.Context) {
	if id := h.WrapReadIDFromPath(ctx); id != 0 {
		var request entity.StoreCreateRequest
		if h.WrapBindAndValidate(ctx, &request) {
			err := h.storeUseCase.UpdateStore(h.GetLoggedUser(ctx).Id, id, &request, ctx)
			h.WrapResponse(ctx, nil, err)
		}
	}
}

// ListStore godoc
// @Summary List user stores
// @Description return list stores of user
// @Tags Seller Store
// @ID user-store-list
// @Accept json
// @Produce json
// @Success 200 {object} entity.UserStoreResponse
// @Failure 400 {object} entity.Response
// @Router /seller/store [get]
// @Security BearerAuth
// @Security ApiVersion
// @Security AppVersion
// @Security AppPlatform
func (h *SellerStoreController) ListStore(ctx *gin.Context) {
	user := h.GetLoggedUser(ctx)
	data, err := h.storeUseCase.SellerListStore(user.Id, ctx)
	h.WrapResponse(ctx, data, err)
}
