package dto

import "time"

// ========================================
// B1 资产信息
// ========================================

// AssetInfoRequest B1 资产信息请求
type AssetInfoRequest struct {
	Identifier string `json:"identifier" query:"identifier" validate:"required,min=1,max=50" required:"true" minLength:"1" maxLength:"50" description:"资产标识符（SN/IMEI/虚拟号/ICCID/MSISDN）"`
}

// AssetInfoResponse B1 资产信息响应
// 根据 asset_type 不同，设备专属字段或卡专属字段会分别填充（另一侧为零值/omit）
type AssetInfoResponse struct {
	PackageExpiryEstimate
	// === 登录用户信息 ===
	BoundPhone string `json:"bound_phone" description:"当前登录用户绑定的手机号"`

	// === 基础信息（通用） ===
	AssetType               string     `json:"asset_type" description:"资产类型（card:卡, device:设备）"`
	AssetID                 uint       `json:"asset_id" description:"资产ID"`
	Identifier              string     `json:"identifier" description:"资产标识符"`
	VirtualNo               string     `json:"virtual_no" description:"虚拟号"`
	Status                  int        `json:"status" description:"资产归属状态（1:在库, 2:已分销；卡仍沿用原卡状态枚举）"`
	StatusName              string     `json:"status_name" description:"状态名称（中文）"`
	ActivationStatus        int        `json:"activation_status" description:"激活状态（0:未激活, 1:已激活；设备需有生效中主套餐且任意绑定卡已实名）"`
	ActivationStatusName    string     `json:"activation_status_name" description:"激活状态名称（中文）"`
	RealNameStatus          int        `json:"real_name_status" description:"实名状态（0:未实名, 1:已实名）"`
	RealNameStatusName      string     `json:"real_name_status_name" description:"实名状态名称（中文）"`
	RealnamePolicy          string     `json:"realname_policy" description:"实名认证策略 (none:无需实名, before_order:先实名后充值/购买, after_order:先充值/购买后实名)"`
	EffectiveRealnamePolicy string     `json:"effective_realname_policy" description:"当前资产实际生效的实名认证策略 (none:无需实名, before_order:先实名后充值/购买, after_order:先充值/购买后实名)"`
	RealnameRequired        bool       `json:"realname_required" description:"当前资产是否要求完成实名认证"`
	CarrierName             string     `json:"carrier_name" description:"运营商名称"`
	Generation              string     `json:"generation" description:"世代"`
	WalletBalance           int64      `json:"wallet_balance" description:"钱包余额（分）"`
	AllowedPaymentMethods   []string   `json:"allowed_payment_methods" description:"当前资产允许的支付方式列表 (wallet:钱包, wechat:微信, alipay:支付宝)"`
	ActivatedAt             *time.Time `json:"activated_at,omitempty" description:"激活时间"`

	// === 套餐信息（通用） ===
	CurrentPackage            string     `json:"current_package" description:"当前套餐名称（无套餐时为空）"`
	CurrentPackageID          uint       `json:"current_package_id" description:"当前主套餐ID，无主套餐时为0，可用于发起续费"`
	CurrentPackageUsageID     *uint      `json:"current_package_usage_id" description:"当前主套餐的套餐使用记录ID，无主套餐时为 null"`
	CurrentPackageActivatedAt *time.Time `json:"current_package_activated_at,omitempty" description:"当前主套餐开始时间"`
	CurrentPackageExpiresAt   *time.Time `json:"current_package_expires_at,omitempty" description:"当前主套餐过期时间"`
	RealTotalMB               int64      `json:"real_total_mb" description:"当前主套餐真实总量(MB)"`
	RealUsedMB                int64      `json:"real_used_mb" description:"当前主套餐真实已用量(MB)"`
	VirtualTotalMB            int64      `json:"virtual_total_mb" description:"当前主套餐业务停机阈值(MB)"`
	VirtualUsedMB             float64    `json:"virtual_used_mb" description:"当前主套餐展示已用量(MB)"`
	ReductionPct              float64    `json:"reduction_pct" description:"展示增幅比例，公式为(real_total_mb / virtual_total_mb) - 1"`
	EnableVirtualData         bool       `json:"enable_virtual_data" description:"当前主套餐是否启用虚流量（按套餐使用记录快照返回）"`

	// === 设备专属字段（asset_type=device 时有效） ===
	DeviceName          string          `json:"device_name,omitempty" description:"设备名称"`
	IMEI                string          `json:"imei,omitempty" description:"设备IMEI"`
	SN                  string          `json:"sn,omitempty" description:"设备序列号"`
	DeviceModel         string          `json:"device_model,omitempty" description:"设备型号"`
	DeviceType          string          `json:"device_type,omitempty" description:"设备类型"`
	Manufacturer        string          `json:"manufacturer,omitempty" description:"制造商"`
	MaxSimSlots         int             `json:"max_sim_slots,omitempty" description:"最大插槽数"`
	BoundCardCount      int             `json:"bound_card_count,omitempty" description:"绑定卡数量"`
	Cards               []BoundCardInfo `json:"cards,omitempty" description:"绑定卡列表（含每张卡的ICCID/MSISDN/网络状态/实名状态/插槽位置）"`
	DeviceProtectStatus string          `json:"device_protect_status,omitempty" description:"设备保护期状态（none:无, stop:停机保护, start:开机保护）"`

	// === 卡专属字段（asset_type=card 时有效） ===
	ICCID             string `json:"iccid,omitempty" description:"卡ICCID"`
	MSISDN            string `json:"msisdn,omitempty" description:"手机号"`
	CarrierID         uint   `json:"carrier_id,omitempty" description:"运营商ID"`
	CarrierType       string `json:"carrier_type,omitempty" description:"运营商类型（CMCC/CUCC/CTCC/CBN）"`
	NetworkStatus     int    `json:"network_status,omitempty" description:"网络状态（0:停机, 1:开机）"`
	NetworkStatusName string `json:"network_status_name,omitempty" description:"网络状态名称（中文）"`
	GatewayExtend     string `json:"gateway_extend" description:"Gateway 卡状态扩展字段，原样返回上游 extend，用于展示运营商侧实际停机原因"`
	CardCategory      string `json:"card_category,omitempty" description:"卡业务类型（normal:普通卡, industry:行业卡）"`

	// === 卡绑定设备信息（asset_type=card 且绑定了设备时有效） ===
	BoundDeviceID   *uint  `json:"bound_device_id,omitempty" description:"绑定的设备ID"`
	BoundDeviceNo   string `json:"bound_device_no,omitempty" description:"绑定的设备虚拟号"`
	BoundDeviceName string `json:"bound_device_name,omitempty" description:"绑定的设备名称"`

	// === 设备实时状态（来自 Gateway，始终返回，失败时仅含 gateway_msg） ===
	DeviceRealtime *DeviceRealtimeInfo `json:"device_realtime" description:"设备实时状态（始终返回，Gateway 失败时仅含 gateway_msg）"`
}

