package constants

import "fmt"

// ========================================
// 钱包系统常量定义
// ========================================

// ========== 代理钱包常量 ==========

// 代理钱包类型
const (
	AgentWalletTypeMain       = "main"       // 主钱包
	AgentWalletTypeCommission = "commission" // 分佣钱包
	// AgentMainWalletLowBalanceThreshold 表示主钱包低余额提醒阈值，单位为分（100 元）。
	AgentMainWalletLowBalanceThreshold int64 = 10000
)

// 代理主钱包信用管理权限
const (
	PermissionRoleDefaultCreditManage = "role:default-credit:manage" // 配置客户角色的新建代理默认信用模板
	PermissionShopCreditLimitManage   = "shop:credit-limit:manage"   // 前端控制店铺实际信用额度按钮显示
)

// AgentFundManagementForbiddenMessage 是企业账号访问代理资金功能时的统一拒绝提示。
const AgentFundManagementForbiddenMessage = "企业账号无权访问代理资金功能"

// 代理钱包状态
const (
	AgentWalletStatusNormal = 1 // 正常
	AgentWalletStatusFrozen = 2 // 冻结
	AgentWalletStatusClosed = 3 // 关闭
)

// 代理钱包交易类型
const (
	AgentTransactionTypeRecharge         = "recharge"          // 充值
	AgentTransactionTypeDeduct           = "deduct"            // 扣款
	AgentTransactionTypeRefund           = "refund"            // 退款
	AgentTransactionTypeCommission       = "commission"        // 分佣
	AgentTransactionTypeWithdrawal       = "withdrawal"        // 提现
	AgentTransactionTypeCommissionDeduct = "commission_deduct" // 退款佣金回扣
	AgentTransactionTypeAdjustment       = "adjustment"        // 人工余额调整
)

// 代理钱包交易子类型（当 transaction_type = "deduct" 用于订单支付时）
const (
	WalletTransactionSubtypeSelfPurchase           = "self_purchase"            // 自购
	WalletTransactionSubtypePurchaseForSubordinate = "purchase_for_subordinate" // 给下级代理购买

	// OutboxEventTypeAgentMainWalletDebited 表示代理主钱包订单扣款已提交。
	OutboxEventTypeAgentMainWalletDebited = "wallet.agent_main.debited"
	// AgentMainWalletDebitedPayloadVersionV1 是代理主钱包扣款事件载荷版本。
	AgentMainWalletDebitedPayloadVersionV1 = 1
	// OutboxEventTypeAgentMainWalletReservationChanged 表示代理主钱包预占状态已变化。
	OutboxEventTypeAgentMainWalletReservationChanged = "wallet.agent_main.reservation.changed"
	// AgentMainWalletReservationPayloadVersionV1 是代理主钱包预占事件载荷版本。
	AgentMainWalletReservationPayloadVersionV1 = 1
	// OutboxEventTypeAgentMainWalletCredited 表示代理主钱包正向入账已提交。
	OutboxEventTypeAgentMainWalletCredited = "wallet.agent_main.credited"
	// AgentMainWalletCreditedPayloadVersionV1 是代理主钱包入账事件载荷版本。
	AgentMainWalletCreditedPayloadVersionV1 = 1
	// OutboxEventTypeAgentMainWalletRefunded 表示代理主钱包订单退款回充已提交。
	OutboxEventTypeAgentMainWalletRefunded = "wallet.agent_main.refunded"
	// AgentMainWalletRefundedPayloadVersionV1 是代理主钱包退款回充事件载荷版本。
	AgentMainWalletRefundedPayloadVersionV1 = 1
)

// 代理主钱包预占状态
const (
	AgentWalletReservationStatusFrozen    = 1 // 已冻结
	AgentWalletReservationStatusReleased  = 2 // 已释放
	AgentWalletReservationStatusCompleted = 3 // 已完成扣除
)

// 代理充值订单号前缀
const (
	AgentRechargeOrderPrefix = "ARCH" // 代理充值订单号前缀
)

// 代理充值金额限制（单位：分）
const (
	AgentRechargeMinAmount = 1         // 最小充值金额（1分）
	AgentRechargeMaxAmount = 100000000 // 最大充值金额（1000000元）
)

// ========== 资产钱包常量 ==========

// 资产钱包资源类型
const (
	AssetWalletResourceTypeIotCard = "iot_card" // 物联网卡钱包
	AssetWalletResourceTypeDevice  = "device"   // 设备钱包（多卡共享）
)

