package constants

import (
	"time"

	"github.com/break/junhong_cmp_fiber/pkg/asynctask"
)

// 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
	ContextKeyRequestPath        = "request_path"         // 请求路径
	ContextKeyRequestMethod      = "request_method"       // 请求方法
	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
	DefaultPage            = 1 // 默认页码
	DefaultPageSize        = 20
	MaxPageSize            = 100
	SlowQueryThreshold     = 500 * time.Millisecond
)

// 任务类型常量
const (
	TaskTypeEmailSend              = "email:send"               // 发送邮件
	TaskTypeCommission             = "commission:calculate"     // 分佣计算
	TaskTypeIotCardImport          = "iot_card:import"          // IoT 卡批量导入
	TaskTypeDeviceImport           = "device:import"            // 设备批量导入
	TaskTypeExportDispatch         = "export:dispatch"          // 导出任务分发
	TaskTypeExportShard            = "export:shard"             // 导出任务分片执行
	TaskTypeExportFinalize         = "export:finalize"          // 导出任务收尾汇总
	TaskTypeCommissionStatsUpdate  = "commission:stats:update"  // 佣金统计更新
	TaskTypeCommissionStatsSync    = "commission:stats:sync"    // 佣金统计同步
	TaskTypeCommissionStatsArchive = "commission:stats:archive" // 佣金统计归档

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

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

	// 订单套餐失效任务类型
	TaskTypeOrderPackageInvalidate = "order:package:invalidate"  // 批量失效订单套餐
	TaskTypeAssetPackageBatchOrder = "asset:package:batch_order" // 资产套餐批量订购

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

	// 定时任务类型（由 Asynq Scheduler 调度）
	TaskTypeAlertCheck            = "alert:check"             // 告警检查
	TaskTypeDataCleanup           = "data:cleanup"            // 数据清理
	TaskTypeNotificationCleanup   = "notification:cleanup"    // 站内通知保留清理
	TaskTypePackageExpiryReminder = "package:expiry:reminder" // 套餐 15/7/3 天临期提醒
	TaskTypeDailyTrafficFlush     = "traffic:daily:flush"     // 每日流量落盘
	TaskTypeOutboxDeliver         = "outbox:deliver"          // 公共 Outbox 事件投递
	TaskTypeCardObservationSeries = "card_observation:series" // 卡观测事件序列尝试
	TaskTypeWeComApprovalSync     = "wecom:approval:sync"     // 企业微信审批详情异步同步
	TaskTypeWeComApprovalRecovery = "wecom:approval:recovery" // 企业微信审批主动恢复与轮询
)

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

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

const (
	// AssetResolveTypeCard 表示统一资产详情中的卡类型。
	AssetResolveTypeCard = "card"
	// ExchangeTraceDirectionPrevious 表示换货链前代查询方向。
	ExchangeTraceDirectionPrevious = "previous"
	// ExchangeTraceDirectionNext 表示换货链后代查询方向。
	ExchangeTraceDirectionNext = "next"
)

// 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 (
	PackageExpiryBaseFromActivation = "from_activation" // 实名激活时生效
	PackageExpiryBaseFromPurchase   = "from_purchase"   // 购买即生效
)

