"""
Phase 3 产品相关的 Pydantic schemas
"""

from datetime import datetime
from decimal import Decimal
from typing import List, Optional, Any, Dict
from enum import Enum

from pydantic import BaseModel, Field, field_validator

from app.models.products import ProductCategory, ProcurementPriority


class ProductCategoryEnum(str, Enum):
    """产品分类枚举"""
    MC = "MC"
    AT = "AT" 
    AP = "AP"
    LA = "LA"
    SS = "SS"
    NY = "NY"
    OTHER = "OTHER"


class ProcurementPriorityEnum(str, Enum):
    """采购优先级枚举"""
    HIGH = "HIGH"
    MEDIUM = "MEDIUM"
    LOW = "LOW"


# Product schemas
class ProductBase(BaseModel):
    """产品基础信息"""
    品牌: Optional[str] = None
    货号: Optional[str] = None
    线上宝贝名称: Optional[str] = None
    颜色: Optional[str] = None
    尺寸: Optional[str] = None
    category: ProductCategoryEnum = ProductCategoryEnum.OTHER
    procurement_priority: ProcurementPriorityEnum = ProcurementPriorityEnum.MEDIUM


class ProductCreate(ProductBase):
    """创建产品"""
    product_key: str = Field(..., description="产品去重键")
    sku_id: Optional[str] = None


class ProductUpdate(BaseModel):
    """更新产品"""
    品牌: Optional[str] = None
    货号: Optional[str] = None
    线上宝贝名称: Optional[str] = None
    颜色: Optional[str] = None
    尺寸: Optional[str] = None
    category: Optional[ProductCategoryEnum] = None
    procurement_priority: Optional[ProcurementPriorityEnum] = None
    可用库存: Optional[int] = None
    is_active: Optional[bool] = None


class ProductResponse(ProductBase):
    """产品响应"""
    id: int
    product_key: str
    sku_id: Optional[str] = None
    category_confidence: Optional[Decimal] = None
    
    # 价格信息
    平均价格: Optional[Decimal] = None
    最低价格: Optional[Decimal] = None
    最高价格: Optional[Decimal] = None
    
    # 销售统计
    总销量: int = 0
    订单数量: int = 0
    最近订单时间: Optional[datetime] = None
    首次订单时间: Optional[datetime] = None
    
    # 库存采购
    待采购数量: int = 0
    已采购数量: int = 0
    可用库存: int = 0
    
    # 图片
    图片数量: int = 0
    主要图片: Optional[str] = None
    
    # 元数据
    is_active: bool = True
    created_at: datetime
    updated_at: datetime
    last_aggregated_at: Optional[datetime] = None

    class Config:
        from_attributes = True


# PendingPurchase schemas
class PendingPurchaseBase(BaseModel):
    """待采购基础信息"""
    需求数量: int = Field(..., gt=0, description="需求采购数量")
    priority: ProcurementPriorityEnum = ProcurementPriorityEnum.MEDIUM
    is_urgent: bool = False
    建议采购价: Optional[Decimal] = None
    预算上限: Optional[Decimal] = None
    期望交付时间: Optional[datetime] = None
    采购备注: Optional[str] = None


class PendingPurchaseCreate(PendingPurchaseBase):
    """创建待采购"""
    product_key: str = Field(..., description="产品去重键")


class PendingPurchaseUpdate(BaseModel):
    """更新待采购"""
    需求数量: Optional[int] = Field(None, gt=0)
    priority: Optional[ProcurementPriorityEnum] = None
    is_urgent: Optional[bool] = None
    建议采购价: Optional[Decimal] = None
    预算上限: Optional[Decimal] = None
    期望交付时间: Optional[datetime] = None
    采购备注: Optional[str] = None


class PendingPurchaseResponse(PendingPurchaseBase):
    """待采购响应"""
    id: int
    product_key: str
    已分配数量: int = 0
    剩余需求: int
    需求生成时间: datetime
    last_updated: datetime
    
    # 关联产品信息
    product: Optional[ProductResponse] = None

    class Config:
        from_attributes = True


# PurchaseList schemas
class PurchaseListBase(BaseModel):
    """采购清单基础信息"""
    采购标题: Optional[str] = None
    供应商名称: Optional[str] = None
    供应商联系方式: Optional[str] = None
    采购备注: Optional[str] = None


class PurchaseListCreate(PurchaseListBase):
    """创建采购清单"""
    pass


class PurchaseListUpdate(BaseModel):
    """更新采购清单"""
    采购标题: Optional[str] = None
    供应商名称: Optional[str] = None
    供应商联系方式: Optional[str] = None
    预计到货时间: Optional[datetime] = None
    实际总金额: Optional[Decimal] = None
    采购备注: Optional[str] = None


class PurchaseListItemBase(BaseModel):
    """采购清单项基础信息"""
    采购数量: int = Field(..., gt=0, description="计划采购数量")
    单价: Optional[Decimal] = Field(None, gt=0, description="采购单价")
    商品备注: Optional[str] = None


class PurchaseListItemCreate(PurchaseListItemBase):
    """创建采购清单项"""
    product_key: str = Field(..., description="产品去重键")


class PurchaseListItemUpdate(BaseModel):
    """更新采购清单项"""
    采购数量: Optional[int] = Field(None, gt=0)
    单价: Optional[Decimal] = Field(None, gt=0)
    商品备注: Optional[str] = None


