package dto

import "time"

// AssetResolveResponse 统一资产解析响应
type AssetResolveResponse struct {
	PackageExpiryEstimate
	AssetType   string     `json:"asset_type" description:"资产类型：card 或 device"`
	AssetID     uint       `json:"asset_id" description:"资产数据库ID"`
	Identifier  string     `json:"identifier,omitempty" description:"解析时使用的标识符"`
	VirtualNo   string     `json:"virtual_no" description:"虚拟号"`
	Status      int        `json:"status" description:"资产归属状态 (1:在库, 2:已分销；卡仍沿用原卡状态枚举)"`
	StatusName  string     `json:"status_name" description:"资产状态名称（中文）"`
	BatchNo     string     `json:"batch_no" description:"批次号"`
	ShopID      *uint      `json:"shop_id,omitempty" description:"所属店铺ID"`
	ShopName    string     `json:"shop_name,omitempty" description:"所属店铺名称"`
	SeriesID    *uint      `json:"series_id,omitempty" description:"套餐系列ID"`
	SeriesName  string     `json:"series_name,omitempty" description:"套餐系列名称"`
	ActivatedAt *time.Time `json:"activated_at,omitempty" description:"激活时间（未来准备移除，请勿依赖）"`
	CreatedAt   time.Time  `json:"created_at" description:"创建时间"`
	UpdatedAt   time.Time  `json:"updated_at" 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已实名"`
	RealNameAt                *time.Time `json:"real_name_at" description:"最近一次完成实名的时间，未实名时为 null"`
	RealnamePolicy            string     `json:"realname_policy" description:"实名认证策略 (none:无需实名, before_order:先实名后充值/购买, after_order:先充值/购买后实名)"`
	CurrentPackage            string     `json:"current_package" description:"当前套餐名称（无套餐时为空）"`
	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:"当前主套餐是否启用虚流量（按套餐使用记录快照返回）"`
	DeviceProtectStatus       string     `json:"device_protect_status,omitempty" description:"设备保护期状态：none/stop/start（仅asset_type=device时有效）"`
	// 绑定关系字段
	ICCID           string          `json:"iccid,omitempty" description:"卡ICCID（asset_type=card时有效）"`
	BoundDeviceID   *uint           `json:"bound_device_id,omitempty" description:"绑定的设备ID（asset_type=card时有效）"`
	BoundDeviceNo   string          `json:"bound_device_no,omitempty" description:"绑定的设备虚拟号（asset_type=card时有效）"`
	BoundDeviceName string          `json:"bound_device_name,omitempty" description:"绑定的设备名称（asset_type=card时有效）"`
	BoundCardCount  int             `json:"bound_card_count,omitempty" description:"绑定的卡数量（asset_type=device时有效）"`
	Cards           []BoundCardInfo `json:"cards,omitempty" description:"绑定的卡列表（asset_type=device时有效）"`
	// 设备专属字段（card类型时为零值）
	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:"设备类型"`
	MaxSimSlots  int    `json:"max_sim_slots,omitempty" description:"最大插槽数"`
	Manufacturer string `json:"manufacturer,omitempty" description:"制造商"`
	// 设备 DB 缓存字段（Phase 3 sync-info 写入，展示上次同步快照）
	OnlineStatus      int        `json:"online_status,omitempty" description:"在线状态：0未知 1在线 2离线（设备类型时有效）"`
	LastOnlineTime    *time.Time `json:"last_online_time,omitempty" description:"最后在线时间（设备类型时有效）"`
	SoftwareVersion   string     `json:"software_version,omitempty" description:"固件版本号（设备类型时有效）"`
	SwitchMode        string     `json:"switch_mode,omitempty" description:"切卡模式：0=自动，1=手动（设备类型时有效）"`
	LastGatewaySyncAt *time.Time `json:"last_gateway_sync_at,omitempty" description:"最后 sync-info 同步时间（设备类型时有效）"`
	// 卡专属字段（device类型时为零值）
	CarrierID       uint   `json:"carrier_id,omitempty" description:"运营商ID"`
	CarrierType     string `json:"carrier_type,omitempty" description:"运营商类型"`
	CarrierName     string `json:"carrier_name,omitempty" description:"运营商名称"`
	MSISDN          string `json:"msisdn,omitempty" description:"手机号"`
	IMSI            string `json:"imsi,omitempty" description:"IMSI"`
	CardCategory    string `json:"card_category,omitempty" description:"卡业务类型"`
	Supplier        string `json:"supplier,omitempty" description:"供应商"`
	EnablePolling   bool   `json:"enable_polling" description:"是否参与轮询"`
	NetworkStatus   int    `json:"network_status" description:"网络状态：0停机 1开机（asset_type=card时有效）"`
	GatewayExtend   string `json:"gateway_extend" description:"Gateway 卡状态扩展字段，原样返回上游 extend，用于展示运营商侧实际停机原因"`
	GatewayCardIMEI string `json:"gateway_card_imei" description:"插拔卡业务 IMEI（由 Gateway 卡状态接口同步，非设备自身 IMEI，无业务含义，仅供查看）"`
	// 流量汇总字段（仅在 ?include_usage_summary=true 时返回非 null 值）
	TotalVirtualUsedMB      *float64            `json:"total_virtual_used_mb" description:"当前世代所有套餐虚已用之和（MB），未请求时为 null"`
	TotalVirtualRemainingMB *float64            `json:"total_virtual_remaining_mb" description:"当前世代所有套餐虚剩余之和（MB），未请求时为 null"`
	ExchangeTrace           *AssetExchangeTrace `json:"exchange_trace" description:"换货链路；对象始终存在，前代或后代不存在时对应字段为 null"`
}

