package order

import (
	"fmt"
	"fusenapi/constants"
	"fusenapi/model/gmodel"
	"fusenapi/utils/format"
	"strconv"
	"time"
)

type AmountCurrencyReq struct {
	ExchangeRate     int64  `json:"exchange_rate"`     // 换算汇率
	CurrentAmount    int64  `json:"current_amount"`    // 当前金额
	OriginalAmount   int64  `json:"original_amount"`   // 原始金额
	CurrentCurrency  string `json:"current_currency"`  // 当前货币
	OriginalCurrency string `json:"original_currency"` // 原始货币
}

// 汇率换算
func GetAmountCurrency(req *AmountCurrencyReq) gmodel.AmountCurrency {
	if req.CurrentAmount != 0 {
		if req.CurrentCurrency == req.OriginalCurrency {
			req.CurrentAmount = req.OriginalAmount
		} else {
			req.CurrentAmount = req.OriginalAmount * req.ExchangeRate
		}
	}

	return gmodel.AmountCurrency{
		ExchangeRate:     req.ExchangeRate,
		CurrentAmount:    req.CurrentAmount,
		OriginalAmount:   req.OriginalAmount,
		CurrentCurrency:  req.CurrentCurrency,
		OriginalCurrency: req.OriginalCurrency,
	}
}

type GetAmountInfoReq struct {
	ExchangeRate     int64                  `json:"exchange_rate"`
	Initiate         int64                  `json:"initiate"`
	Current          int64                  `json:"current"`
	Change           int64                  `json:"change"`
	ChangeRemark     string                 `json:"change_remark"`
	Metadata         map[string]interface{} `json:"metadata"`
	CurrentCurrency  string                 `json:"current_currency"`
	OriginalCurrency string                 `json:"original_currency"`
}

// Change       AmountCurrency         `json:"change,omitempty"`        // 变动金额
// ChangeRemark string                 `json:"change_remark,omitempty"` // 变动备注
// Current      AmountCurrency         `json:"current"`                 // 当前金额
// Initiate     AmountCurrency         `json:"initiate"`                // 初始金额
// Metadata     map[string]interface{} `json:"metadata"`                // 额外明细

func GetAmountInfo(req GetAmountInfoReq) gmodel.AmountInfo {
	return gmodel.AmountInfo{
		Change: GetAmountCurrency(&AmountCurrencyReq{
			ExchangeRate:     req.ExchangeRate,
			CurrentAmount:    req.Change,
			OriginalAmount:   req.Change,
			CurrentCurrency:  req.OriginalCurrency,
			OriginalCurrency: req.OriginalCurrency,
		}),
		ChangeRemark: req.ChangeRemark,
		Current: GetAmountCurrency(&AmountCurrencyReq{
			ExchangeRate:     req.ExchangeRate,
			CurrentAmount:    req.Current,
			OriginalAmount:   req.Current,
			CurrentCurrency:  req.OriginalCurrency,
			OriginalCurrency: req.OriginalCurrency,
		}),
		Initiate: GetAmountCurrency(&AmountCurrencyReq{
			ExchangeRate:     req.ExchangeRate,
			CurrentAmount:    req.Initiate,
			OriginalAmount:   req.Initiate,
			CurrentCurrency:  req.OriginalCurrency,
			OriginalCurrency: req.OriginalCurrency,
		}),
		Metadata: req.Metadata,
	}
}

type GetAmountCurrencyUSDReq struct {
	ExchangeRate     int64  `json:"exchange_rate"`     // 换算汇率
	CurrentAmount    int64  `json:"current_amount"`    // 当前金额
	OriginalAmount   int64  `json:"original_amount"`   // 原始金额
	CurrentCurrency  string `json:"current_currency"`  // 当前货币
	OriginalCurrency string `json:"original_currency"` // 原始货币
}

// 处理金额(元)
func GetAmountCurrencyFormat(req *gmodel.AmountCurrency, withThousandthPercentile bool) (res gmodel.AmountCurrency) {
	var currentAmount = format.CentitoDollarStr(req.CurrentAmount.(float64))
	if withThousandthPercentile {
		currentAmount = format.NumToStringWithThousandthPercentile(currentAmount)
	}

	var originalAmount = format.CentitoDollarStr(req.OriginalAmount.(float64))
	if withThousandthPercentile {
		originalAmount = format.NumToStringWithThousandthPercentile(originalAmount)
	}

	return gmodel.AmountCurrency{
		ExchangeRate:     req.ExchangeRate.(float64),
		CurrentAmount:    currentAmount,
		OriginalAmount:   originalAmount,
		CurrentCurrency:  req.CurrentCurrency,
		OriginalCurrency: req.OriginalCurrency,
	}
}

