package dto

import "time"

// CreateExchangeRequest 创建换货单请求。
type CreateExchangeRequest struct {
	OldAssetType   string  `json:"old_asset_type" validate:"required,oneof=iot_card device" required:"true" description:"旧资产类型 (iot_card:物联网卡, device:设备)"`
	OldIdentifier  string  `json:"old_identifier" validate:"required,min=1,max=100" required:"true" minLength:"1" maxLength:"100" description:"旧资产输入标识，卡支持 ICCID、接入号、虚拟号，设备支持虚拟号、IMEI、SN；响应快照使用权威标识"`
	FlowType       string  `json:"flow_type" validate:"omitempty,oneof=shipping direct" enum:"shipping,direct" description:"换货流程类型 (shipping:物流换货, direct:直接换货)"`
	NewIdentifier  string  `json:"new_identifier" validate:"omitempty,min=1,max=100" minLength:"1" maxLength:"100" description:"新资产输入标识，direct 流程必填；卡支持 ICCID、接入号、虚拟号，设备支持虚拟号、IMEI、SN"`
	MigrateData    *bool   `json:"migrate_data" description:"是否执行全量迁移，direct 流程未传按 false 处理"`
	ExchangeReason string  `json:"exchange_reason" validate:"required,min=1,max=100" required:"true" minLength:"1" maxLength:"100" description:"换货原因"`
	Remark         *string `json:"remark" validate:"omitempty,max=500" maxLength:"500" description:"备注"`
}

// ExchangeListRequest 换货单列表请求。
type ExchangeListRequest struct {
	Page            *int       `json:"page" query:"page" validate:"omitempty,min=1" minimum:"1" description:"页码"`
	PageSize        *int       `json:"page_size" query:"page_size" validate:"omitempty,min=1,max=100" minimum:"1" maximum:"100" description:"每页数量"`
	Status          *int       `json:"status" query:"status" validate:"omitempty,min=1,max=5" minimum:"1" maximum:"5" description:"换货状态 (1:待填写信息, 2:待发货, 3:已发货待确认, 4:已完成, 5:已取消)"`
	FlowType        string     `json:"flow_type" query:"flow_type" validate:"omitempty,oneof=shipping direct" enum:"shipping,direct" description:"换货流程类型 (shipping:物流换货, direct:直接换货)"`
	OldAssetKeyword string     `json:"old_asset_keyword" query:"old_asset_keyword" validate:"omitempty,max=100" maxLength:"100" description:"旧资产关键词，支持卡 ICCID、接入号、虚拟号或设备虚拟号、IMEI、SN；与新资产关键词按 AND 组合"`
	NewAssetKeyword string     `json:"new_asset_keyword" query:"new_asset_keyword" validate:"omitempty,max=100" maxLength:"100" description:"新资产关键词，支持卡 ICCID、接入号、虚拟号或设备虚拟号、IMEI、SN；与旧资产关键词按 AND 组合"`
	CreatedAtStart  *time.Time `json:"created_at_start" query:"created_at_start" description:"创建时间起始"`
	CreatedAtEnd    *time.Time `json:"created_at_end" query:"created_at_end" description:"创建时间结束"`
}

// ExchangeShipRequest 换货发货请求。
type ExchangeShipRequest struct {
	ExpressCompany string `json:"express_company" validate:"required,min=1,max=100" required:"true" minLength:"1" maxLength:"100" description:"快递公司"`
	ExpressNo      string `json:"express_no" validate:"required,min=1,max=100" required:"true" minLength:"1" maxLength:"100" description:"快递单号"`
	NewIdentifier  string `json:"new_identifier" validate:"required,min=1,max=100" required:"true" minLength:"1" maxLength:"100" description:"新资产输入标识，卡支持 ICCID、接入号、虚拟号，设备支持虚拟号、IMEI、SN；保存快照使用权威标识"`
	MigrateData    bool   `json:"migrate_data" required:"true" description:"是否执行全量迁移 (true:执行, false:不执行)"`
}

type ExchangeCancelRequest struct {
	Remark *string `json:"remark" validate:"omitempty,max=500" maxLength:"500" description:"取消备注"`
}

type ClientShippingInfoRequest struct {
	RecipientName    string `json:"recipient_name" validate:"required,min=1,max=50" required:"true" minLength:"1" maxLength:"50" description:"收件人姓名"`
	RecipientPhone   string `json:"recipient_phone" validate:"required,min=1,max=20" required:"true" minLength:"1" maxLength:"20" description:"收件人电话"`
	RecipientAddress string `json:"recipient_address" validate:"required,min=1,max=500" required:"true" minLength:"1" maxLength:"500" description:"收货地址"`
}

type ClientExchangePendingRequest struct {
	Identifier string `json:"identifier" query:"identifier" validate:"required,min=1,max=100" required:"true" minLength:"1" maxLength:"100" description:"资产标识符(ICCID/虚拟号/IMEI/SN)"`
}

