"""
发货管理相关的 Pydantic Schema
"""

from datetime import datetime
from typing import List, Optional
from pydantic import BaseModel, Field


# ============ 基础Schema ============

class ProcurementOrderShippingInfo(BaseModel):
    """采购订单发货信息"""
    id: int
    order_number: str = Field(..., alias="原始订单编号")
    product_name: str = Field(..., alias="线上宝贝名称")
    品牌: Optional[str] = None
    线上销售属性: Optional[str] = Field(None, alias="线上销售属性")
    quantity: int = Field(..., alias="数量")
    procurement_method: str
    系统发货状态: Optional[str] = None
    快递公司: Optional[str] = None
    快递单号: Optional[str] = None
    发货时间: Optional[datetime] = None
    main_image_path: Optional[str] = None
    image_urls: Optional[str] = None

    class Config:
        from_attributes = True
        populate_by_name = True


class ShippingAddressInfo(BaseModel):
    """收货地址信息"""
    phone: Optional[str] = Field(None, description="收货人手机号")
    name: Optional[str] = Field(None, description="收货人姓名")
    address: Optional[str] = Field(None, description="收货地址")
    buyer_account: Optional[str] = Field(None, description="买家账号")


# ============ 请求Schema ============

class FindPendingShippingRequest(BaseModel):
    """查询待发货订单请求"""
    limit: int = Field(100, ge=1, le=500, description="返回数量限制")
    offset: int = Field(0, ge=0, description="偏移量")
    procurement_method: Optional[str] = Field(None, description="采购方式筛选")
    品牌: Optional[str] = Field(None, description="品牌筛选")


class FindMergeableOrdersRequest(BaseModel):
    """查找可合并订单请求"""
    order_ids: List[int] = Field(..., min_length=1, description="待检查的采购订单ID列表")


class CreateShippingPackageRequest(BaseModel):
    """创建快递包裹请求"""
    procurement_order_ids: List[int] = Field(..., min_length=1, description="采购订单ID列表")
    快递公司: str = Field(..., min_length=1, max_length=50, description="快递公司")
    快递单号: str = Field(..., min_length=1, max_length=100, description="快递单号")
    操作员: str = Field(..., min_length=1, max_length=50, description="操作员名称")
    shipping_notes: Optional[str] = Field(None, max_length=500, description="发货备注")


class UpdateTrackingNumberRequest(BaseModel):
    """修改快递单号请求"""
    package_id: int = Field(..., description="包裹ID")
    new_快递公司: str = Field(..., min_length=1, max_length=50, description="新的快递公司")
    new_快递单号: str = Field(..., min_length=1, max_length=100, description="新的快递单号")
    操作员: str = Field(..., min_length=1, max_length=50, description="操作员名称")


class CancelShippingRequest(BaseModel):
    """取消发货请求"""
    package_id: int = Field(..., description="包裹ID")
    操作员: str = Field(..., min_length=1, max_length=50, description="操作员名称")
    cancel_reason: str = Field(..., min_length=1, max_length=500, description="取消原因")


class GetShippingHistoryRequest(BaseModel):
    """查询发货历史请求"""
    limit: int = Field(100, ge=1, le=500, description="返回数量限制")
    offset: int = Field(0, ge=0, description="偏移量")
    快递单号: Optional[str] = Field(None, description="快递单号筛选")
    包裹状态: Optional[str] = Field(None, description="包裹状态筛选")


# ============ 响应Schema ============

class MergeableOrderGroup(BaseModel):
    """可合并订单组"""
    match_info: ShippingAddressInfo = Field(..., description="匹配的收货信息")
    procurement_orders: List[dict] = Field(..., description="可合并的采购订单列表")


class FindMergeableOrdersResponse(BaseModel):
    """查找可合并订单响应"""
    mergeable_groups: List[MergeableOrderGroup] = Field(..., description="可合并订单分组")
    unmergeable_orders: List[dict] = Field(..., description="无法合并的订单")
    total_groups: int = Field(..., description="可合并分组总数")
    total_unmergeable: int = Field(..., description="无法合并订单总数")


