package controller

import (
	"chonho/internal/api-v1/entity"
	"chonho/internal/api-v1/repository/store_repository"
	"chonho/internal/api-v1/usecase/store_usecase"
	"chonho/util"
	"github.com/gin-gonic/gin"
	"strconv"
	"strings"
)

type StoreController struct {
	Controller
	storeUseCase store_usecase.StoreUseCase
}

func NewStoreController(u store_usecase.StoreUseCase) *StoreController {
	return &StoreController{
		storeUseCase: u,
	}
}

// ListStore godoc
// @Summary Get store list
// @Tags Store
// @ID store-list
// @Param q query string false "Search"
// @Param category_id query int false "Category ID"
// @Success 200 {object} entity.ListStoreResponse
// @Failure 400 {object} entity.Response
// @Router /store [get]
// @Security ApiVersion
// @Security AppVersion
// @Security AppPlatform
func (c *StoreController) ListStore(ctx *gin.Context) {
	var filter store_repository.StoreFilter
	query, _ := ctx.GetQuery("q")
	if query != "" {
		filter.SearchString = query
		filter.SearchTerms = strings.Fields(util.StripKeywords(query))
	}

	userId, _ := ctx.GetQuery("user_id")
	if userId != "" {
		filter.UserId, _ = strconv.ParseInt(userId, 10, 64)
	}

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

	res, err := c.storeUseCase.ListStoreEntity(filter)
	c.WrapResponse(ctx, res, err)
}

// ListStorePayment godoc
// @Summary Get stores payment info
// @Tags Store
// @ID store-list-payment
// @Param store_ids query string true "store ids, concat by comma, example store_ids=1,3,5"
// @Success 200 {object} entity.ListStorePaymentInfo
// @Failure 400 {object} entity.Response
// @Router /store/payment [get]
// @Security ApiVersion
// @Security AppVersion
// @Security AppPlatform
func (c *StoreController) ListStorePayment(ctx *gin.Context) {
	if storeIds, has := ctx.GetQuery("store_ids"); has {
		splitIdArr := strings.Split(storeIds, ",")
		idsArr := make([]int64, 0)
		for _, id := range splitIdArr {
			if value, err := strconv.ParseInt(id, 10, 64); err == nil {
				idsArr = append(idsArr, value)
			}
		}
		data, err := c.storeUseCase.ListStorePayment(store_repository.StoreFilter{
			StoreIds: idsArr,
		})
		c.WrapResponse(ctx, data, err)
	} else {
		c.Success(ctx, []entity.StorePaymentInfo{})
	}
}

// GetStore godoc
// @Summary Get store detail
// @Tags Store
// @ID store-detail
// @Param id path int true "Store ID"
// @Success 200 {object} entity.GetStoreResponse
// @Failure 400 {object} entity.Response
// @Router /store/{id} [get]
// @Security ApiVersion
// @Security AppVersion
// @Security AppPlatform
func (c *StoreController) GetStore(ctx *gin.Context) {
	res, err := c.storeUseCase.GetStoreEntity(c.GetParamIdInt64(ctx))
	c.WrapResponse(ctx, res, err)
}

// RateStore godoc
// @Summary Rating a store
// @Tags Store
// @ID store-rating
// @Param id path int true "Store ID"
// @param json body entity.RateStore true "rating data"
// @Success 200 {object} entity.Response
// @Failure 400 {object} entity.Response
// @Router /store/{id}/rate [post]
// @Security BearerAuth
// @Security ApiVersion
// @Security AppVersion
// @Security AppPlatform
func (c *StoreController) RateStore(ctx *gin.Context) {
	if id := c.WrapReadIDFromPath(ctx); id != 0 {
		var rate entity.RateStore
		if c.WrapBindAndValidate(ctx, &rate) {
			err := c.storeUseCase.RateStore(id, c.GetLoggedUser(ctx).Id, &rate)
			c.WrapResponse(ctx, nil, err)
		}
	}
}
