package constants

import "time"

// Fiber Locals 的上下文键
const (
	ContextKeyRequestID          = "requestid"            // 请求记录ID
	ContextKeyStartTime          = "start_time"           // 请求开始时间
	ContextKeyUserID             = "user_id"              // 用户ID
	ContextKeyUserType           = "user_type"            // 用户类型
	ContextKeyShopID             = "shop_id"              // 店铺ID
	ContextKeyEnterpriseID       = "enterprise_id"        // 企业ID
	ContextKeyCustomerID         = "customer_id"          // 个人客户ID
	ContextKeyUserInfo           = "user_info"            // 完整的用户信息
	ContextKeyIP                 = "ip_address"           // IP地址
	ContextKeyUserAgent          = "user_agent"           // User-Agent
	ContextKeySubordinateShopIDs = "subordinate_shop_ids" // 下级店铺ID列表（代理用户预计算）
)

// 配置环境变量
const (
	EnvConfigPath = "CONFIG_PATH"
	EnvConfigEnv  = "CONFIG_ENV" // dev, staging, prod
)

// 默认配置值
const (
	DefaultConfigPath = "configs/config.yaml"
	DefaultServerAddr = ":3000"
	DefaultRedisAddr  = "localhost:6379"
)

// 数据库配置常量
const (
	DefaultMaxOpenConns    = 25
	DefaultMaxIdleConns    = 10
	DefaultConnMaxLifetime = 5 * time.Minute
	DefaultPageSize        = 20
	MaxPageSize            = 100
	SlowQueryThreshold     = 500 * time.Millisecond
)

// 任务类型常量
const (
	TaskTypeEmailSend              = "email:send"               // 发送邮件
	TaskTypeCommission             = "commission:calculate"     // 分佣计算
	TaskTypeIotCardImport          = "iot_card:import"          // IoT 卡批量导入
	TaskTypeDeviceImport           = "device:import"            // 设备批量导入
	TaskTypeCommissionStatsUpdate  = "commission:stats:update"  // 佣金统计更新
	TaskTypeCommissionStatsSync    = "commission:stats:sync"    // 佣金统计同步
	TaskTypeCommissionStatsArchive = "commission:stats:archive" // 佣金统计归档

	// 轮询任务类型
	TaskTypePollingRealname = "polling:realname" // 实名状态检查
	TaskTypePollingCarddata = "polling:carddata" // 卡流量检查
	TaskTypePollingPackage  = "polling:package"  // 套餐流量检查
	TaskTypePollingProtect  = "polling:protect"  // 保护期一致性检查

	// 套餐激活任务类型
	TaskTypePackageFirstActivation = "package:first:activation" // 首次实名激活
	TaskTypePackageQueueActivation = "package:queue:activation" // 主套餐排队激活
	TaskTypePackageDataReset       = "package:data:reset"       // 套餐流量重置

	// 订单超时任务类型
	TaskTypeOrderExpire               = "order:expire"                      // 订单超时自动取消
	TaskTypeAutoPurchaseAfterRecharge = "task:auto_purchase_after_recharge" // 充值后自动购包

	// 定时任务类型（由 Asynq Scheduler 调度）
	TaskTypeAlertCheck        = "alert:check"         // 告警检查
	TaskTypeDataCleanup       = "data:cleanup"        // 数据清理
	TaskTypeDailyTrafficFlush = "traffic:daily:flush" // 每日流量落盘
)

// 用户状态常量
const (
	UserStatusActive    = "active"    // 激活
	UserStatusInactive  = "inactive"  // 未激活
	UserStatusSuspended = "suspended" // 暂停
)

// RBAC 用户类型常量
const (
	UserTypeSuperAdmin       = 1 // 超级管理员（跳过数据权限过滤）
	UserTypePlatform         = 2 // 平台用户
	UserTypeAgent            = 3 // 代理账号
	UserTypeEnterprise       = 4 // 企业账号
	UserTypePersonalCustomer = 5 // 个人客户（C端用户）
)

// RBAC 角色类型常量
const (
	RoleTypePlatform = 1 // 平台角色（适用于平台用户）
	RoleTypeCustomer = 2 // 客户角色（适用于代理/企业账号）
)

// RBAC 权限类型常量
const (
	PermissionTypeMenu   = 1 // 菜单权限
	PermissionTypeButton = 2 // 按钮权限
)

// RBAC 权限端口常量
const (
	PlatformAll = "all" // 全部端口（Web + H5）
	PlatformWeb = "web" // Web 后台
	PlatformH5  = "h5"  // H5 端
)

// RBAC 状态常量
const (
	StatusDisabled = 0 // 禁用
	StatusEnabled  = 1 // 启用
)

// 上架状态常量
const (
	ShelfStatusOn  = 1 // 上架
	ShelfStatusOff = 2 // 下架
)

// 套餐周期类型常量
const (
	PackageCalendarTypeNaturalMonth = "natural_month" // 自然月周期
	PackageCalendarTypeByDay        = "by_day"        // 按天周期
)