// AssetExchangeTrace 资产单节点双向换货链路。
type AssetExchangeTrace struct {
	PreviousAsset *AssetExchangeTraceItem `json:"previous_asset" nullable:"true" description:"当前资产的换货前代，不存在时为 null"`
	NextAsset     *AssetExchangeTraceItem `json:"next_asset" nullable:"true" description:"当前资产的换货后代，不存在时为 null"`
}

// AssetExchangeTraceItem 换货链路中的单个关联资产。
type AssetExchangeTraceItem struct {
	AssetType  string `json:"asset_type" description:"资产类型 (iot_card:物联网卡, device:设备)"`
	AssetID    *uint  `json:"asset_id" description:"关联资产数据库 ID；无权限时为 null"`
	Identifier string `json:"identifier" description:"换货单保存的不可变资产标识快照"`
	ExchangeNo string `json:"exchange_no" description:"换货单号"`
	CanView    bool   `json:"can_view" description:"是否有权跳转查看关联资产"`
}

// BoundCardInfo 设备绑定的卡信息
type BoundCardInfo struct {
	CardID                uint       `json:"card_id" description:"卡ID"`
	ICCID                 string     `json:"iccid" description:"ICCID"`
	MSISDN                string     `json:"msisdn,omitempty" description:"手机号"`
	NetworkStatus         int        `json:"network_status" description:"网络状态：0停机 1开机"`
	RealNameStatus        int        `json:"real_name_status" description:"实名状态：0未实名 1已实名"`
	RealNameAt            *time.Time `json:"real_name_at" description:"该卡最近一次完成实名的时间，未实名时为 null"`
	SlotPosition          int        `json:"slot_position,omitempty" description:"插槽位置"`
	IsCurrent             bool       `json:"is_current" description:"是否为当前使用的卡"`
	CarrierID             uint       `json:"carrier_id,omitempty" description:"运营商ID"`
	CarrierType           string     `json:"carrier_type,omitempty" description:"运营商类型"`
	CarrierName           string     `json:"carrier_name,omitempty" description:"运营商名称"`
	RealnamePolicy        string     `json:"realname_policy" description:"实名认证策略 (none:无需实名, before_order:先实名后充值/购买, after_order:先充值/购买后实名)"`
	GatewayExtend         string     `json:"gateway_extend" description:"Gateway 卡状态扩展字段，原样返回上游 extend，用于展示运营商侧实际停机原因"`
	LastSyncTime          *time.Time `json:"last_sync_time" description:"最后同步时间"`
	LastDataCheckAt       *time.Time `json:"last_data_check_at" description:"最后一次流量检查时间"`
	LastRealNameCheckAt   *time.Time `json:"last_real_name_check_at" description:"最后一次实名检查时间"`
	LastCardStatusCheckAt *time.Time `json:"last_card_status_check_at" description:"最后一次卡状态检查时间"`
}

