package model

import (
	"gorm.io/gorm"
	"time"
)

type Payment struct {
	ID                uint           `gorm:"column:id;primaryKey" json:"id"`
	PaymentNo         string         `gorm:"column:payment_no;type:varchar(40);uniqueIndex;not null" json:"payment_no"`
	OrderID           uint           `gorm:"column:order_id;not null" json:"order_id"`
	OrderType         string         `gorm:"column:order_type;type:varchar(30);not null" json:"order_type"`
	PaymentMethod     string         `gorm:"column:payment_method;type:varchar(20);not null" json:"payment_method"`
	Amount            int64          `gorm:"column:amount;type:bigint;not null" json:"amount"`
	Status            int            `gorm:"column:status;type:smallint;not null;default:0" json:"status"`
	ThirdPartyTradeNo string         `gorm:"column:third_party_trade_no;type:varchar(100)" json:"third_party_trade_no,omitempty"`
	PaymentConfigID   *uint          `gorm:"column:payment_config_id" json:"payment_config_id,omitempty"`
	PaymentVoucherKey string         `gorm:"column:payment_voucher_key;type:varchar(500)" json:"payment_voucher_key,omitempty"`
	PaidAt            *time.Time     `gorm:"column:paid_at" json:"paid_at,omitempty"`
	ExpireAt          *time.Time     `gorm:"column:expire_at" json:"expire_at,omitempty"`
	CreatedAt         time.Time      `gorm:"column:created_at;not null;default:CURRENT_TIMESTAMP" json:"created_at"`
	UpdatedAt         time.Time      `gorm:"column:updated_at;not null;default:CURRENT_TIMESTAMP" json:"updated_at"`
	DeletedAt         gorm.DeletedAt `gorm:"column:deleted_at;index" json:"deleted_at,omitempty"`
}

func (Payment) TableName() string {
	return "tb_payment"
}

const (
	PaymentRecordStatusPending  = 0 // 待支付
	PaymentRecordStatusPaid     = 1 // 已支付
	PaymentRecordStatusFailed   = 2 // 已失败
	PaymentRecordStatusRefunded = 3 // 已退款
)

const (
	PaymentOrderTypePackage  = "package_order"
	PaymentOrderTypeRecharge = "recharge_order"
)

const (
	PaymentByWallet  = "wallet"
	PaymentByWechat  = "wechat"
	PaymentByAlipay  = "alipay"
	PaymentByOffline = "offline"
)