// DeviceRealtimeInfo 设备实时状态信息
// 全量映射 Gateway DeviceInfoDetail 结构，所有字段均为可选
// 当前 Gateway 同步接口尚未对接，预留结构待后续填充
type DeviceRealtimeInfo struct {
	GatewayMsg *string `json:"gateway_msg" description:"Gateway 上游消息（成功时为 null，失败时为错误信息）"`

	// === 设备状态 ===
	OnlineStatus   *int64  `json:"online_status,omitempty" description:"在线状态（1:在线, 2:离线）"`
	BatteryLevel   *int64  `json:"battery_level,omitempty" description:"电池电量百分比"`
	Status         *int64  `json:"status,omitempty" description:"设备状态（1:正常, 0:禁用）"`
	RunTime        *string `json:"run_time,omitempty" description:"设备本次开机运行时间(秒)"`
	ConnectTime    *string `json:"connect_time,omitempty" description:"设备本次联网时间(秒)"`
	LastOnlineTime *string `json:"last_online_time,omitempty" description:"设备最后在线时间"`
	LastUpdateTime *string `json:"last_update_time,omitempty" description:"设备信息最后更新时间"`

	// === 信号相关 ===
	Rsrp            *int64  `json:"rsrp,omitempty" description:"参考信号接收功率(dBm)"`
	Rsrq            *int64  `json:"rsrq,omitempty" description:"参考信号接收质量(dB)"`
	Rssi            *string `json:"rssi,omitempty" description:"接收信号强度"`
	Sinr            *int64  `json:"sinr,omitempty" description:"信噪比(dB)"`
	SignalQuality   *string `json:"signal_quality,omitempty" description:"信号综合判断（信号很好/信号正常/信号较弱/信号很差/暂无数据）"`
	SignalBadReason *string `json:"signal_bad_reason,omitempty" description:"信号较弱时的怀疑原因提示"`

	// === WiFi 相关 ===
	SSID         *string `json:"ssid,omitempty" description:"WiFi热点名称"`
	WifiEnabled  *bool   `json:"wifi_enabled,omitempty" description:"WiFi开关状态"`
	WifiPassword *string `json:"wifi_password,omitempty" description:"WiFi密码"`

	// === 网络相关 ===
	IPAddress  *string `json:"ip_address,omitempty" description:"IP地址"`
	WANIP      *string `json:"wan_ip,omitempty" description:"基站分配IPv4地址"`
	LANIP      *string `json:"lan_ip" description:"局域网网关IP地址"`
	MACAddress *string `json:"mac_address,omitempty" description:"MAC地址"`

	// === 流量与速率 ===
	DailyUsage *string `json:"daily_usage,omitempty" description:"日使用流量(字节)"`
	DLStats    *string `json:"dl_stats,omitempty" description:"本次开机下载流量(字节)"`
	ULStats    *string `json:"ul_stats,omitempty" description:"本次开机上传流量(字节)"`
	LimitSpeed *int64  `json:"limit_speed,omitempty" description:"限速速率(KB/s)"`

	// === 设备属性 ===
	CurrentIccid    *string `json:"current_iccid,omitempty" description:"当前使用的ICCID"`
	MaxClients      *int64  `json:"max_clients,omitempty" description:"最大连接客户端数"`
	ClientNumber    *int64  `json:"client_number,omitempty" description:"当前已连接客户端数"`
	SoftwareVersion *string `json:"software_version,omitempty" description:"软件版本号"`
	SwitchMode      *int    `json:"switch_mode,omitempty" description:"切卡模式（0:自动, 1:手动）"`
	SyncInterval    *int64  `json:"sync_interval,omitempty" description:"信息上报周期(秒)"`

	// === Gateway 原始标识字段 ===
	DeviceID   *string `json:"device_id,omitempty" description:"Gateway设备ID(IMEI/SN)"`
	DeviceName *string `json:"device_name,omitempty" description:"Gateway返回的设备名称"`
	DeviceType *string `json:"device_type,omitempty" description:"Gateway返回的设备型号"`
	Imei       *string `json:"imei,omitempty" description:"Gateway返回的IMEI号"`
	Imsi       *string `json:"imsi,omitempty" description:"Gateway返回的IMSI"`
	CreatedAt  *int64  `json:"created_at,omitempty" description:"Gateway创建时间(Unix时间戳)"`
	UpdatedAt  *int64  `json:"updated_at,omitempty" description:"Gateway更新时间(Unix时间戳)"`
}