class ShippingPackageResponse(BaseModel):
    """快递包裹响应"""
    id: int
    快递公司: str
    快递单号: str
    收货人姓名: str
    收货人手机号: str
    收货地址: str
    买家账号: Optional[str] = None
    total_skus: int
    merged_order_numbers: Optional[List[str]] = None
    merged_procurement_ids: Optional[List[int]] = None
    package_status: str
    created_by: Optional[str] = None
    created_at: datetime
    shipped_at: Optional[datetime] = None
    updated_at: Optional[datetime] = None
    shipping_notes: Optional[str] = None
    cancelled_at: Optional[datetime] = None
    cancelled_by: Optional[str] = None
    cancel_reason: Optional[str] = None

    class Config:
        from_attributes = True


class FindPendingShippingResponse(BaseModel):
    """查询待发货订单响应"""
    orders: List[ProcurementOrderShippingInfo]
    total: int
    limit: int
    offset: int


class GetShippingHistoryResponse(BaseModel):
    """查询发货历史响应"""
    packages: List[ShippingPackageResponse]
    total: int
    limit: int
    offset: int


class PackageDetailsResponse(BaseModel):
    """包裹详情响应"""
    package: ShippingPackageResponse
    procurement_orders: List[ProcurementOrderShippingInfo]
    order_count: int


class OperationResponse(BaseModel):
    """操作响应"""
    success: bool
    message: str
    data: Optional[dict] = None


class AvailableBrandsResponse(BaseModel):
    """可用品牌列表响应"""
    brands: List[str] = Field(..., description="品牌列表")
    total: int = Field(..., description="品牌总数")


# ============ 增强版待发货订单相关Schema ============

class EnhancedProcurementOrderInfo(BaseModel):
    """增强版采购订单信息（包含淘宝状态和脱敏收货信息）"""
    id: int
    order_number: str = Field(..., alias="原始订单编号")
    product_name: str = Field(..., alias="线上宝贝名称")
    品牌: Optional[str] = None
    线上销售属性: Optional[str] = Field(None, alias="线上销售属性")
    quantity: int = Field(..., alias="数量")
    procurement_method: str
    系统发货状态: Optional[str] = None
    快递公司: Optional[str] = None
    快递单号: Optional[str] = None
    发货时间: Optional[datetime] = None
    main_image_path: Optional[str] = None
    image_urls: Optional[str] = None

    # 淘宝订单信息
    子订单编号: Optional[str] = None
    淘宝订单状态: Optional[str] = Field(None, description="买家已付款、待发货、待收货等")
    淘宝退款状态: Optional[str] = Field(None, description="无退款、已退款、待退款等")
    淘宝商家备注: Optional[str] = Field(None, description="商家备注")

    # 脱敏收货信息
    masked_phone: Optional[str] = Field(None, description="脱敏手机号(138****5678)")
    masked_name: Optional[str] = Field(None, description="脱敏收货人姓名(张*)")
    masked_address: Optional[str] = Field(None, description="脱敏收货地址")

    class Config:
        from_attributes = True
        populate_by_name = True


class EnhancedPendingOrdersRequest(BaseModel):
    """查询增强版待发货订单请求"""
    limit: int = Field(100, ge=1, le=500, description="返回数量限制")
    offset: int = Field(0, ge=0, description="偏移量")
    procurement_method: Optional[str] = Field(None, description="采购方式筛选")
    品牌: Optional[str] = Field(None, description="品牌筛选")
    taobao_status_filter: Optional[str] = Field(None, description="淘宝订单状态筛选")
    has_refund: Optional[bool] = Field(None, description="筛选有退款的订单")


class EnhancedPendingOrdersResponse(BaseModel):
    """查询增强版待发货订单响应"""
    orders: List[EnhancedProcurementOrderInfo]
    total: int
    limit: int
    offset: int
    refund_warning_count: int = Field(..., description="需要注意的退款订单数")


class FullAddressInfo(BaseModel):
    """完整地址信息（解密）"""
    phone: str = Field(..., description="收货人手机号（完整）")
    name: str = Field(..., description="收货人姓名（完整）")
    address: str = Field(..., description="收货地址（完整）")
    buyer_account: Optional[str] = Field(None, description="买家账号")

    class Config:
        from_attributes = True


class FullAddressResponse(BaseModel):
    """获取完整地址响应"""
    procurement_id: int
    order_number: str
    full_address: FullAddressInfo
    decrypted_at: datetime = Field(default_factory=datetime.now, description="解密时间")