// AssetRealtimeStatusResponse 资产实时状态（只读DB/Redis）
type AssetRealtimeStatusResponse struct {
	AssetType             string             `json:"asset_type" description:"资产类型：card 或 device"`
	AssetID               uint               `json:"asset_id" description:"资产ID"`
	NetworkStatus         int                `json:"network_status" description:"网络状态（asset_type=card时有效）：0停机 1开机"`
	GatewayExtend         string             `json:"gateway_extend" description:"Gateway 卡状态扩展字段，原样返回上游 extend，用于展示运营商侧实际停机原因"`
	GatewayCardIMEI       string             `json:"gateway_card_imei" description:"插拔卡业务 IMEI（由 Gateway 卡状态接口同步，非设备自身 IMEI，无业务含义，仅供查看）"`
	RealNameStatus        int                `json:"real_name_status" description:"实名状态（asset_type=card时有效）：0未实名 1已实名"`
	RealnamePolicy        string             `json:"realname_policy,omitempty" description:"实名认证策略 (none:无需实名, before_order:先实名后充值/购买, after_order:先充值/购买后实名)"`
	CurrentMonthUsageMB   float64            `json:"current_month_usage_mb,omitempty" description:"系统自然月累计流量(MB，asset_type=card时有效，不等于运营商周期口径)"`
	LastGatewayReadingMB  float64            `json:"last_gateway_reading_mb,omitempty" description:"运营商当前周期累计流量读数(MB，asset_type=card时有效，运营商口径展示建议读取该字段)"`
	LastSyncTime          *time.Time         `json:"last_sync_time" description:"最后同步时间（asset_type=card时有效）"`
	LastDataCheckAt       *time.Time         `json:"last_data_check_at" description:"最后一次流量检查时间（asset_type=card时有效）"`
	LastRealNameCheckAt   *time.Time         `json:"last_real_name_check_at" description:"最后一次实名检查时间（asset_type=card时有效）"`
	LastCardStatusCheckAt *time.Time         `json:"last_card_status_check_at" description:"最后一次卡状态检查时间（asset_type=card时有效）"`
	DeviceProtectStatus   string             `json:"device_protect_status,omitempty" description:"保护期状态（asset_type=device时有效）：none/stop/start"`
	Cards                 []BoundCardInfo    `json:"cards,omitempty" description:"绑定卡状态列表（asset_type=device时有效）"`
	DeviceRealtime        *DeviceGatewayInfo `json:"device_realtime" description:"设备实时状态（来自 Gateway sync-info，始终返回，失败时仅含 gateway_msg）"`
}

// AssetPackageResponse 资产套餐信息
type AssetPackageResponse struct {
	PackageUsageID    uint       `json:"package_usage_id" description:"套餐使用记录ID"`
	PackageID         uint       `json:"package_id" description:"套餐ID"`
	PackageName       string     `json:"package_name" description:"套餐名称"`
	PackageType       string     `json:"package_type" description:"套餐类型：formal/addon"`
	ExpiryBase        string     `json:"expiry_base,omitempty" description:"到期时间基准 (from_activation:实名激活时起算, from_purchase:购买时起算)"`
	OrderID           uint       `json:"order_id" description:"关联订单ID（无订单分配时为0）"`
	OrderNo           string     `json:"order_no,omitempty" description:"订单号快照（无订单分配时为空）"`
	RefundID          *uint      `json:"refund_id,omitempty" description:"退款主键ID快照（未退款时为空）"`
	RefundNo          string     `json:"refund_no,omitempty" description:"退款单号快照（未退款时为空）"`
	UsageType         string     `json:"usage_type" description:"使用类型：single_card/device"`
	Status            int        `json:"status" description:"状态：0待生效 1生效中 2已用完 3已过期 4已失效"`
	StatusName        string     `json:"status_name" 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:"是否启用虚流量（按套餐使用记录快照返回）"`
	ActivatedAt       *time.Time `json:"activated_at,omitempty" description:"激活时间（待生效套餐为空）"`
	ExpiresAt         *time.Time `json:"expires_at,omitempty" description:"到期时间（待生效套餐为空）"`
	MasterUsageID     *uint      `json:"master_usage_id,omitempty" description:"主套餐ID（加油包时有值）"`
	Priority          int        `json:"priority" description:"优先级"`
	PaidAmount        *int64     `json:"paid_amount,omitempty" description:"购买成本价（分），仅平台账号可见，非平台账号不返回此字段"`
	RetailAmount      *int64     `json:"retail_amount,omitempty" description:"购买零售价（分），无订单关联时为空"`
	CreatedAt         time.Time  `json:"created_at" description:"创建时间"`
}

