package controller

import (
	"chonho/internal/api-v1/entity"
	"chonho/internal/api-v1/repository/order_repository"
	"chonho/internal/api-v1/usecase/seller_order_usecase"
	"chonho/util"
	"fmt"
	"github.com/gin-gonic/gin"
	"strconv"
	"time"
)

type SellerOrderController struct {
	Controller
	sOrderUseCase seller_order_usecase.SellerOrderUseCase
}

func NewSellerOrderController(uc seller_order_usecase.SellerOrderUseCase) *SellerOrderController {
	return &SellerOrderController{
		sOrderUseCase: uc,
	}
}

// ListSellerOrder godoc
// @Summary Get seller order list
// @Tags Seller Order
// @ID seller-order-list
// @Accept json
// @Produce json
// @param status query string false "filter by status, multi status separate by comma"
// @param group_status query integer false "filter by group of status, pending is new order, delivering is the confirmed orders , and complete is orders have been delivered"
// @param payment_status query string false "filter by product name"
// @param store_id query integer false "filter by store id"
// @param created_from query string false "created from date"
// @param created_to query string false "created to date"
// @param limit query integer false "num of order in response"
// @param page query integer false "paging"
// @Success 200 {object} entity.SellerOrderListResponse
// @Success 401 {object} entity.Response
// @Failure 400 {object} entity.Response
// @Router /seller/order [get]
// @Security BearerAuth
// @Security ApiVersion
// @Security AppVersion
// @Security AppPlatform
func (c *SellerOrderController) ListSellerOrder(ctx *gin.Context) {
	filter := order_repository.SellerOrderFilter{}
	if status := ctx.Query("status"); status != "" {
		filter.Status = util.StringToIntArr(status, ",")
	}

	if groupStatus := ctx.Query("group_status"); groupStatus != "" {
		filter.GroupStatus, _ = strconv.Atoi(groupStatus)
	}

	if status := ctx.Query("payment_status"); status != "" {
		filter.PaymentStatus = util.StringToIntArr(status, ",")
	}

	if storeId := ctx.Query("store_id"); storeId != "" {
		id, _ := strconv.Atoi(storeId)
		filter.StoreId = int64(id)
	}

	if timeString := ctx.Query("created_from"); timeString != "" {
		t, _ := time.Parse("2006-01-02", timeString)
		filter.CreatedFrom = &t
	}

	if timeString := ctx.Query("created_to"); timeString != "" {
		t, _ := time.Parse("2006-01-02", timeString)
		filter.CreatedTo = &t
	}

	if lim := ctx.Query("limit"); lim != "" {
		filter.Limit, _ = strconv.Atoi(lim)
	}

	if page := ctx.Query("page"); page != "" {
		filter.Page, _ = strconv.Atoi(page)
	}
	fmt.Println(filter)
	data, err := c.sOrderUseCase.QuerySellerOrders(c.GetLoggedUser(ctx).Id, filter)
	c.WrapResponse(ctx, data, err)

}

// SellerOrderDetail godoc
// @Summary Get seller order detail
// @Tags Seller Order
// @ID seller-order-detail
// @Accept json
// @Produce json
// @param id path integer false "Order ID"
// @Success 200 {object} entity.SellerOrderDetailResponse
// @Success 401 {object} entity.Response
// @Failure 400 {object} entity.Response
// @Router /seller/order/{id} [get]
// @Security BearerAuth
// @Security ApiVersion
// @Security AppVersion
// @Security AppPlatform
func (c *SellerOrderController) SellerOrderDetail(ctx *gin.Context) {
	if orderId := c.WrapReadIDFromPath(ctx); orderId != 0 {
		data, err := c.sOrderUseCase.QuerySellerOrderDetail(c.GetLoggedUser(ctx).Id, orderId)
		c.WrapResponse(ctx, data, err)
	}
}

// CancelOrder godoc
// @Summary Change order status
// @Tags Seller Order
// @ID seller-order-change-status
// @Accept json
// @Produce json
// @param id path integer false "Order ID"
// @Success 200 {object} entity.Response
// @Success 401 {object} entity.Response
// @Failure 400 {object} entity.Response
// @Failure 503 {object} entity.Response
// @Router /seller/order/{id}/cancel [post]
// @Security BearerAuth
// @Security ApiVersion
// @Security AppVersion
// @Security AppPlatform
func (c *SellerOrderController) CancelOrder(ctx *gin.Context) {
	if orderID := c.WrapReadIDFromPath(ctx); orderID != 0 {
		err := c.sOrderUseCase.CancelOrder(c.GetLoggedUser(ctx).Id, orderID)
		c.WrapResponse(ctx, nil, err)

	}
}

// ConfirmOrders godoc
// @Summary Seller confirm order will be delivered
// @Tags Seller Order
// @ID seller-order-confirm
// @Accept json
// @Produce json
// @param id path integer false "Order ID"
// @Param json body entity.OrderConfirmRequest false "json body"
// @Success 200 {object} entity.Response
// @Success 401 {object} entity.Response
// @Failure 400 {object} entity.Response
// @Failure 503 {object} entity.Response
// @Router /seller/order/{id}/confirm [post]
// @Security BearerAuth
// @Security ApiVersion
// @Security AppVersion
// @Security AppPlatform
func (c *SellerOrderController) ConfirmOrders(ctx *gin.Context) {
	if orderID := c.WrapReadIDFromPath(ctx); orderID != 0 {
		var body entity.OrderConfirmRequest
		c.BindStruct(ctx, &body)
		err := c.sOrderUseCase.ConfirmOrder(c.GetLoggedUser(ctx).Id, orderID, &body)
		c.WrapResponse(ctx, nil, err)
	}
}

// ConfirmOrdersPayment godoc
// @Summary Seller confirm order payment
// @Tags Seller Order
// @ID seller-order-confirm-payment
// @Accept json
// @Produce json
// @param id path integer false "Order ID"
// @Success 200 {object} entity.Response
// @Success 401 {object} entity.Response
// @Failure 400 {object} entity.Response
// @Failure 503 {object} entity.Response
// @Router /seller/order/{id}/confirm-payment [post]
// @Security BearerAuth
// @Security ApiVersion
// @Security AppVersion
// @Security AppPlatform
func (c *SellerOrderController) ConfirmOrdersPayment(ctx *gin.Context) {
	if orderID := c.WrapReadIDFromPath(ctx); orderID != 0 {
		err := c.sOrderUseCase.ConfirmOrderPayment(c.GetLoggedUser(ctx).Id, orderID)
		c.WrapResponse(ctx, nil, err)
	}
}

// ConfirmDelivered godoc
// @Summary seller confirm the package delivered
// @Tags Seller Order
// @ID seller-order-confirm-delivered
// @Accept json
// @Produce json
// @param id path integer false "Order ID"
// @Param json body entity.OrderDeliveredRequest false "json body"
// @Success 200 {object} entity.Response
// @Success 401 {object} entity.Response
// @Failure 400 {object} entity.Response
// @Failure 503 {object} entity.Response
// @Router /seller/order/{id}/delivered [post]
// @Security BearerAuth
// @Security ApiVersion
// @Security AppVersion
// @Security AppPlatform
func (c *SellerOrderController) ConfirmDelivered(ctx *gin.Context) {
	if orderID := c.WrapReadIDFromPath(ctx); orderID != 0 {
		var body entity.OrderDeliveredRequest
		c.BindStruct(ctx, &body)
		err := c.sOrderUseCase.ConfirmOrderDelivered(c.GetLoggedUser(ctx).Id, orderID, &body)
		c.WrapResponse(ctx, nil, err)
	}
}
