package constants

import "time"

// 卡实名观测来源
const (
	CardObservationSourcePolling         = "polling"          // 周期轮询
	CardObservationSourceManualSync      = "manual_sync"      // 手动同步
	CardObservationSourceManualOverride  = "manual_override"  // 人工纠偏
	CardObservationSourceCarrierCallback = "carrier_callback" // 运营商回调
	CardObservationSourceBusinessEvent   = "business_event"   // 业务成功后的观测
)

// 卡观测事件序列同步类型。
const (
	CardObservationSyncTypeRealname   = "realname"    // 实名状态
	CardObservationSyncTypeTraffic    = "traffic"     // 流量读数
	CardObservationSyncTypeNetwork    = "network"     // 网络状态
	CardObservationSyncTypeDeviceInfo = "device_info" // 设备信息
)

// 卡观测事件序列资源类型。
const (
	CardObservationResourceTypeCard   = "iot_card" // IoT 卡
	CardObservationResourceTypeDevice = "device"   // 设备
)

// 卡观测事件序列执行参数。
const (
	CardObservationSeriesAttemptCount = 3                // 每个序列固定尝试次数
	CardObservationSeriesTTL          = 7 * time.Minute  // 活跃序列覆盖最后一次任务及缓冲
	CardObservationSeriesResultTTL    = 24 * time.Hour   // 尝试幂等与提前完成结果保留时间
	CardObservationGatewayLockTTL     = 16 * time.Minute // 覆盖 300 秒超时、两次网络重试及安全余量
	CardObservationGatewayMinInterval = 10 * time.Second // 未配置时的运营商最小请求间隔
)

// CardObservationAttemptDelay 返回固定的立即、3 分钟、5 分钟阶梯延迟。
func CardObservationAttemptDelay(attempt int) time.Duration {
	switch attempt {
	case 1:
		return 0
	case 2:
		return 3 * time.Minute
	case 3:
		return 5 * time.Minute
	default:
		return 0
	}
}

// 卡观测副作用消费状态
const (
	CardObservationEffectStatusPending    = 0 // 等待处理
	CardObservationEffectStatusProcessing = 1 // 正在处理或结果未知
	CardObservationEffectStatusDailySaved = 2 // 日流量缓冲已记录
	CardObservationEffectStatusDeducted   = 3 // 套餐流量已扣减
	CardObservationEffectStatusCompleted  = 4 // 全部副作用已完成
)

// 卡观测副作用类型
const (
	CardObservationEffectTypeTrafficIncrement = "traffic_increment" // 流量正增量副作用
)

// Gateway 轮询 Integration Log 操作编码。
const (
	IntegrationProviderGateway            = "gateway"               // Gateway 外部系统
	IntegrationOperationGatewayRealname   = "query_realname_status" // 查询实名状态
	IntegrationOperationGatewayTraffic    = "query_flow"            // 查询流量
	IntegrationOperationGatewayNetwork    = "query_card_status"     // 查询网络状态
	IntegrationOperationGatewayDeviceInfo = "query_device_info"     // 查询设备信息
	IntegrationOperationGatewaySpeedTier  = "set_speed_tier"        // 设置或恢复固定限速档位
)

// Gateway 固定限速档位编码。
const (
	GatewaySpeedTierRestore = -1 // 恢复不限速
	GatewaySpeedTierZero    = 0  // 限速为 0kbps
	GatewaySpeedTier128K    = 1  // 限速为 128Kbps
	GatewaySpeedTier512K    = 2  // 限速为 512Kbps
	GatewaySpeedTier1M      = 3  // 限速为 1Mbps
	GatewaySpeedTier2M      = 4  // 限速为 2Mbps
	GatewaySpeedTier10M     = 5  // 限速为 10Mbps
	GatewaySpeedTier20M     = 6  // 限速为 20Mbps
	GatewaySpeedTier50M     = 7  // 限速为 50Mbps
	GatewaySpeedTier100M    = 8  // 限速为 100Mbps
)

// IsGatewaySpeedTier 判断编码是否为系统允许的固定限速档位。
func IsGatewaySpeedTier(code int) bool {
	return code >= GatewaySpeedTierRestore && code <= GatewaySpeedTier100M
}