// AssetPackagesResult 套餐列表分页结果
type AssetPackagesResult struct {
	Total    int64                   `json:"total" description:"总条数"`
	Page     int                     `json:"page" description:"当前页码"`
	PageSize int                     `json:"page_size" description:"每页条数"`
	Items    []*AssetPackageResponse `json:"items" description:"套餐列表"`
}

// AssetResolveRequest 资产解析请求
type AssetResolveRequest struct {
	Identifier          string `path:"identifier" description:"资产标识符（虚拟号/ICCID/IMEI/SN/MSISDN）" required:"true"`
	IncludeUsageSummary bool   `query:"include_usage_summary" description:"是否返回当前世代流量汇总字段（total_virtual_used_mb / total_virtual_remaining_mb），默认 false"`
}

// AssetIdentifierRequest 资产标识符路径参数请求
type AssetIdentifierRequest struct {
	Identifier string `path:"identifier" description:"资产标识符（ICCID 或 VirtualNo）" required:"true"`
}

// AssetTypeIDRequest 资产类型+ID请求（路径参数，保留用于钱包等向后兼容场景）
type AssetTypeIDRequest struct {
	AssetType string `path:"asset_type" description:"资产类型：card 或 device" required:"true"`
	ID        uint   `path:"id" description:"资产ID" required:"true"`
}

// AssetPackagesRequest 资产套餐列表请求（路径参数 + 分页 + 状态筛选）
type AssetPackagesRequest struct {
	Identifier string `path:"identifier" description:"资产标识符（虚拟号/ICCID/IMEI/SN/MSISDN）" required:"true"`
	Page       int    `query:"page" validate:"omitempty,min=1" minimum:"1" description:"页码（默认1）"`
	PageSize   int    `query:"page_size" validate:"omitempty,min=1,max=100" minimum:"1" maximum:"100" description:"每页条数（默认50，最大100）"`
	Status     *int   `query:"status" validate:"omitempty,min=0,max=4" minimum:"0" maximum:"4" description:"套餐状态 (0:待生效, 1:生效中, 2:已用完, 3:已过期, 4:已失效)"`
}

// UpdateAssetPackageExpiresAtRequest 修改资产套餐过期时间请求
type UpdateAssetPackageExpiresAtRequest struct {
	Identifier     string `path:"identifier" description:"资产标识符（虚拟号/ICCID/IMEI/SN/MSISDN）" required:"true"`
	PackageUsageID uint   `path:"package_usage_id" description:"套餐使用记录ID" required:"true"`
	ExpiresAt      string `json:"expires_at" validate:"required" required:"true" description:"新的套餐过期时间，格式：YYYY-MM-DD HH:MM:SS 或 RFC3339"`
}

// UpdateAssetPackageUsageRequest 修改资产套餐已用量请求
type UpdateAssetPackageUsageRequest struct {
	Identifier     string `path:"identifier" description:"资产标识符（虚拟号/ICCID/IMEI/SN/MSISDN）" required:"true"`
	PackageUsageID uint   `path:"package_usage_id" description:"套餐使用记录ID" required:"true"`
	DataUsageMB    *int64 `json:"data_usage_mb" validate:"required,min=0" required:"true" minimum:"0" description:"新的套餐真实已用量(MB)"`
}

// DeviceIDRequest 设备ID请求（路径参数）
type DeviceIDRequest struct {
	DeviceID uint `path:"device_id" description:"设备ID" required:"true"`
}

// CardICCIDRequest 卡ICCID请求（路径参数）
type CardICCIDRequest struct {
	ICCID string `path:"iccid" description:"卡ICCID" required:"true"`
}

