package model

import (
	"time"

	"gorm.io/gorm"
)

// AssetWallet 资产钱包模型
// 管理物联网卡和设备级别的钱包
type AssetWallet struct {
	ID              uint           `gorm:"column:id;primaryKey" json:"id"`
	ResourceType    string         `gorm:"column:resource_type;type:varchar(20);not null;index;comment:资源类型(iot_card-物联网卡 | device-设备)" json:"resource_type"`
	ResourceID      uint           `gorm:"column:resource_id;not null;index;comment:资源ID(关联tb_iot_card.id或tb_device.id)" json:"resource_id"`
	Balance         int64          `gorm:"column:balance;type:bigint;not null;default:0;comment:余额(单位:分)" json:"balance"`
	FrozenBalance   int64          `gorm:"column:frozen_balance;type:bigint;not null;default:0;comment:冻结余额(单位:分)" json:"frozen_balance"`
	Currency        string         `gorm:"column:currency;type:varchar(10);not null;default:'CNY';comment:币种" json:"currency"`
	Status          int            `gorm:"column:status;type:int;not null;default:1;comment:钱包状态(1-正常 2-冻结 3-关闭)" json:"status"`
	Version         int            `gorm:"column:version;type:int;not null;default:0;comment:版本号(乐观锁)" json:"version"`
	ShopIDTag       uint           `gorm:"column:shop_id_tag;not null;index;comment:店铺ID标签(多租户过滤)" json:"shop_id_tag"`
	EnterpriseIDTag *uint          `gorm:"column:enterprise_id_tag;index;comment:企业ID标签(多租户过滤)" json:"enterprise_id_tag,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"`
}

// TableName 指定表名
func (AssetWallet) TableName() string {
	return "tb_asset_wallet"
}

// GetAvailableBalance 获取可用余额 = balance - frozen_balance
func (w *AssetWallet) GetAvailableBalance() int64 {
	return w.Balance - w.FrozenBalance
}

// AssetWalletTransaction 资产钱包交易记录模型
// 记录所有资产钱包余额变动
type AssetWalletTransaction struct {
	ID              uint           `gorm:"column:id;primaryKey" json:"id"`
	AssetWalletID   uint           `gorm:"column:asset_wallet_id;not null;index;comment:资产钱包ID" json:"asset_wallet_id"`
	ResourceType    string         `gorm:"column:resource_type;type:varchar(20);not null;index;comment:资源类型(冗余字段,便于查询)" json:"resource_type"`
	ResourceID      uint           `gorm:"column:resource_id;not null;index;comment:资源ID(冗余字段,便于查询)" json:"resource_id"`
	UserID          uint           `gorm:"column:user_id;not null;comment:操作人用户ID" json:"user_id"`
	TransactionType string         `gorm:"column:transaction_type;type:varchar(20);not null;comment:交易类型(recharge-充值 | deduct-扣款 | refund-退款)" json:"transaction_type"`
	Amount          int64          `gorm:"column:amount;type:bigint;not null;comment:变动金额(单位:分,正数为增加,负数为减少)" json:"amount"`
	BalanceBefore   int64          `gorm:"column:balance_before;type:bigint;not null;comment:变动前余额(单位:分)" json:"balance_before"`
	BalanceAfter    int64          `gorm:"column:balance_after;type:bigint;not null;comment:变动后余额(单位:分)" json:"balance_after"`
	Status          int            `gorm:"column:status;type:int;not null;default:1;comment:交易状态(1-成功 2-失败 3-处理中)" json:"status"`
	ReferenceType   *string        `gorm:"column:reference_type;type:varchar(50);comment:关联业务类型(order | recharge)" json:"reference_type,omitempty"`
	ReferenceNo     *string        `gorm:"column:reference_no;type:varchar(50);comment:关联业务编号(充值单号CRCH…或订单号ORD…)" json:"reference_no,omitempty"`
	Remark          *string        `gorm:"column:remark;type:text;comment:备注" json:"remark,omitempty"`
	Metadata        *string        `gorm:"column:metadata;type:jsonb;comment:扩展信息(如套餐信息、支付方式等)" json:"metadata,omitempty"`
	Creator         uint           `gorm:"column:creator;not null;comment:创建人ID" json:"creator"`
	ShopIDTag       uint           `gorm:"column:shop_id_tag;not null;index;comment:店铺ID标签(多租户过滤)" json:"shop_id_tag"`
	EnterpriseIDTag *uint          `gorm:"column:enterprise_id_tag;index;comment:企业ID标签(多租户过滤)" json:"enterprise_id_tag,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"`
}

// TableName 指定表名
func (AssetWalletTransaction) TableName() string {
	return "tb_asset_wallet_transaction"
}
