package order

import (
	entity "git.gocasts.ir/ebhomengo/niki/domain/order/entity"
	order "git.gocasts.ir/ebhomengo/niki/domain/order/service"
	richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"
	"github.com/labstack/echo/v4"
	"net/http"
	"time"
)

type Handler struct {
	orderSvc *order.Service
}

func New(orderSvc order.Service) *Handler {
	return &Handler{orderSvc: &orderSvc}
}

func (h *Handler) CreateOrderHandler(c echo.Context) error {
	var req CreateOrderRequest
	if err := c.Bind(&req); err != nil {
		msg, code := getErrorDataFromRichError(err)
		return echo.NewHTTPError(code, msg)
	}

	orderItems := req.OrderItems
	order := entity.Order{
		ID:            0,
		UserID:        req.UserID,
		TotalAmount:   req.TotalAmount,
		TotalDiscount: req.TotalDiscount,
		ShippingID:    req.ShippingID,
		PaymentMethod: req.PaymentMethod,
		ProcessStatus: entity.WaitingToPay,
		PaymentStatus: entity.UnPaid,
		AddressID:     req.AddressID,
		CreatedAt:     time.Now(),
		UpdatedAt:     time.Now(),
	}
	resp, lErr := h.orderSvc.CreateOrder(order, orderItems)

	if lErr != nil {
		msg, code := getErrorDataFromRichError(lErr)
		return echo.NewHTTPError(code, msg)
	}
	return c.JSON(http.StatusOK, resp)
}

func getErrorDataFromRichError(err error) (message string, code int) {
	switch err.(type) {
	case richerror.RichError:
		re := err.(richerror.RichError)

		return re.Message(), mapKindToCode(re.Kind())
	default:
		return err.Error(), http.StatusBadRequest
	}
}

func mapKindToCode(kind richerror.Kind) int {
	switch kind {
	case richerror.KindInvalid:
		return http.StatusUnprocessableEntity
	default:
		return http.StatusBadRequest
	}
}
