/**
 * 资产管理相关类型定义
 * 对应文档：asset-detail-refactor-api-changes.md
 */

// ========== 资产类型枚举 ==========

// 资产类型
type ExpiryBase = 'from_activation' | 'from_purchase'

export type AssetType = 'card' | 'device'

// 网络状态
export enum NetworkStatus {
  OFFLINE = 0, // 停机
  ONLINE = 1 // 开机
}

// 实名状态
export enum RealNameStatus {
  NOT_VERIFIED = 0, // 未实名
  VERIFIED = 1 // 已实名
}

// 保护期状态
export type DeviceProtectStatus = 'none' | 'stop' | 'start'

// 套餐使用状态
export enum PackageUsageStatus {
  PENDING = 0, // 待生效
  ACTIVE = 1, // 生效中
  USED_UP = 2, // 已用完
  EXPIRED = 3, // 已过期
  INVALID = 4 // 已失效
}

// 套餐类型
export type PackageType = 'formal' | 'addon'

// 套餐使用类型
export type UsageType = 'single_card' | 'device'

// ========== 资产详情响应 ==========

export interface AssetResolveParams {
  include_usage_summary?: boolean // 是否返回当前世代流量汇总字段
}

// 资产轮询状态
export interface AssetPollingStatus {
  enabled: boolean // 是否启用轮询
  activity_level: string // 活跃级别
  last_activity_at?: string | null // 最后活跃时间
  last_activity_scene?: string | null // 最后活跃场景
  next_poll_at?: string | null // 下次轮询时间
}

// 资产复机结果
export interface AssetStartResponse {
  status: number // 最新资产状态
  status_name: string // 最新资产状态名称
  real_name_status: RealNameStatus // 最新实名状态
  real_name_status_name: string // 最新实名状态名称
}

// 资产实名认证策略
export type AssetRealnamePolicy = 'none' | 'before_order' | 'after_order'

// 预计最终到期时间状态
export type ExpiryEstimateStatus = 'exact' | 'waiting_activation' | 'none' | 'invalid_data'

// 批量更新资产实名认证策略请求
export interface BatchUpdateAssetRealnamePolicyRequest {
  asset_ids: number[]
  realname_policy: AssetRealnamePolicy
}

// 换货关联资产
export interface AssetExchangeTraceAsset {
  asset_type: string
  asset_id: number | null
  identifier: string
  exchange_no: string
  can_view: boolean
}

// 换货前后代链路
export interface AssetExchangeTrace {
  previous_asset?: AssetExchangeTraceAsset | null
  next_asset?: AssetExchangeTraceAsset | null
}

/**
 * 资产解析/详情响应
 * 对应接口：GET /api/admin/assets/resolve/:identifier
 */
export interface AssetResolveResponse {
  asset_type: AssetType // 资产类型：card 或 device
  asset_id: number // 数据库 ID
  identifier?: string // 原样回传本次查询所用的标识符
  virtual_no: string // 虚拟号
  status: number // 资产状态
  batch_no: string // 批次号
  shop_id: number // 所属店铺 ID
  shop_name: string // 所属店铺名称
  series_id: number // 套餐系列 ID
  series_name: string // 套餐系列名称
  real_name_status: RealNameStatus // 实名状态：0 未实名 / 1 已实名
  realname_policy?: string // 实名认证策略 (none:无需实名, before_order:先实名后充值/购买, after_order:先充值/购买后实名)
  real_name_at?: string | null // 实名时间
  network_status?: NetworkStatus // 网络状态：0 停机 / 1 开机（仅 card）
  current_package: string // 当前套餐名称（无则空）
  current_package_usage_id: number | null // 当前主套餐对应的套餐使用记录 ID，无主套餐时为 null
  real_total_mb: number // 真流量总量
  real_used_mb: number // 真流量已用
  virtual_total_mb: number // 业务停机阈值（展示用）
  virtual_used_mb: number // 展示已用量
  total_virtual_used_mb?: number | null // 所有套餐已用量(MB)，未请求时为 null
  total_virtual_remaining_mb?: number | null // 所有套餐剩余量(MB)，未请求时为 null
  estimated_final_expires_at?: string | null // 当前及排队主套餐接续后的预计最终到期时间
  days_until_final_expiry?: number | null // 距预计最终到期的剩余天数
  expiry_estimate_status?: ExpiryEstimateStatus // 预计最终到期时间状态
  expiry_estimate_status_name?: string | null // 预计最终到期时间状态名称
  is_expiring?: boolean // 是否临期，由后端判断
  reduction_pct: number // 展示增幅比例（小数，如 0.428571）
  device_protect_status?: DeviceProtectStatus // 保护期状态：none / stop / start（仅 device）
  activated_at: string // 激活时间
  created_at: string // 创建时间
  updated_at: string // 更新时间
  accumulated_recharge?: number // 累计充值金额(分)
  first_commission_paid?: boolean // 一次性佣金是否已发放
  polling?: AssetPollingStatus | null // 资产轮询状态
  exchange_trace?: AssetExchangeTrace | null // 换货前后代链路