// 套餐流量重置周期常量
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"      // 旧版低优先级队列（兼容历史任务）

	QueueEmailSend              = TaskTypeEmailSend                 // 发送邮件任务队列
	QueueCommission             = TaskTypeCommission                // 分佣计算任务队列
	QueueIotCardImport          = TaskTypeIotCardImport             // IoT 卡导入任务队列
	QueueDeviceImport           = TaskTypeDeviceImport              // 设备导入任务队列
	QueueExportDispatch         = TaskTypeExportDispatch            // 导出分发任务队列
	QueueExportShard            = TaskTypeExportShard               // 导出分片任务队列
	QueueExportFinalize         = TaskTypeExportFinalize            // 导出收尾任务队列
	QueueCommissionStatsUpdate  = TaskTypeCommissionStatsUpdate     // 佣金统计更新任务队列
	QueueCommissionStatsSync    = TaskTypeCommissionStatsSync       // 佣金统计同步任务队列
	QueueCommissionStatsArchive = TaskTypeCommissionStatsArchive    // 佣金统计归档任务队列
	QueuePollingRealname        = TaskTypePollingRealname           // 实名轮询任务队列
	QueuePollingCarddata        = TaskTypePollingCarddata           // 流量轮询任务队列
	QueuePollingPackage         = TaskTypePollingPackage            // 套餐轮询任务队列
	QueuePollingProtect         = TaskTypePollingProtect            // 保护期轮询任务队列
	QueuePollingCardStatus      = TaskTypePollingCardStatus         // 卡状态轮询任务队列
	QueuePackageFirstActivation = TaskTypePackageFirstActivation    // 首次实名激活任务队列
	QueuePackageQueueActivation = TaskTypePackageQueueActivation    // 主套餐排队激活任务队列
	QueuePackageDataReset       = TaskTypePackageDataReset          // 套餐流量重置任务队列
	QueueOrderPackageInvalidate = TaskTypeOrderPackageInvalidate    // 批量失效订单套餐任务队列
	QueueAssetPackageBatchOrder = TaskTypeAssetPackageBatchOrder    // 资产套餐批量订购任务队列
	QueueOrderExpire            = TaskTypeOrderExpire               // 订单超时取消任务队列
	QueueAutoPurchase           = TaskTypeAutoPurchaseAfterRecharge // 充值后自动购包任务队列
	QueueAlertCheck             = TaskTypeAlertCheck                // 告警检查任务队列
	QueueDataCleanup            = TaskTypeDataCleanup               // 数据清理任务队列
	QueueDailyTrafficFlush      = TaskTypeDailyTrafficFlush         // 每日流量落盘任务队列
	QueueOutboxDeliver          = TaskTypeOutboxDeliver             // 公共 Outbox 投递队列
	QueueCardObservationSeries  = TaskTypeCardObservationSeries     // 卡观测事件序列队列
	QueueWeComApproval          = "wecom:approval"                  // 企业微信审批同步与恢复队列

	DefaultRetryMax    = 5                // 默认任务最大重试次数
	DefaultTimeout     = 10 * time.Minute // 默认任务超时时间
	DefaultConcurrency = 10               // 默认 Worker 并发数
)

// QueueForTaskType 根据任务类型返回独立队列名。
func QueueForTaskType(taskType string) string {
	switch taskType {
	case TaskTypeEmailSend:
		return QueueEmailSend
	case TaskTypeCommission:
		return QueueCommission
	case TaskTypeIotCardImport:
		return QueueIotCardImport
	case TaskTypeDeviceImport:
		return QueueDeviceImport
	case TaskTypeExportDispatch:
		return QueueExportDispatch
	case TaskTypeExportShard:
		return QueueExportShard
	case TaskTypeExportFinalize:
		return QueueExportFinalize
	case TaskTypeCommissionStatsUpdate:
		return QueueCommissionStatsUpdate
	case TaskTypeCommissionStatsSync:
		return QueueCommissionStatsSync
	case TaskTypeCommissionStatsArchive:
		return QueueCommissionStatsArchive
	case TaskTypePollingRealname:
		return QueuePollingRealname
	case TaskTypePollingCarddata:
		return QueuePollingCarddata
	case TaskTypePollingPackage:
		return QueuePollingPackage
	case TaskTypePollingProtect:
		return QueuePollingProtect
	case TaskTypePollingCardStatus:
		return QueuePollingCardStatus
	case TaskTypePackageFirstActivation:
		return QueuePackageFirstActivation
	case TaskTypePackageQueueActivation:
		return QueuePackageQueueActivation
	case TaskTypePackageDataReset:
		return QueuePackageDataReset
	case TaskTypeOrderPackageInvalidate:
		return QueueOrderPackageInvalidate
	case TaskTypeAssetPackageBatchOrder:
		return QueueAssetPackageBatchOrder
	case TaskTypeOrderExpire:
		return QueueOrderExpire
	case TaskTypeAutoPurchaseAfterRecharge:
		return QueueAutoPurchase
	case TaskTypeAlertCheck:
		return QueueAlertCheck
	case TaskTypeDataCleanup:
		return QueueDataCleanup
	case TaskTypeNotificationCleanup:
		return QueueDataCleanup
	case TaskTypePackageExpiryReminder:
		return QueueDataCleanup
	case TaskTypeDailyTrafficFlush:
		return QueueDailyTrafficFlush
	case TaskTypeOutboxDeliver:
		return QueueOutboxDeliver
	case TaskTypeCardObservationSeries:
		return QueueCardObservationSeries
	case TaskTypeWeComApprovalSync, TaskTypeWeComApprovalRecovery:
		return QueueWeComApproval
	default:
		return QueueDefault
	}
}