// 处理金额(元)
func GetAmountInfoFormat(req *gmodel.AmountInfo, withThousandthPercentile bool) gmodel.AmountInfo {
	return gmodel.AmountInfo{
		Change:       GetAmountCurrencyFormat(&req.Change, withThousandthPercentile),
		ChangeRemark: req.ChangeRemark,
		Current:      GetAmountCurrencyFormat(&req.Current, withThousandthPercentile),
		Initiate:     GetAmountCurrencyFormat(&req.Initiate, withThousandthPercentile),
		Metadata:     req.Metadata,
	}
}

// 处理商品数量
func GetPurchaseQuantity(req *gmodel.PurchaseQuantity, withThousandthPercentile bool) gmodel.PurchaseQuantity {
	var initiate = strconv.FormatInt(int64(req.Initiate.(float64)), 10)
	if withThousandthPercentile {
		initiate = format.NumToStringWithThousandthPercentile(initiate)
	}
	var current = strconv.FormatInt(int64(req.Current.(float64)), 10)
	if withThousandthPercentile {
		current = format.NumToStringWithThousandthPercentile(current)
	}
	return gmodel.PurchaseQuantity{
		Initiate: initiate,
		Current:  current,
	}
}

// 生成订单编号
func GenerateOrderNumber() string {
	t := time.Now()
	orderNumber := fmt.Sprintf("%d%02d%02d%08d", t.Year(), t.Month(), t.Day(), t.UnixNano()%100000000)
	return orderNumber
}

// 生成收据编号
func GenerateReceiptNumber() string {
	t := time.Now()
	return fmt.Sprintf("%02d%02d%02d%08d", t.Year()%100, t.Month(), t.Day(), t.UnixNano()%100000000)
}

// 初始化订单状态--链路
func GenerateOrderStatusLink(deliveryMethod int64, noTime time.Time, expectedTime time.Time) []gmodel.OrderStatus {
	var list []gmodel.OrderStatus

	var orderStatus []constants.OrderStatusCode
	if deliveryMethod == constants.DELIVERYMETHODDIRECTMAIL {
		orderStatus = constants.OrderStatusUserDIRECTMAIL
	} else {
		orderStatus = constants.OrderStatusUserCLOUDSTORE
	}
	for _, v := range orderStatus {
		item := gmodel.OrderStatus{
			StatusCode:  v,
			StatusTitle: constants.OrderStatusMessage[v],
		}
		if v == constants.ORDER_STATUS_UNPAIDDEPOSIT {
			item.Ctime = &noTime
			item.Utime = &noTime
		}
		if v == constants.ORDER_STATUS_DIRECTMAIL_ARRIVED || v == constants.ORDER_STATUS_CLOUDSTORE_ARRIVEDWAREHOUSE {
			item.ExpectedTime = &expectedTime
		}
		list = append(list, item)
	}
	return list
}

// 更新订单状态--链路
func UpdateOrderStatusLink(statusLink []gmodel.OrderStatus, status gmodel.OrderStatus) []gmodel.OrderStatus {
	var list []gmodel.OrderStatus
	for _, v := range statusLink {
		if v.StatusCode == status.StatusCode {
			item := v
			if status.StatusTitle != "" {
				item.StatusTitle = status.StatusTitle
			}
			if status.StatusCode != 0 {
				item.StatusCode = status.StatusCode
			}
			if status.Utime != nil {
				item.Utime = status.Utime
			}
			if status.Ctime != nil {
				item.Ctime = status.Ctime
			}
			if status.Metadata != nil {
				item.Metadata = status.Metadata
			}
			if status.ExpectedTime != nil {
				item.ExpectedTime = status.ExpectedTime
			}
			if status.Children != nil || len(status.Children) > 0 {
				item.Children = status.Children
			}

			list = append(list, item)
		} else {
			list = append(list, v)
		}
	}
	return list
}

// 获取订单状态
func GetOrderStatusLinkUser(deliveryMethod int64, statusLink []gmodel.OrderStatus) []gmodel.OrderStatus {
	var list []gmodel.OrderStatus

	var orderStatus []constants.OrderStatusCode
	if deliveryMethod == constants.DELIVERYMETHODDIRECTMAIL {
		orderStatus = constants.OrderStatusUserDIRECTMAIL
	} else {
		orderStatus = constants.OrderStatusUserCLOUDSTORE
	}
	for _, v := range statusLink {
		for _, orderStatusCode := range orderStatus {
			if v.StatusCode == orderStatusCode {
				list = append(list, v)
			}
		}
	}
	return list
}

// 获取订单当前状态
func GetOrderStatusCurrent(statusLink []gmodel.OrderStatus, orderStatusCode constants.OrderStatusCode) gmodel.OrderStatus {
	var status gmodel.OrderStatus
	for _, v := range statusLink {
		if v.StatusCode == orderStatusCode {
			status = v
		}
	}
	return status
}