package dto

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

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

type CreateDeliveryAddressRequest struct {
	CartID string `json:"cartId" validate:"required"`

	// address
	CountryCode         string  `json:"countryCode" binding:"required"`
	Address1            string  `json:"address1" binding:"required"`
	Address2            string  `json:"address2"`
	PostalCode          string  `json:"postalCode" binding:"required"`
	UnitNumber          string  `json:"unitNumber"`
	SubLevelLocationIDs []int64 `json:"subLevelLocationIds" binding:"required"`

	// delivery info
	RecipientName        string `json:"recipientName" binding:"required"`
	RecipientPhoneNumber string `json:"recipientPhoneNumber" binding:"required"`

	Deactivate *bool `json:"deactivate"`
}

type CreateDeliveryAddressOptionalRequest struct {
	CartID string `json:"cartId" validate:"required"`

	// address
	CountryCode         string  `json:"countryCode"`
	Address1            string  `json:"address1"`
	Address2            string  `json:"address2"`
	PostalCode          string  `json:"postalCode"`
	UnitNumber          string  `json:"unitNumber"`
	SubLevelLocationIDs []int64 `json:"subLevelLocationIds"`

	// delivery info
	RecipientName        string `json:"recipientName"`
	RecipientPhoneNumber string `json:"recipientPhoneNumber"`

	Deactivate *bool `json:"deactivate"`
}

type CreateOrUpdateDeliveryAddressResponse struct {
	CountryCode         string  `json:"countryCode"`
	Address1            string  `json:"address1"`
	Address2            string  `json:"address2"`
	PostalCode          string  `json:"postalCode"`
	UnitNumber          string  `json:"unitNumber"`
	SubLevelLocationIDs []int64 `json:"subLevelLocationIds"`
	Deactivate          bool    `json:"deactivate"`

	AddressID            string `json:"addressId"`
	CartID               string `json:"cartId"`
	Owner                string `json:"owner"`
	RecipientName        string `json:"recipientName"`
	RecipientPhoneNumber string `json:"recipientPhoneNumber"`
}

type SubLevelLocation struct {
	ID                int64  `json:"id"`
	InternationalName string `json:"internationalName"`
	LocalizedName     string `json:"localizedName"`
	ParentID          int64  `json:"parentId"`
}

type DeliveryAddress struct {
	Address1          string              `json:"address1"`
	Address2          string              `json:"address2"`
	PostalCode        string              `json:"postalCode"`
	CountryCode       string              `json:"countryCode"`
	Deactivate        bool                `json:"deactivate"`
	UnitNumber        string              `json:"unitNumber"`
	SubLevelLocations []*SubLevelLocation `json:"subLevelLocations"`

	AddressID            int64  `json:"addressId"`
	CartID               string `json:"cartId"`
	RecipientName        string `json:"recipientName"`
	RecipientPhoneNumber string `json:"recipientPhoneNumber"`
	Version              int64  `json:"version"`
}

type UpdateRecipientNameRequest struct {
	CartID        string `uri:"cartId" swaggerignore:"true"`
	RecipientName string `json:"recipientName" binding:"required"`
	CountryCode   string `json:"countryCode"`
}

type UpdateRecipientPhoneNumberRequest struct {
	CartID               string `uri:"cartId" swaggerignore:"true"`
	RecipientPhoneNumber string `json:"recipientPhoneNumber" binding:"required"`
	CountryCode          string `json:"countryCode"`
}

type UpdateAddressRequest struct {
	CartID              string  `uri:"cartId" swaggerignore:"true"`
	CountryCode         string  `json:"countryCode" binding:"required"`
	Address1            string  `json:"address1" binding:"required"`
	Address2            string  `json:"address2"`
	PostalCode          string  `json:"postalCode" binding:"required"`
	UnitNumber          string  `json:"unitNumber"`
	RecipientName       string  `json:"recipientName" binding:"required"`
	SubLevelLocationIDs []int64 `json:"subLevelLocationIds" binding:"required"`
}

type GetDeliveryAddressLogsRequest struct {
	CartID  string           `uri:"cartId"`
	OrderBy entities.OrderBy `form:"orderBy,default=desc"`
	SortBy  entities.SortBy  `form:"sortBy,default=version"`
}

type GetDeliveryAddressLogsResponse struct {
	Data []*DeliveryAddressLog `json:"data"`
}

type DeliveryAddressLog struct {
	ID                   string              `json:"id"`
	CartID               string              `json:"cartId"`
	Address1             string              `json:"address1"`
	Address2             string              `json:"address2"`
	PostalCode           string              `json:"postalCode"`
	UnitNumber           string              `json:"unitNumber"`
	SubLevelLocations    []*SubLevelLocation `json:"subLevelLocations"`
	RecipientName        string              `json:"recipientName"`
	RecipientPhoneNumber string              `json:"recipientPhoneNumber"`
	Version              int64               `json:"version"`
	CreatedAt            time.Time           `json:"createdAt"`
}
