"""
标准化数据相关的 Pydantic schemas
"""

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

from app.models.normalized_orders import ProcurementStatus


class OrderItemNormResponse(BaseModel):
    """标准化订单响应"""
    id: int
    product_key: str
    
    # 基本信息
    原始订单编号: Optional[str]
    网店名称: Optional[str]
    交易状态: Optional[str]
    付款时间: Optional[datetime]
    买家留言: Optional[str]
    卖家备注: Optional[str]
    订单金额: Optional[float]
    退款状态: Optional[str]
    
    # 商品信息
    线上宝贝名称: str
    线上销售属性: Optional[str]
    图片链接: Optional[List[str]] = None
    图片数量: int = 0
    订单单价: float
    数量: int
    
    # 解析结果
    品牌: Optional[str]
    货号: Optional[str]
    颜色: Optional[str]
    尺寸: Optional[str]
    sku_id: str
    
    # 编码信息
    线上商家编码: Optional[str]
    商品编号: Optional[str]
    SKU编号: Optional[str]
    
    # 采购信息
    procurement_status: ProcurementStatus
    procurement_time: Optional[datetime]
    manual_note: Optional[str]
    
    # 系统字段
    created_at: datetime
    updated_at: Optional[datetime]
    
    class Config:
        from_attributes = True


class BrandAliasResponse(BaseModel):
    """品牌别名响应"""
    id: int
    canonical_brand: str
    alias: str
    confidence: int
    is_confirmed: str
    created_at: datetime
    created_by: str
    confirmed_at: Optional[datetime]
    confirmed_by: Optional[str]
    
    class Config:
        from_attributes = True


class CreateBrandAliasRequest(BaseModel):
    """创建品牌别名请求"""
    alias: str = Field(..., min_length=1, max_length=100)
    canonical_brand: str = Field(..., min_length=1, max_length=100)
    confidence: int = Field(100, ge=1, le=100)
    auto_confirm: bool = Field(False)


class ConfirmBrandAliasRequest(BaseModel):
    """确认品牌别名请求"""
    decision: str = Field(..., pattern="^(confirmed|rejected)$")
    confirmed_by: str = Field("admin", max_length=100)


class BatchConfirmBrandAliasRequest(BaseModel):
    """批量确认品牌别名请求"""
    alias_ids: List[int] = Field(..., min_items=1)
    decision: str = Field(..., pattern="^(confirmed|rejected)$")
    confirmed_by: str = Field("admin", max_length=100)


class NormalizationStatsResponse(BaseModel):
    """标准化统计响应"""
    raw_orders_total: int
    normalized_total: int
    pending_normalization: int
    branded_orders: int
    brand_coverage: float
    procurement_status: Dict[str, int]


class NormalizationRequest(BaseModel):
    """标准化请求"""
    batch_size: Optional[int] = Field(None, ge=1, le=10000)
    force_update: bool = Field(False)


class ProcurementOrdersResult(BaseModel):
    """采购订单生成结果"""
    auto_generated: bool
    total_created: Optional[int] = 0
    method_distribution: Optional[Dict[str, int]] = None
    message: str
    error: Optional[str] = None


class NormalizationResult(BaseModel):
    """标准化结果"""
    total_raw_orders: int
    processed: int
    created: int
    updated: int
    failed: int
    errors: List[str]
    procurement_orders: Optional[ProcurementOrdersResult] = None


class AliasStatsResponse(BaseModel):
    """别名统计响应"""
    brand: Dict[str, int]
    color: Dict[str, int]
    size: Dict[str, int]


class OrderQueryParams(BaseModel):
    """订单查询参数"""
    skip: int = Field(0, ge=0)
    limit: int = Field(100, ge=1, le=1000)
    原始订单编号: Optional[str] = None
    品牌: Optional[str] = None
    交易状态: Optional[str] = None
    procurement_status: Optional[str] = None
    付款时间_start: Optional[datetime] = None
    付款时间_end: Optional[datetime] = None
    has_brand: Optional[bool] = None


class ProductInfo(BaseModel):
    """产品信息"""
    sku_id: str
    线上宝贝名称: str
    品牌: Optional[str]
    货号: Optional[str]
    颜色: Optional[str]
    尺寸: Optional[str]
    图片链接: Optional[List[str]]
    订单单价: float


class OrderGroup(BaseModel):
    """订单分组"""
    原始订单编号: str
    网店名称: Optional[str]
    交易状态: Optional[str]
    付款时间: Optional[datetime]
    订单金额: Optional[float]
    退款状态: Optional[str]
    items: List[OrderItemNormResponse]
    item_count: int


class PaginatedOrderGroupResponse(BaseModel):
    """分页订单分组响应"""
    total: int
    skip: int
    limit: int
    items: List[OrderGroup]