package model

import (
	"math/rand"
	"time"
)

type Order struct {
	Id                    int64     `gorm:"column=id:PRIMARY" json:"id"`
	Code                  string    `gorm:"column=code;Unique" json:"code"`
	UserId                int64     `json:"user_id"`
	StoreId               int64     `json:"store_id"`
	Status                int       `json:"status"`          // 1:init,  3 seller_confirm, 4:delivered, 5: request_cancel, 6: canceled, 7: request_refund, 8: refunded
	PaymentStatus         int       `json:"payment_status" ` // 1: waiting, 2: success
	PaymentProof          string    `json:"payment_proof"`
	ShippingAddressId     int64     `json:"shipping_address_id"`
	ShippingAddressString string    `json:"shipping_address_string"`
	Note                  string    `json:"note"`
	Price                 int       `json:"price"`
	TotalItems            int       `json:"total_items"`
	TotalDelivered        int       `json:"total_delivered"`
	CanceledReason        string    `json:"canceled_reason"`
	IsQuoteAfterOrdering  bool      `json:"is_quote_after_ordering"`
	SellerChangeOrderItem bool      `json:"seller_change_order_item"`
	SellerChangeNote      string    `json:"seller_change_note"`
	CreatedAt             time.Time `gorm:"column=created_at;autoCreateTime" json:"created_at"`
	UpdatedAt             time.Time `gorm:"column=updated_at;autoUpdateTime" json:"updated_at"`
}

func (m *Order) IsValidStatus(status int) bool {
	return status >= m.Status && status <= 10
}

func (m *Order) CreateOrderCode() {
	m.Code = m.GenerateOrderCode()
}

func (m *Order) GenerateOrderCode() string {
	rand.Seed(time.Now().UnixNano())
	// 0 -> 9: 48 -> 57
	// A -> 65: 90
	var sum int32 = 0
	result := make([]int32, 12)
	resultIndex := 0
	tString := time.Now().Format("060102150405")
	for i, c := range tString {
		sum += c
		if i%2 != 0 {
			var mod int32 = 0
			if i <= 8 {
				mod = (sum % 26) + 65
			} else {
				mod = (sum % 10) + 48
			}
			result[resultIndex] = mod
			resultIndex++
			sum = 0
		}
	}

	min := 48
	max := 90
	for resultIndex < 12 {
		random := rand.Intn(max-min) + min
		for random >= 58 && random <= 64 {
			random = rand.Intn(max-min) + min
		}
		result[resultIndex] = int32(random)
		resultIndex++
	}

	return string(result)
}