// DeviceGatewayInfo B端设备实时状态信息（来自 Gateway sync-info）
// 与 C 端 DeviceRealtimeInfo 独立，未来可展示更多技术字段
// 所有字段均为可选；Gateway 调用失败时仅填充 GatewayMsg
type DeviceGatewayInfo struct {
	// Gateway 上游消息（成功时为 null，失败时为错误信息）
	GatewayMsg *string `json:"gateway_msg" description:"Gateway 上游消息（成功时为 null，失败时为错误信息）"`

	// 设备状态
	OnlineStatus   *int    `json:"online_status,omitempty" description:"在线状态：1=在线，2=离线"`
	BatteryLevel   *int    `json:"battery_level,omitempty" description:"电池电量百分比（无电池时为null）"`
	Status         *int    `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            *int    `json:"rsrp,omitempty" description:"参考信号接收功率(dBm)"`
	Rsrq            *int    `json:"rsrq,omitempty" description:"参考信号接收质量(dB)"`
	Rssi            *string `json:"rssi,omitempty" description:"接收信号强度"`
	Sinr            *int    `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,omitempty" 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 *int    `json:"limit_speed,omitempty" description:"限速速率(KB/s)"`

	// 设备属性
	CurrentIccid    *string `json:"current_iccid,omitempty" description:"当前使用的ICCID"`
	MaxClients      *int    `json:"max_clients,omitempty" description:"最大连接客户端数"`
	ClientNumber    *int    `json:"client_number,omitempty" description:"当前已连接客户端数"`
	SoftwareVersion *string `json:"software_version,omitempty" description:"软件版本号"`
	SwitchMode      *string `json:"switch_mode,omitempty" description:"切卡模式：0=自动，1=手动"`
	SyncInterval    *int    `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:"IMEI号"`
	IMSI       *string `json:"imsi,omitempty" description:"IMSI用户标识码"`
}

// AssetOrdersRequest 资产历史订单查询请求
type AssetOrdersRequest struct {
	Identifier      string `path:"identifier" description:"资产标识符（ICCID 或 VirtualNo）" required:"true"`
	Page            int    `query:"page" validate:"omitempty,min=1" minimum:"1" description:"页码（默认1）"`
	PageSize        int    `query:"page_size" validate:"omitempty,min=1,max=100" minimum:"1" maximum:"100" description:"每页条数（默认20，最大100）"`
	IncludePrevious bool   `query:"include_previous" description:"是否包含前代订单，默认false"`
}

// AssetOrderItemDetail 订单中的套餐明细
type AssetOrderItemDetail struct {
	PackageName string `json:"package_name" description:"套餐名称快照"`
	Quantity    int    `json:"quantity" description:"数量"`
	UnitPrice   int64  `json:"unit_price" description:"单价(分)"`
	Amount      int64  `json:"amount" description:"小计金额(分)"`
}

// AssetOrderItem 资产历史订单条目
type AssetOrderItem struct {
	OrderNo           string                  `json:"order_no" description:"订单号"`
	OrderType         string                  `json:"order_type" description:"订单类型：single_card/device"`
	PaymentStatus     int                     `json:"payment_status" description:"支付状态：1待支付 2已支付 3已取消 4已退款"`
	PaymentStatusText string                  `json:"payment_status_text" description:"支付状态文本"`
	TotalAmount       int64                   `json:"total_amount" description:"订单金额(分)"`
	PaymentMethod     string                  `json:"payment_method" description:"支付方式：wallet/wechat/alipay/offline"`
	PaidAt            *time.Time              `json:"paid_at,omitempty" description:"支付时间"`
	Generation        int                     `json:"generation" description:"订单所属资产世代编号"`
	Items             []*AssetOrderItemDetail `json:"items" description:"套餐明细列表"`
	CreatedAt         time.Time               `json:"created_at" description:"订单创建时间"`
}

// GenerationOrders 本代订单块（支持分页）
type GenerationOrders struct {
	Generation int               `json:"generation" description:"世代编号"`
	Identifier string            `json:"identifier" description:"资产标识符"`
	AssetType  string            `json:"asset_type" description:"资产类型：card 或 device"`
	Total      int64             `json:"total" description:"总订单数"`
	Page       int               `json:"page" description:"当前页码"`
	PageSize   int               `json:"page_size" description:"每页条数"`
	Items      []*AssetOrderItem `json:"items" description:"订单列表"`
}

// PreviousGenerationOrders 前代订单块（最多20条，不分页）
type PreviousGenerationOrders struct {
	Generation  int               `json:"generation" description:"前代世代编号"`
	Identifier  string            `json:"identifier" description:"前代资产标识符"`
	AssetType   string            `json:"asset_type" description:"前代资产类型：card 或 device"`
	ExchangeNo  string            `json:"exchange_no" description:"换货单号"`
	ExchangedAt time.Time         `json:"exchanged_at" description:"换货完成时间"`
	Total       int64             `json:"total" description:"前代总订单数"`
	Items       []*AssetOrderItem `json:"items" description:"前代订单列表（最多20条）"`
}