// ========================================
// B2 资产可购套餐列表
// ========================================

// AssetPackageListRequest B2 资产可购套餐列表请求
type AssetPackageListRequest struct {
	Identifier string `json:"identifier" query:"identifier" validate:"required,min=1,max=50" required:"true" minLength:"1" maxLength:"50" description:"资产标识符（SN/IMEI/虚拟号/ICCID/MSISDN）"`
}

// ClientPackageItem B2 客户端套餐项
type ClientPackageItem struct {
	PackageID     uint   `json:"package_id" description:"套餐ID"`
	PackageName   string `json:"package_name" description:"套餐名称"`
	PackageType   string `json:"package_type" description:"套餐类型 (formal:正式套餐, addon:加油包)"`
	RetailPrice   int64  `json:"retail_price" description:"生效零售价（分）"`
	CostPrice     int64  `json:"cost_price" description:"成本价（分）"`
	ValidityDays  int    `json:"validity_days" description:"有效天数（按天套餐为折算总天数，自然月套餐按当前日期推算）"`
	IsAddon       bool   `json:"is_addon" description:"是否加油包"`
	DataAllowance int64  `json:"data_allowance" description:"流量额度"`
	DataUnit      string `json:"data_unit" description:"流量单位"`
	Description   string `json:"description" description:"套餐说明"`
}

// AssetPackageListResponse B2 资产可购套餐列表响应
type AssetPackageListResponse struct {
	Packages []ClientPackageItem `json:"packages" description:"套餐列表"`
}

// ========================================
// B3 资产套餐历史
// ========================================

// AssetPackageHistoryRequest B3 资产套餐历史请求
type AssetPackageHistoryRequest struct {
	Identifier  string  `json:"identifier" query:"identifier" validate:"required,min=1,max=50" required:"true" minLength:"1" maxLength:"50" description:"资产标识符（SN/IMEI/虚拟号/ICCID/MSISDN）"`
	PackageType *string `json:"package_type" query:"package_type" validate:"omitempty,oneof=formal addon" description:"套餐类型 (formal:正式套餐, addon:加油包)"`
	Status      *int    `json:"status" query:"status" validate:"omitempty,min=0,max=4" minimum:"0" maximum:"4" description:"套餐状态 (0:待生效, 1:生效中, 2:已用完, 3:已过期, 4:已失效)"`
	Page        int     `json:"page" query:"page" validate:"required,min=1" required:"true" minimum:"1" description:"页码"`
	PageSize    int     `json:"page_size" query:"page_size" validate:"required,min=1,max=100" required:"true" minimum:"1" maximum:"100" description:"每页数量"`
}

// AssetPackageHistoryResponse B3 资产套餐历史响应
type AssetPackageHistoryResponse struct {
	List     []AssetPackageResponse `json:"items" description:"套餐历史列表"`
	Total    int64                  `json:"total" description:"总数"`
	Page     int                    `json:"page" description:"页码"`
	PageSize int                    `json:"size" description:"每页数量"`
}

// ========================================
// B4 资产刷新
// ========================================

// AssetRefreshRequest B4 资产刷新请求
type AssetRefreshRequest struct {
	Identifier string `json:"identifier" validate:"required,min=1,max=50" required:"true" minLength:"1" maxLength:"50" description:"资产标识符（SN/IMEI/虚拟号/ICCID/MSISDN）"`
}

// AssetRefreshResponse B4 资产刷新响应
type AssetRefreshResponse struct {
	RefreshType     string `json:"refresh_type" description:"刷新类型 (card:卡, device:设备)"`
	Accepted        bool   `json:"accepted" description:"是否已受理"`
	CooldownSeconds int    `json:"cooldown_seconds" description:"冷却秒数"`
}