  // ===== 卡专属字段 (asset_type === 'card' 时) =====
  iccid?: string // ICCID
  bound_device_id?: number // 绑定设备 ID
  bound_device_no?: string // 绑定设备虚拟号
  bound_device_name?: string // 绑定设备名称
  carrier_id?: number // 运营商ID
  carrier_type?: string // 运营商类型
  carrier_name?: string // 运营商名称
  msisdn?: string // 手机号
  imsi?: string // IMSI
  card_category?: string // 卡业务类型
  supplier?: string // 供应商
  activation_status?: number // 激活状态
  enable_polling?: boolean // 是否参与轮询
  gateway_card_imei?: string // Gateway 返回的卡 IMEI
  gateway_extend?: string // Gateway 卡状态扩展字段，原样返回上游 extend

  // ===== 设备专属字段 (asset_type === 'device' 时) =====
  bound_card_count?: number // 绑定卡数量
  cards?: AssetBoundCard[] // 绑定卡列表
  device_name?: string // 设备名称
  imei?: string // IMEI
  sn?: string // 序列号
  device_model?: string // 设备型号
  device_type?: string // 设备类型
  max_sim_slots?: number // 最大插槽数
  manufacturer?: string // 制造商
  online_status?: number // 在线状态：0=未知, 1=在线, 2=离线（仅 device）
  last_online_time?: string | null // 最后在线时间（仅 device）
  software_version?: string // 固件版本号（仅 device）
  switch_mode?: string // 切卡模式："0"=自动, "1"=手动（仅 device）
  last_gateway_sync_at?: string | null // 最后 sync-info 同步时间（仅 device）
  extend?: any // 扩展信息字段
}

/**
 * 设备绑定的卡信息
 */
export interface AssetBoundCard {
  card_id: number // 卡 ID
  iccid: string // ICCID
  msisdn: string // 手机号
  network_status: NetworkStatus // 网络状态
  real_name_status: RealNameStatus // 实名状态
  real_name_at?: string | null // 实名时间
  realname_policy?: string // 实名认证策略
  slot_position: number // 插槽位置
  is_current?: boolean // 是否为设备当前使用的卡
  gateway_extend?: string // Gateway 卡状态扩展字段，原样返回上游 extend
  last_data_check_at?: string | null // 流量同步时间
  last_real_name_check_at?: string | null // 实名同步时间
  last_card_status_check_at?: string | null // 卡状态同步时间
}

// ========== 资产实时状态响应 ==========

/**
 * 设备 Gateway 实时信息
 */
export interface DeviceGatewayInfo {
  online_status?: number // 1=在线, 2=离线
  battery_level?: number | null // 电量 %（无电池时 null）
  status?: number // 设备状态 1=正常, 0=禁用
  run_time?: string // 本次开机时长(秒)
  connect_time?: string // 本次联网时长(秒)
  last_online_time?: string // 设备最后在线时间
  last_sync_time?: string // 最后同步时间
  last_update_time?: string // 信息最后更新时间
  signal_quality?: string // 信号综合判断
  signal_bad_reason?: string // 信号较弱原因提示
  rsrp?: number // 信号接收功率(dBm)
  rsrq?: number // 信号接收质量(dB)
  rssi?: string // 信号强度
  sinr?: number // 信噪比(dB)
  ssid?: string // WiFi 热点名称
  wifi_enabled?: boolean // WiFi 开关
  wifi_password?: string // WiFi 密码
  ip_address?: string // IP
  wan_ip?: string // 基站分配 IPv4
  lan_ip?: string // 局域网网关 IP
  mac_address?: string // MAC 地址
  limit_speed?: number // 限速(KB/s)，0=不限
  current_iccid?: string // 当前使用卡 ICCID
  client_number?: number // 当前已连接客户端数
  max_clients?: number // 最大连接客户端数
  software_version?: string // 固件版本
  switch_mode?: string // 切卡模式
  sync_interval?: number // 上报周期(秒)
  device_id?: string // Gateway 设备ID
  device_name?: string // Gateway 设备名称
  device_type?: string // Gateway 设备类型
  imei?: string
  imsi?: string
}

