package dto

import (
	"github.com/UpmeshLTD/urus-aio/infrastructure/common"
	"github.com/UpmeshLTD/urus-aio/infrastructure/db/entities"
	"github.com/UpmeshLTD/urus-aio/infrastructure/utils"
)

type PaidOrder struct {
	ID                   string   `json:"id"`
	CartID               string   `json:"cartId"`
	ShippingGroupID      *string  `json:"shippingGroupId"`
	IsArrangedShip       bool     `json:"isArrangedShip"`
	IsFulfilled          bool     `json:"isFulfilled"`
	IncorrectInformation []string `json:"incorrectInformation"`
	FulfillmentID        *string  `json:"fulfillmentId"`
	ShipmentID           *string  `json:"shipmentId"`

	Status entities.OrderStatus `json:"status"`
}

type GetPaidOrdersRequest struct {
	Draft bool `form:"draft,default=true"`
	common.Pagination
}

type GetPaidOrdersResponse struct {
	Data  []*PaidOrder `json:"data"`
	Total int64        `json:"total"`
}

type ArrangeShipRequest struct {
	PaidOrders []ArrangeShipRequestPaidOrder `json:"paidOrders"`
}

type ArrangeShipRequestPaidOrder struct {
	CartID          string  `json:"cartId"`
	ShippingGroupID *string `json:"shippingGroupId"`
}

func (v *ArrangeShipRequestPaidOrder) CartShippingGroupKey() string {
	return utils.GenerateKeyFromCartIdAndShippingGroupId(v.CartID, v.ShippingGroupID)
}

type ArrangeShipResponse struct {
	FulfillmentID string `json:"fulfillmentId"`
}

type ArchivePaidOrderRequest struct {
	CartID string `uri:"cartId"`
}

type CreatePaidOrdersRequest struct {
	PaidOrders []struct {
		CartID          string  `json:"cartId"`
		ShippingGroupID *string `json:"shippingGroupId"`
	} `json:"paidOrders"`
}

type GetArrangedShipPaidOrdersRequest struct {
	PaidOrders []struct {
		CartID          string  `json:"cartId"`
		ShippingGroupID *string `json:"shippingGroupId"`
	} `json:"paidOrders"`
}

type ArrangedShipPaidOrder struct {
	ID              string  `json:"id"`
	CartID          string  `json:"cartId"`
	ShippingGroupID *string `json:"shippingGroupId"`
	FulfillmentID   *string `json:"fulfillmentId"`
	ShipmentID      *string `json:"shipmentId"`
}

type GetArrangedShipPaidOrdersResponse struct {
	Data []*ArrangedShipPaidOrder `json:"data"`
}

type CountDraftOrdersResponse struct {
	Count int64 `json:"count"`
}