// AssetOrdersResponse 资产历史订单完整响应
type AssetOrdersResponse struct {
	CurrentGeneration   *GenerationOrders           `json:"current_generation" description:"本代订单（含分页）"`
	PreviousGenerations []*PreviousGenerationOrders `json:"previous_generations,omitempty" description:"前代订单列表（include_previous=true时返回）"`
	Truncated           bool                        `json:"truncated" description:"是否已截断（换货链超过10代追溯上限时为true）"`
}

// UpdateAssetPollingStatusRequest 更新资产轮询状态请求
type UpdateAssetPollingStatusRequest struct {
	Identifier    string `path:"identifier" description:"资产标识符（ICCID 或 VirtualNo）" required:"true"`
	EnablePolling bool   `json:"enable_polling" description:"是否启用轮询 (true:启用, false:禁用)"`
}

// UpdateAssetPollingStatusResponse 更新资产轮询状态响应
type UpdateAssetPollingStatusResponse struct {
	AssetType     string `json:"asset_type" description:"资产类型 (card:IoT卡, device:设备)"`
	AssetID       uint   `json:"asset_id" description:"资产ID"`
	EnablePolling bool   `json:"enable_polling" description:"更新后的轮询状态 (true:已启用, false:已禁用)"`
}

// UpdateAssetRealnamePolicyRequest 更新资产实名认证策略请求
type UpdateAssetRealnamePolicyRequest struct {
	Identifier     string `path:"identifier" description:"资产标识符（ICCID 或 VirtualNo）" required:"true"`
	RealnamePolicy string `json:"realname_policy" description:"实名认证策略 (none:无需实名, before_order:先实名后充值/购买, after_order:先充值/购买后实名)" required:"true" enum:"none,before_order,after_order"`
}

// UpdateAssetRealnamePolicyResponse 更新资产实名认证策略响应
type UpdateAssetRealnamePolicyResponse struct {
	AssetType      string `json:"asset_type" description:"资产类型 (card:IoT卡, device:设备)"`
	AssetID        uint   `json:"asset_id" description:"资产ID"`
	RealnamePolicy string `json:"realname_policy" description:"更新后的实名认证策略 (none:无需实名, before_order:先实名后充值/购买, after_order:先充值/购买后实名)"`
}

// BatchUpdateAssetRealnamePolicyRequest 批量更新卡或设备实名认证策略请求。
type BatchUpdateAssetRealnamePolicyRequest struct {
	AssetIDs       []uint `json:"asset_ids" validate:"required,min=1,max=500,dive,min=1" required:"true" minItems:"1" maxItems:"500" description:"资产ID列表（最多500条）"`
	RealnamePolicy string `json:"realname_policy" validate:"required,oneof=none before_order after_order" required:"true" enum:"none,before_order,after_order" description:"实名认证策略 (none:无需实名, before_order:先实名后充值/购买, after_order:先充值/购买后实名)"`
}

// BatchUpdateAssetRealnamePolicyResponse 批量更新卡或设备实名认证策略响应。
type BatchUpdateAssetRealnamePolicyResponse struct {
	SuccessCount   int    `json:"success_count" description:"成功更新数量"`
	RealnamePolicy string `json:"realname_policy" description:"更新后的实名认证策略 (none:无需实名, before_order:先实名后充值/购买, after_order:先充值/购买后实名)"`
}

// UpdateAssetRealnameStatusRequest 手动更新资产实名状态请求
type UpdateAssetRealnameStatusRequest struct {
	Identifier     string `path:"identifier" description:"资产标识符（ICCID 或 VirtualNo）" required:"true"`
	RealNameStatus int    `json:"real_name_status" description:"实名状态 (0:未实名, 1:已实名)" required:"true" enum:"0,1"`
}

// UpdateAssetRealnameStatusResponse 手动更新资产实名状态响应
type UpdateAssetRealnameStatusResponse struct {
	AssetType          string     `json:"asset_type" description:"资产类型 (card:IoT卡)"`
	AssetID            uint       `json:"asset_id" description:"资产ID"`
	RealNameStatus     int        `json:"real_name_status" description:"更新后的实名状态 (0:未实名, 1:已实名)"`
	RealNameStatusName string     `json:"real_name_status_name" description:"实名状态名称（中文）"`
	FirstRealnameAt    *time.Time `json:"first_realname_at" description:"首次实名时间（仅已实名时可能有值）"`
}