/**
 * 资产实时状态响应
 * 对应接口：GET /api/admin/assets/:asset_type/:id/realtime-status
 */
export interface AssetRealtimeStatusResponse {
  asset_type: AssetType // 资产类型
  asset_id: number // 资产 ID

  // ===== 卡专属字段 =====
  network_status?: NetworkStatus // 网络状态（仅 card）
  real_name_status?: RealNameStatus // 实名状态（仅 card）
  realname_policy?: string // 实名认证策略（仅 card）
  gateway_card_imei?: string // Gateway 返回的卡 IMEI
  current_month_usage_mb?: number // 本月已用流量 MB（仅 card）
  last_gateway_reading_mb?: number // 运营商周期月内已用流量 MB（仅 card）
  last_sync_time?: string | null // 最后同步时间（仅 card）
  last_data_check_at?: string | null // 流量同步时间
  last_real_name_check_at?: string | null // 实名同步时间
  last_card_status_check_at?: string | null // 卡状态同步时间

  // ===== 设备专属字段 =====
  device_protect_status?: DeviceProtectStatus // 保护期（仅 device）
  cards?: AssetBoundCard[] // 所有绑定卡的状态（仅 device）
  online_status?: number // 在线状态（仅 device）
  last_online_time?: string | null // 最后在线时间（仅 device）
  software_version?: string // 固件版本号（仅 device）
  switch_mode?: string // 切卡模式（仅 device）
  last_gateway_sync_at?: string | null // 最后同步时间（仅 device）
  device_realtime?: DeviceGatewayInfo | null // Gateway 实时数据（仅 device，Gateway 不可达时为 null）
}

/**
 * 资产刷新响应（结构与 realtime-status 完全相同）
 * 对应接口：POST /api/admin/assets/:asset_type/:id/refresh
 */
export type AssetRefreshResponse = AssetRealtimeStatusResponse

// ========== 资产套餐查询响应 ==========

/**
 * 资产套餐使用记录
 * 对应接口：GET /api/admin/assets/:asset_type/:id/packages
 */
export interface AssetPackageUsageRecord {
  id?: number // 兼容前端当前映射字段
  package_usage_id?: number // 套餐使用记录 ID
  package_id?: number // 套餐 ID
  package_name?: string // 套餐名称
  order_no?: string // 订单号
  package_type?: PackageType // formal（正式套餐）/ addon（加油包）
  usage_type?: UsageType // 使用类型：single_card/device
  status?: PackageUsageStatus // 0 待生效 / 1 生效中 / 2 已用完 / 3 已过期 / 4 已失效
  status_name?: string // 状态中文名
  real_total_mb?: number // 真流量总量（百分比以此为基准）
  real_used_mb?: number // 真流量已用
  real_remaining_mb?: number // 兼容前端当前映射字段
  virtual_total_mb?: number // 业务停机阈值
  virtual_used_mb?: number // 展示已用量
  virtual_remaining_mb?: number // 兼容前端当前映射字段
  virtual_ratio?: number // 虚流量比例（real/virtual）
  reduction_pct?: number // 展示增幅比例（小数，如 0.428571）
  enable_virtual_data?: boolean // 是否启用虚流量
  paid_amount?: number // 实际支付金额（分）
  retail_amount?: number // 零售价（分）
  package_price?: number // 套餐价格（分）
  start_time?: string // 开始时间（兼容前端现有映射字段）
  expire_time?: string // 到期时间（兼容前端现有映射字段）
  duration_days?: number // 套餐时长（兼容前端现有映射字段）
  activated_at?: string // 激活时间
  expires_at?: string // 到期时间
  master_usage_id?: number | null // 主套餐 ID（加油包时有值）
  priority?: number // 优先级
  created_at?: string // 创建时间
  order_id?: number // 订单ID
  refund_id?: number // 退款ID（有退款时才有值）
}

/**
 * 资产套餐列表分页响应
 * 对应接口：GET /api/admin/assets/:asset_type/:id/packages?page=1&page_size=50
 */