// DefaultTaskQueueWeights 返回 Worker 默认监听的全部任务队列及其权重。
func DefaultTaskQueueWeights() map[string]int {
	return map[string]int{
		QueueCritical:               6,
		QueueIotCardImport:          6,
		QueueDeviceImport:           6,
		QueueAutoPurchase:           5,
		QueuePackageFirstActivation: 5,
		QueuePackageQueueActivation: 5,
		QueueOrderPackageInvalidate: 5,
		QueueAssetPackageBatchOrder: 5,
		QueueOrderExpire:            4,
		QueueEmailSend:              4,
		QueueExportDispatch:         4,
		QueueExportFinalize:         4,
		QueueCommission:             3,
		QueueAlertCheck:             3,
		QueueExportShard:            2,
		QueueCommissionStatsUpdate:  2,
		QueueCommissionStatsSync:    2,
		QueueCommissionStatsArchive: 2,
		QueuePollingRealname:        1,
		QueuePollingCarddata:        1,
		QueuePollingPackage:         1,
		QueuePollingProtect:         1,
		QueuePollingCardStatus:      1,
		QueuePackageDataReset:       1,
		QueueDataCleanup:            1,
		QueueDailyTrafficFlush:      1,
		QueueOutboxDeliver:          4,
		QueueCardObservationSeries:  2,
		QueueWeComApproval:          2,
		QueueDefault:                1,
		QueueLow:                    1,
	}
}

// 导出任务相关常量
const (
	ExportTaskSceneDevice  = "device"   // 导出场景：设备
	ExportTaskSceneIotCard = "iot_card" // 导出场景：IoT 卡
	ExportTaskSceneOrder   = "order"    // 导出场景：订单
	ExportTaskScenePackage = "package"  // 导出场景：套餐
	// ExportTaskSceneAgentWalletTransaction 表示代理主钱包流水导出场景。
	ExportTaskSceneAgentWalletTransaction = "agent_wallet_transaction"
	// ExportTaskSceneAgentRecharge 表示代理充值记录导出场景。
	ExportTaskSceneAgentRecharge = "agent_recharge"
	// ExportTaskSceneRefund 表示退款记录导出场景。
	ExportTaskSceneRefund = "refund"
	// ExportTaskSceneExchange 表示换货记录导出场景。
	ExportTaskSceneExchange = "exchange"
)

// 导出文件格式常量
const (
	ExportTaskFormatXLSX = "xlsx" // 导出格式：Excel
	ExportTaskFormatCSV  = "csv"  // 导出格式：CSV
)

// 导出主任务状态常量
const (
	ExportTaskStatusPending    = asynctask.StatusPending    // 待处理
	ExportTaskStatusProcessing = asynctask.StatusProcessing // 处理中
	ExportTaskStatusCompleted  = asynctask.StatusCompleted  // 已完成
	ExportTaskStatusFailed     = asynctask.StatusFailed     // 已失败
	ExportTaskStatusCancelled  = asynctask.StatusCancelled  // 已取消
)

// 导出分片任务状态常量
const (
	ExportShardStatusPending    = 1 // 待处理
	ExportShardStatusProcessing = 2 // 处理中
	ExportShardStatusSuccess    = 3 // 已成功
	ExportShardStatusFailed     = 4 // 已失败
	ExportShardStatusCancelled  = 5 // 已取消
)

// 导出任务执行配置常量
const (
	ExportDefaultShardSize    = 2000             // 默认分片大小
	ExportDownloadURLExpire   = 24 * time.Hour   // 下载链接固定有效期
	ExportDispatchTaskTimeout = 10 * time.Minute // dispatch 任务超时
	ExportShardTaskTimeout    = 15 * time.Minute // shard 任务超时
	ExportFinalizeTaskTimeout = 10 * time.Minute // finalize 任务超时
	ExportFinalizeRetryMax    = 30               // finalize 最大重试次数
	ExportShardRetryMax       = 3                // shard 最大重试次数
	ExportDispatchRetryMax    = 5                // dispatch 最大重试次数
)

// 店铺配置常量
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 (
	ExchangeFlowTypeShipping = "shipping" // 物流换货
	ExchangeFlowTypeDirect   = "direct"   // 直接换货
)

// 换货资产类型常量
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 "未知"
	}
}

// GetExportTaskStatusName 获取导出主任务状态名称
func GetExportTaskStatusName(status int) string {
	name := asynctask.StatusName(status)
	if name == "" {
		return "未知"
	}
	return name
}

// GetExportShardStatusName 获取导出分片任务状态名称
func GetExportShardStatusName(status int) string {
	switch status {
	case ExportShardStatusPending:
		return "待处理"
	case ExportShardStatusProcessing:
		return "处理中"
	case ExportShardStatusSuccess:
		return "已成功"
	case ExportShardStatusFailed:
		return "已失败"
	case ExportShardStatusCancelled:
		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 "未知"
	}
}

// GetExchangeFlowTypeName 获取换货流程类型名称
func GetExchangeFlowTypeName(flowType string) string {
	switch flowType {
	case "", ExchangeFlowTypeShipping:
		return "物流换货"
	case ExchangeFlowTypeDirect:
		return "直接换货"
	default:
		return "未知"
	}
}