// GetGatewaySpeedTierName 返回固定限速档位中文名称。
func GetGatewaySpeedTierName(code int) string {
	switch code {
	case GatewaySpeedTierRestore:
		return "恢复不限速"
	case GatewaySpeedTierZero:
		return "0kbps"
	case GatewaySpeedTier128K:
		return "128Kbps"
	case GatewaySpeedTier512K:
		return "512Kbps"
	case GatewaySpeedTier1M:
		return "1Mbps"
	case GatewaySpeedTier2M:
		return "2Mbps"
	case GatewaySpeedTier10M:
		return "10Mbps"
	case GatewaySpeedTier20M:
		return "20Mbps"
	case GatewaySpeedTier50M:
		return "50Mbps"
	case GatewaySpeedTier100M:
		return "100Mbps"
	default:
		return "未知"
	}
}

// GatewaySpeedTierUnknownRecoveryStrategy 表示限速超时后的人工核对策略。
const GatewaySpeedTierUnknownRecoveryStrategy = "通过 Gateway 运维侧按 ICCID 核对当前限速档位后，再决定是否重试"

// 卡实名观测场景
const (
	CardObservationSceneRealnamePolling    = "realname_polling"          // 实名轮询
	CardObservationSceneTrafficPolling     = "traffic_polling"           // 流量轮询
	CardObservationSceneNetworkPolling     = "network_polling"           // 网络状态轮询
	CardObservationSceneManualRefresh      = "manual_refresh"            // 手动刷新
	CardObservationSceneCarrierCallback    = "carrier_realname_callback" // 运营商实名回调
	CardObservationSceneClientAssetRead    = "client_asset_read"         // C 端资产详情读取
	CardObservationSceneAdminAssetRead     = "admin_asset_realtime"      // 后台资产实时状态读取
	CardObservationSceneOpenCardTraffic    = "openapi_card_traffic"      // OpenAPI 卡流量读取
	CardObservationSceneOpenCardNetwork    = "openapi_card_network"      // OpenAPI 卡网络读取
	CardObservationSceneOpenCardRealname   = "openapi_card_realname"     // OpenAPI 卡实名读取
	CardObservationSceneOpenDeviceTraffic  = "openapi_device_traffic"    // OpenAPI 设备流量读取
	CardObservationSceneClientRealnameLink = "client_realname_link"      // C 端获取实名链接
	CardObservationSceneAdminRealnameLink  = "admin_realname_link"       // 后台获取实名链接
	CardObservationSceneBusinessStop       = "business_stop"             // 业务停机成功
	CardObservationSceneBusinessResume     = "business_resume"           // 业务复机成功
	CardObservationScenePackageChanged     = "package_changed"           // 购包或套餐激活成功
	CardObservationSceneDeviceSwitchCard   = "device_switch_card"        // 设备切卡成功
	CardObservationSceneDeviceSwitchMode   = "device_switch_mode"        // 设备切卡模式成功
	CardObservationSceneDeviceReboot       = "device_reboot"             // 设备重启成功
	CardObservationSceneDeviceReset        = "device_reset"              // 设备恢复出厂成功
	CardObservationSceneDeviceSetWiFi      = "device_set_wifi"           // 设备 WiFi 设置成功
)

// 卡实名状态变更 Outbox 事件
const (
	OutboxEventTypeCardRealnameChanged     = "card.realname.changed"             // 卡实名状态变化
	CardRealnameChangedPayloadVersionV1    = 1                                   // 卡实名状态变化载荷版本
	OutboxEventTypeCardTrafficIncremented  = "card.traffic.incremented"          // 卡流量正增量
	CardTrafficIncrementedPayloadVersionV1 = 1                                   // 卡流量正增量载荷版本
	OutboxEventTypeCardNetworkChanged      = "card.network.changed"              // 卡网络状态变化
	CardNetworkChangedPayloadVersionV1     = 1                                   // 卡网络状态变化载荷版本
	OutboxEventTypeCardSeriesRequested     = "card.observation.series.requested" // 业务成功请求卡观测序列
	CardSeriesRequestedPayloadVersionV1    = 1                                   // 业务成功观测序列载荷版本
)