export interface AssetPackageUsageRecord {
  expiry_base?: ExpiryBase | null // 到期计时基准
}

export interface AssetPackageListResponse {
  total: number // 总记录数
  page: number // 当前页码
  page_size: number // 每页数量
  items: AssetPackageUsageRecord[] // 套餐记录列表
}

/**
 * 资产套餐查询参数
 */
export interface AssetPackageParams {
  page?: number // 页码，默认1
  page_size?: number // 每页数量，默认50
}

export interface UpdateAssetPackageUsedDataRequest {
  data_usage_mb: number | null // 新的套餐真实已用量(MB)
}

export interface UpdateAssetPackageExpiresAtRequest {
  expires_at: string // 新的套餐过期时间，格式：YYYY-MM-DD HH:MM:SS 或 RFC3339
}

/**
 * 当前套餐响应（结构同套餐使用记录单项）
 * 对应接口：GET /api/admin/assets/:asset_type/:id/current-package
 */
export type AssetCurrentPackageResponse = AssetPackageUsageRecord

// ========== 设备停复机响应 ==========

/**
 * 设备批量停机响应
 * 对应接口：POST /api/admin/assets/device/:device_id/stop
 */
export interface DeviceStopResponse {
  message: string // 操作结果描述
  success_count: number // 成功停机的卡数量
  failed_cards: DeviceStopFailedCard[] // 停机失败列表
}

/**
 * 停机失败的卡信息
 */
export interface DeviceStopFailedCard {
  iccid: string // ICCID
  reason: string // 失败原因
}

/**
 * 设备批量复机响应（HTTP 200 即成功，无 body）
 * 对应接口：POST /api/admin/assets/device/:device_id/start
 */
export type DeviceStartResponse = void

/**
 * 单卡停机响应（HTTP 200 即成功，无 body）
 * 对应接口：POST /api/admin/assets/card/:iccid/stop
 */
export type CardStopResponse = void

/**
 * 单卡复机响应（HTTP 200 即成功，无 body）
 * 对应接口：POST /api/admin/assets/card/:iccid/start
 */
export type CardStartResponse = void

// ========== 钱包流水响应 ==========

/**
 * 交易类型
 */
export type TransactionType = 'recharge' | 'deduct' | 'refund'

/**
 * 关联业务类型
 */
export type ReferenceType = 'recharge' | 'order'

/**
 * 钱包流水单项
 */
export interface AssetWalletTransactionItem {
  id?: number // 流水记录ID
  transaction_type?: TransactionType // 交易类型：recharge/deduct/refund
  transaction_type_text?: string // 交易类型文本：充值/扣款/退款
  amount?: number // 变动金额（分），充值为正数，扣款/退款为负数
  balance_before?: number // 变动前余额（分）
  balance_after?: number // 变动后余额（分）
  reference_type?: ReferenceType | null // 关联业务类型：recharge 或 order（可空）
  reference_no?: string | null // 关联业务编号：充值单号（CRCH…）或订单号（ORD…）（可空）
  remark?: string | null // 备注（可空）
  created_at?: string // 流水创建时间（RFC3339）
}

/**
 * 钱包流水列表响应
 * 对应接口：GET /api/admin/assets/:asset_type/:id/wallet/transactions
 */
export interface AssetWalletTransactionListResponse {
  items?: AssetWalletTransactionItem[] | null // 流水列表（当前接口结构）
  list?: AssetWalletTransactionItem[] | null // 流水列表（兼容旧结构）
  page?: number // 当前页码
  size?: number // 每页数量（当前接口结构）
  page_size?: number // 每页数量（兼容旧结构）
  total?: number // 总记录数
  total_pages?: number // 总页数
}

/**
 * 钱包流水查询参数
 */
export interface AssetWalletTransactionParams {
  page?: number // 页码，默认1
  page_size?: number // 每页数量，默认20，最大100
  transaction_type?: TransactionType | null // 交易类型过滤：recharge/deduct/refund
  start_time?: string | null // 开始时间（RFC3339）
  end_time?: string | null // 结束时间（RFC3339）
}

// ========== 钱包概况响应 ==========

/**
 * 资产钱包概况响应
 * 对应接口：GET /api/admin/assets/:asset_type/:id/wallet
 */