class PurchaseListItemResponse(PurchaseListItemBase):
    """采购清单项响应"""
    id: int
    product_key: str
    品牌: Optional[str] = None
    货号: Optional[str] = None
    线上宝贝名称: Optional[str] = None
    颜色: Optional[str] = None
    尺寸: Optional[str] = None
    小计: Optional[Decimal] = None
    
    # 收货信息
    已到货数量: int = 0
    待收货数量: int
    is_received: bool = False
    收货时间: Optional[datetime] = None
    
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True


class PurchaseListResponse(PurchaseListBase):
    """采购清单响应"""
    id: int
    采购单号: str
    状态: str = "草稿"
    商品总数量: int = 0
    预估总金额: Decimal = Decimal("0.00")
    实际总金额: Optional[Decimal] = None
    
    # 时间信息
    创建时间: datetime
    提交时间: Optional[datetime] = None
    确认时间: Optional[datetime] = None
    预计到货时间: Optional[datetime] = None
    实际到货时间: Optional[datetime] = None
    
    # 操作人员
    创建人: Optional[str] = None
    审批人: Optional[str] = None
    
    # 关联项
    items: List[PurchaseListItemResponse] = []

    class Config:
        from_attributes = True


# Request schemas for operations
class ProductSearchRequest(BaseModel):
    """产品搜索请求"""
    keyword: Optional[str] = None
    brand: Optional[str] = None
    category: Optional[ProductCategoryEnum] = None
    has_procurement_demand: Optional[bool] = None
    priority: Optional[ProcurementPriorityEnum] = None
    page: int = Field(default=1, ge=1)
    page_size: int = Field(default=20, ge=1, le=100)


class PendingPurchaseSearchRequest(BaseModel):
    """待采购搜索请求"""
    priority: Optional[ProcurementPriorityEnum] = None
    category: Optional[ProductCategoryEnum] = None
    brand: Optional[str] = None
    urgent_only: bool = False
    page: int = Field(default=1, ge=1)
    page_size: int = Field(default=20, ge=1, le=100)


class PurchaseListSearchRequest(BaseModel):
    """采购清单搜索请求"""
    status: Optional[str] = None
    supplier: Optional[str] = None
    page: int = Field(default=1, ge=1)
    page_size: int = Field(default=20, ge=1, le=100)


class AddItemsToPurchaseListRequest(BaseModel):
    """向采购清单添加商品请求"""
    items: List[Dict[str, Any]] = Field(..., description="商品列表")
    
    @field_validator('items')
    @classmethod
    def validate_items(cls, items):
        """验证商品列表"""
        if not items:
            raise ValueError("商品列表不能为空")
        
        for item in items:
            if not isinstance(item, dict):
                raise ValueError("商品项必须是字典格式")
            
            if 'product_key' not in item:
                raise ValueError("商品项必须包含 product_key")
            
            if 'quantity' not in item or not isinstance(item['quantity'], int) or item['quantity'] <= 0:
                raise ValueError("商品项必须包含有效的 quantity")
        
        return items


class ReceiveItemsRequest(BaseModel):
    """收货请求"""
    item_receipts: List[Dict[str, Any]] = Field(..., description="收货明细")
    
    @field_validator('item_receipts')
    @classmethod
    def validate_receipts(cls, receipts):
        """验证收货明细"""
        if not receipts:
            raise ValueError("收货明细不能为空")
        
        for receipt in receipts:
            if not isinstance(receipt, dict):
                raise ValueError("收货明细必须是字典格式")
            
            if 'item_id' not in receipt:
                raise ValueError("收货明细必须包含 item_id")
            
            if 'received_quantity' not in receipt or not isinstance(receipt['received_quantity'], int) or receipt['received_quantity'] <= 0:
                raise ValueError("收货明细必须包含有效的 received_quantity")
        
        return receipts


class ProductAggregationRequest(BaseModel):
    """产品聚合请求"""
    force_rebuild: bool = Field(default=False, description="是否强制重新构建")
    batch_size: int = Field(default=1000, ge=100, le=5000, description="批处理大小")


class ClassificationRequest(BaseModel):
    """分类请求"""
    product_name: str = Field(..., description="产品名称")
    brand: Optional[str] = Field(None, description="品牌名称")
    description: Optional[str] = Field(None, description="产品描述")


class ClassificationResponse(BaseModel):
    """分类响应"""
    category: ProductCategoryEnum
    confidence: float = Field(..., ge=0.0, le=1.0)
    explanation: Optional[Dict[str, Any]] = None


# Response schemas for collections
class ProductSearchResponse(BaseModel):
    """产品搜索响应"""
    products: List[ProductResponse]
    pagination: Dict[str, Any]


class PendingPurchaseSearchResponse(BaseModel):
    """待采购搜索响应"""
    pending_purchases: List[PendingPurchaseResponse]
    pagination: Dict[str, Any]


class PurchaseListSearchResponse(BaseModel):
    """采购清单搜索响应"""
    purchase_lists: List[PurchaseListResponse]
    pagination: Dict[str, Any]


class ProductStatsResponse(BaseModel):
    """产品统计响应"""
    total_products: int
    category_distribution: Dict[str, int]
    procurement: Dict[str, Any]


class ProcurementStatsResponse(BaseModel):
    """采购统计响应"""
    pending_purchases: Dict[str, Any]
    purchase_lists: Dict[str, Any]