// 套餐流量重置周期常量
const (
	PackageDataResetDaily   = "daily"   // 每日重置
	PackageDataResetMonthly = "monthly" // 每月重置
	PackageDataResetYearly  = "yearly"  // 每年重置
	PackageDataResetNone    = "none"    // 不重置
)

// 套餐使用状态常量
const (
	PackageUsageStatusPending     = 0 // 待生效
	PackageUsageStatusActive      = 1 // 生效中
	PackageUsageStatusDepleted    = 2 // 已用完
	PackageUsageStatusExpired     = 3 // 已过期
	PackageUsageStatusInvalidated = 4 // 已失效
)

// 运营商类型常量
const (
	CarrierTypeCMCC = "CMCC" // 中国移动
	CarrierTypeCUCC = "CUCC" // 中国联通
	CarrierTypeCTCC = "CTCC" // 中国电信
	CarrierTypeCBN  = "CBN"  // 中国广电
)

// 订单状态常量
const (
	OrderStatusPending    = "pending"    // 待支付
	OrderStatusPaid       = "paid"       // 已支付
	OrderStatusProcessing = "processing" // 处理中
	OrderStatusCompleted  = "completed"  // 已完成
	OrderStatusCancelled  = "cancelled"  // 已取消
)

// 订单超时配置常量
const (
	OrderExpireTimeout   = 30 * time.Minute // 订单超时时间（30分钟）
	OrderExpireBatchSize = 100              // 每次批量处理超时订单的数量上限
)

// 队列配置常量
const (
	QueueCritical      = "critical" // 关键任务队列
	QueueDefault       = "default"  // 默认队列
	QueueLow           = "low"      // 低优先级队列
	DefaultRetryMax    = 5
	DefaultTimeout     = 10 * time.Minute
	DefaultConcurrency = 10
)

// 店铺配置常量
const (
	MaxShopLevel = 7 // 店铺最大层级
)

// 验证码配置常量
const (
	VerificationCodeLength     = 6                // 验证码长度（6位数字）
	VerificationCodeExpiration = 5 * time.Minute  // 验证码过期时间（5分钟）
	VerificationCodeRateLimit  = 60 * time.Second // 验证码发送频率限制（60秒）
)

// ======== 默认超级管理员账号配置（用于系统初始化） ========

// DefaultAdminUsername 默认超级管理员用户名
const DefaultAdminUsername = "admin"

// DefaultAdminPassword 默认超级管理员密码
const DefaultAdminPassword = "Admin@123456"

// DefaultAdminPhone 默认超级管理员手机号
const DefaultAdminPhone = "13800000000"

// ======== 企业卡授权相关常量 ========

// AuthorizerType 授权人类型
const (
	AuthorizerTypePlatform = UserTypePlatform // 平台用户授权(2)
	AuthorizerTypeAgent    = UserTypeAgent    // 代理账号授权(3)
)

// 自动代购状态常量（强充二阶段异步购买）
const (
	AutoPurchaseStatusPending = "pending" // 待处理
	AutoPurchaseStatusSuccess = "success" // 成功
	AutoPurchaseStatusFailed  = "failed"  // 失败
)

// 设备保护期相关时长常量
const (
	DeviceProtectPeriodDuration   = 1 * time.Hour    // 设备停/复机保护期时长（1小时）
	DeviceRefreshCooldownDuration = 30 * time.Second // 设备网关刷新冷却时长（30秒）
)

// 换货单状态常量
const (
	ExchangeStatusPendingInfo = 1 // 待填写信息（等待客户端填写收货地址）
	ExchangeStatusPendingShip = 2 // 待发货（客户端已填写，等待后台发货）
	ExchangeStatusShipped     = 3 // 已发货待确认（后台已发货，等待确认完成）
	ExchangeStatusCompleted   = 4 // 已完成
	ExchangeStatusCancelled   = 5 // 已取消
)

// 换货资产类型常量
const (
	ExchangeAssetTypeIotCard = "iot_card" // 物联网卡
	ExchangeAssetTypeDevice  = "device"   // 设备
)

// GetStatusName 获取通用启用/禁用状态名称
// 用于 status 字段：0=禁用, 1=启用
func GetStatusName(status int) string {
	switch status {
	case StatusDisabled:
		return "禁用"
	case StatusEnabled:
		return "启用"
	default:
		return "未知"
	}
}

// GetShelfStatusName 获取上架状态名称
// 用于 shelf_status 字段：1=上架, 2=下架
func GetShelfStatusName(status int) string {
	switch status {
	case ShelfStatusOn:
		return "上架"
	case ShelfStatusOff:
		return "下架"
	default:
		return "未知"
	}
}

// GetExchangeStatusName 获取换货单状态名称
// 用于 exchange_status 字段
func GetExchangeStatusName(status int) string {
	switch status {
	case ExchangeStatusPendingInfo:
		return "待填写信息"
	case ExchangeStatusPendingShip:
		return "待发货"
	case ExchangeStatusShipped:
		return "已发货待确认"
	case ExchangeStatusCompleted:
		return "已完成"
	case ExchangeStatusCancelled:
		return "已取消"
	default:
		return "未知"
	}
}