export interface AssetWalletResponse {
  wallet_id?: number // 钱包数据库ID
  resource_id?: number // 对应卡或设备的数据库ID
  resource_type?: string // 资源类型：iot_card 或 device
  balance?: number // 总余额（分）
  frozen_balance?: number // 冻结余额（分）
  available_balance?: number // 可用余额 = balance - frozen_balance（分）
  currency?: string // 币种，目前固定 CNY
  status?: number // 钱包状态：1-正常 2-冻结 3-关闭
  status_text?: string // 状态文本
  created_at?: string // 创建时间（RFC3339）
  updated_at?: string // 更新时间（RFC3339）
}

// ========== 资产历史订单 ==========

/**
 * 资产历史订单查询参数
 */
export interface AssetOrdersParams {
  page?: number // 页码，默认 1
  page_size?: number // 每页条数，默认 20，最大 100
  include_previous?: boolean // 是否追溯换货前代，默认 false
}

/**
 * 订单项
 */
export interface AssetOrderItem {
  package_name: string // 套餐名称
  quantity: number // 数量
  unit_price: number // 单价（分）
  amount: number // 金额（分）
}

/**
 * 订单信息
 */
export interface AssetOrder {
  order_no: string // 订单号
  order_type: string // 订单类型
  payment_status: number // 支付状态
  payment_status_text: string // 支付状态文本
  total_amount: number // 总金额（分）
  payment_method: string // 支付方式
  paid_at?: string // 支付时间
  generation?: number // 代数
  items: AssetOrderItem[] // 订单项
  created_at: string // 创建时间
}

/**
 * 代订单信息
 */
export interface GenerationOrders {
  generation: number // 代数
  identifier: string // 标识符
  asset_type: string // 资产类型
  exchange_no?: string // 换货单号（前代才有）
  exchanged_at?: string // 换货时间（前代才有）
  total: number // 订单总数
  page?: number // 页码（当前代才有）
  page_size?: number // 每页条数（当前代才有）
  items: AssetOrder[] // 订单列表
}

/**
 * 资产历史订单响应
 */
export interface AssetOrdersResponse {
  current_generation: GenerationOrders // 当前代订单
  previous_generations?: GenerationOrders[] // 前代订单（仅 include_previous=true 时有）
  truncated: boolean // 是否截断（换货链超过 10 代）
}

// ========== 更新实名状态 ==========

/**
 * 更新实名状态请求
 */
export interface UpdateAssetRealnameStatusRequest {
  real_name_status: 0 | 1 // 实名状态 (0:未实名, 1:已实名)
}

/**
 * 更新实名状态响应
 */
export interface DtoUpdateAssetRealnameStatusResponse {
  asset_id: number // 资产ID
  asset_type: string // 资产类型 (card:IoT卡)
  first_realname_at: string | null // 首次实名时间（仅已实名时可能有值）
  real_name_status: number // 更新后的实名状态 (0:未实名, 1:已实名)
  real_name_status_name: string // 实名状态名称（中文）
}

// ========== 资产操作审计日志 ==========

/**
 * 操作审计日志项
 */
export interface AssetOperationLogItem {
  id: number // 日志ID
  asset_id: number // 资产ID
  asset_identifier: string // 资产标识符
  asset_type: string // 资产类型
  operation_type: string // 操作类型
  operation_desc: string // 操作描述
  result_status: 'success' | 'failed' | 'denied' // 执行结果
  created_at: string // 创建时间
  operator_id?: number // 操作人ID
  operator_name: string // 操作人名称
  operator_type: string // 操作人类型
  before_data: Record<string, any> // 操作前数据（原始）
  after_data: Record<string, any> // 操作后数据（原始）
  operation_content_before?: Record<string, any> // 操作内容（变更前）
  operation_content_after?: Record<string, any> // 操作内容（变更后）
  operation_fields_desc?: Record<string, string> // 字段中文说明
  batch_total: number // 批量总数
  success_count: number // 成功数量
  fail_count: number // 失败数量
  failed_items?: Array<{ iccid?: string; reason?: string }> // 失败明细
  reason?: string // 原因说明
}

/**
 * 资产操作审计日志响应
 */
export interface AssetOperationLogsResponse {
  items: AssetOperationLogItem[] // 日志列表
  page: number // 当前页码
  page_size: number // 每页数量
  total: number // 总记录数
}

/**
 * 资产操作审计日志查询参数
 */
export interface AssetOperationLogsParams {
  page?: number // 页码，默认1
  page_size?: number // 每页条数，默认20，最大100
  operation_type?: string // 操作类型
  result_status?: 'success' | 'failed' | 'denied' // 执行结果
}