// 资产钱包状态
const (
	AssetWalletStatusNormal = 1 // 正常
	AssetWalletStatusFrozen = 2 // 冻结
	AssetWalletStatusClosed = 3 // 关闭
)

// 资产钱包交易类型
const (
	AssetTransactionTypeRecharge = "recharge" // 充值
	AssetTransactionTypeDeduct   = "deduct"   // 扣款
	AssetTransactionTypeRefund   = "refund"   // 退款
	AssetTransactionTypeExchange = "exchange" // 换货迁移
)

// 资产充值订单号前缀
const (
	AssetRechargeOrderPrefix = "CRCH" // 资产充值订单号前缀
)

// 资产充值金额限制（单位：分）
const (
	AssetRechargeMinAmount = 100      // 最小充值金额（1元）
	AssetRechargeMaxAmount = 10000000 // 最大充值金额（100000元）
)

// ========== 通用常量 ==========

// 交易状态（代理钱包和卡钱包通用）
const (
	TransactionStatusSuccess    = 1 // 成功
	TransactionStatusFailed     = 2 // 失败
	TransactionStatusProcessing = 3 // 处理中
)

// 充值状态（代理钱包和卡钱包通用）
const (
	RechargeStatusPending   = 1 // 待支付
	RechargeStatusPaid      = 2 // 已支付
	RechargeStatusCompleted = 3 // 已完成
	RechargeStatusClosed    = 4 // 已关闭
	RechargeStatusRefunded  = 5 // 已退款
	RechargeStatusRejected  = 6 // 已驳回
)

// 充值支付方式
const (
	RechargeMethodAlipay  = "alipay"  // 支付宝
	RechargeMethodWechat  = "wechat"  // 微信
	RechargeMethodBank    = "bank"    // 银行转账（仅代理钱包支持）
	RechargeMethodOffline = "offline" // 线下（仅代理钱包支持）
)

// 关联业务类型
const (
	ReferenceTypeOrder            = "order"             // 订单
	ReferenceTypeCommission       = "commission"        // 分佣
	ReferenceTypeWithdrawal       = "withdrawal"        // 提现
	ReferenceTypeTopup            = "topup"             // 充值
	ReferenceTypeRefund           = "refund"            // 退款
	ReferenceTypeExchange         = "exchange"          // 换货
	ReferenceTypeManualAdjustment = "manual_adjustment" // 人工余额调整
)

// ========== Redis Key 生成函数 ==========

// GetRechargeStatusName 获取充值状态名称
// 对应 RechargeStatus* 常量：1=待支付, 2=已支付, 3=已完成, 4=已关闭, 5=已退款, 6=已驳回
func GetRechargeStatusName(status int) string {
	switch status {
	case RechargeStatusPending:
		return "待支付"
	case RechargeStatusPaid:
		return "已支付"
	case RechargeStatusCompleted:
		return "已完成"
	case RechargeStatusClosed:
		return "已关闭"
	case RechargeStatusRefunded:
		return "已退款"
	case RechargeStatusRejected:
		return "已驳回"
	default:
		return "未知"
	}
}

// RedisAgentWalletBalanceKey 代理钱包余额缓存 Key
// 格式：agent_wallet:balance:{shop_id}:{wallet_type}
// TTL：300 秒（5 分钟）
func RedisAgentWalletBalanceKey(shopID uint, walletType string) string {
	return fmt.Sprintf("agent_wallet:balance:%d:%s", shopID, walletType)
}

// RedisAgentWalletLockKey 代理钱包分布式锁 Key
// 格式：agent_wallet:lock:{shop_id}:{wallet_type}
// TTL：10 秒
func RedisAgentWalletLockKey(shopID uint, walletType string) string {
	return fmt.Sprintf("agent_wallet:lock:%d:%s", shopID, walletType)
}

// RedisAssetWalletBalanceKey 资产钱包余额缓存 Key
// 格式：asset_wallet:balance:{resource_type}:{resource_id}
// TTL：180 秒（3 分钟）
func RedisAssetWalletBalanceKey(resourceType string, resourceID uint) string {
	return fmt.Sprintf("asset_wallet:balance:%s:%d", resourceType, resourceID)
}

// RedisAssetWalletLockKey 资产钱包分布式锁 Key
// 格式：asset_wallet:lock:{resource_type}:{resource_id}
// TTL：10 秒
func RedisAssetWalletLockKey(resourceType string, resourceID uint) string {
	return fmt.Sprintf("asset_wallet:lock:%s:%d", resourceType, resourceID)
}