type ExchangeIDRequest struct {
	ID uint `path:"id" required:"true" description:"换货单ID"`
}

type ExchangeShipParams struct {
	ID uint `path:"id" required:"true" description:"换货单ID"`
	ExchangeShipRequest
}

type ExchangeCancelParams struct {
	ID uint `path:"id" required:"true" description:"换货单ID"`
	ExchangeCancelRequest
}

type ClientShippingInfoParams struct {
	ID uint `path:"id" required:"true" description:"换货单ID"`
	ClientShippingInfoRequest
}

// ExchangeOrderResponse 换货单响应。
type ExchangeOrderResponse struct {
	ID                 uint       `json:"id" description:"换货单ID"`
	ExchangeNo         string     `json:"exchange_no" description:"换货单号"`
	FlowType           string     `json:"flow_type" description:"换货流程类型 (shipping:物流换货, direct:直接换货)"`
	FlowTypeName       string     `json:"flow_type_name" description:"换货流程类型名称"`
	OldAssetType       string     `json:"old_asset_type" description:"旧资产类型 (iot_card:物联网卡, device:设备)"`
	OldAssetID         uint       `json:"old_asset_id" description:"旧资产ID"`
	OldAssetIdentifier string     `json:"old_asset_identifier" description:"旧资产权威快照，卡为完整 ICCID，设备按虚拟号、IMEI、SN 优先级取值；历史记录保持原值"`
	NewAssetType       string     `json:"new_asset_type" description:"新资产类型 (iot_card:物联网卡, device:设备)"`
	NewAssetID         *uint      `json:"new_asset_id,omitempty" description:"新资产ID"`
	NewAssetIdentifier string     `json:"new_asset_identifier" description:"新资产权威快照，卡为完整 ICCID，设备按虚拟号、IMEI、SN 优先级取值；历史记录保持原值"`
	RecipientName      string     `json:"recipient_name" description:"收件人姓名"`
	RecipientPhone     string     `json:"recipient_phone" description:"收件人电话"`
	RecipientAddress   string     `json:"recipient_address" description:"收货地址"`
	ExpressCompany     string     `json:"express_company" description:"快递公司"`
	ExpressNo          string     `json:"express_no" description:"快递单号"`
	MigrateData        bool       `json:"migrate_data" description:"是否执行全量迁移"`
	MigrationCompleted bool       `json:"migration_completed" description:"迁移是否已完成"`
	MigrationBalance   int64      `json:"migration_balance" description:"迁移转移金额(分)"`
	ShippedAt          *time.Time `json:"shipped_at,omitempty" description:"发货时间"`
	CompletedAt        *time.Time `json:"completed_at,omitempty" description:"换货完成时间"`
	ExchangeReason     string     `json:"exchange_reason" description:"换货原因"`
	Remark             *string    `json:"remark,omitempty" description:"备注"`
	Status             int        `json:"status" description:"换货状态 (1:待填写信息, 2:待发货, 3:已发货待确认, 4:已完成, 5:已取消)"`
	StatusName         string     `json:"status_name" description:"换货状态名称（中文）"`
	StatusText         string     `json:"status_text" description:"换货状态文本"`
	ShopID             *uint      `json:"shop_id,omitempty" description:"所属店铺ID"`
	CreatedAt          time.Time  `json:"created_at" description:"创建时间"`
	UpdatedAt          time.Time  `json:"updated_at" description:"更新时间"`
	DeletedAt          *time.Time `json:"deleted_at,omitempty" description:"删除时间"`
	SubmitterID        uint       `json:"submitter_id" description:"提交人账号ID"`
	SubmitterName      string     `json:"submitter_name" description:"提交人账号名称"`
	Creator            uint       `json:"creator" description:"创建人ID"`
	Updater            uint       `json:"updater" description:"更新人ID"`
}

type ExchangeListResponse struct {
	List     []*ExchangeOrderResponse `json:"items" description:"换货单列表"`
	Total    int64                    `json:"total" description:"总数"`
	Page     int                      `json:"page" description:"当前页码"`
	PageSize int                      `json:"size" description:"每页数量"`
}

type ClientExchangePendingResponse struct {
	ID             uint      `json:"id" description:"换货单ID"`
	ExchangeNo     string    `json:"exchange_no" description:"换货单号"`
	FlowType       string    `json:"flow_type" description:"换货流程类型 (shipping:物流换货, direct:直接换货)"`
	Status         int       `json:"status" description:"换货状态 (1:待填写信息, 2:待发货, 3:已发货待确认, 4:已完成, 5:已取消)"`
	StatusName     string    `json:"status_name" description:"换货状态名称（中文）"`
	StatusText     string    `json:"status_text" description:"换货状态文本"`
	ExchangeReason string    `json:"exchange_reason" description:"换货原因"`
	CreatedAt      time.Time `json:"created_at" description:"创建时间"`
}
