from __future__ import annotations
from typing import Optional, List
from decimal import Decimal
from datetime import date, datetime
from pydantic import BaseModel, Field


class TierPriceIn(BaseModel):
    member_level_id: int
    price: Decimal


class TierPriceOut(BaseModel):
    member_level_id: int
    price: Decimal
    level_name: Optional[str] = None
    discount_rate: Optional[Decimal] = None

    model_config = {"from_attributes": True}


class ProductBase(BaseModel):
    name: str = Field(..., max_length=200)
    sku: str = Field(..., max_length=64)
    categories: List[str | int] = Field(default_factory=list)
    brand_id: Optional[int] = None
    description: Optional[str] = None
    base_price: Decimal = Field(Decimal("0"), ge=0)
    market_price: Optional[Decimal] = None
    member_price: Optional[Decimal] = None
    cost_price: Optional[Decimal] = None
    stock_qty: Decimal = Field(Decimal("0"), ge=0)
    low_stock_threshold: int = Field(5, ge=0)
    allow_oversell: bool = False
    status: str = Field("draft")
    weight_grams: int = Field(0, ge=0)
    length: Optional[Decimal] = None
    width: Optional[Decimal] = None
    height: Optional[Decimal] = None
    slug: Optional[str] = None
    meta_title: Optional[str] = None
    meta_description: Optional[str] = None
    seo_keywords: Optional[str] = None
    ai_description: Optional[str] = None
    shelf_life: Optional[str] = None
    shelf_life_en: Optional[str] = None
    expiry_date: Optional[date] = None
    # 英文多语言
    name_en: Optional[str] = None
    description_en: Optional[str] = None
    ai_description_en: Optional[str] = None
    meta_title_en: Optional[str] = None
    meta_description_en: Optional[str] = None
    seo_keywords_en: Optional[str] = None
    tax_class_id: Optional[int] = None
    stock_status_id: Optional[int] = None


class ProductVariantIn(BaseModel):
    id: Optional[int] = None
    sku: str = Field(..., max_length=100)
    barcode: Optional[str] = None
    price_modifier: Optional[Decimal] = Field(Decimal("0"))
    independent_price: Optional[Decimal] = None
    stock_qty: Decimal = Field(Decimal("0"), ge=0)
    reserved_qty: Decimal = Field(Decimal("0"), ge=0)
    image_url: Optional[str] = None
    weight_grams: Optional[int] = Field(None, ge=0)
    length: Optional[Decimal] = None
    width: Optional[Decimal] = None
    height: Optional[Decimal] = None
    sort_order: int = 0
    attributes: dict = Field(default_factory=dict)
    is_active: bool = True
    is_default: bool = False
    expiry_date: Optional[date] = None
    tier_prices: List[TierPriceIn] = Field(default_factory=list)


class ProductVariantOut(BaseModel):
    id: int
    product_id: int
    tenant_id: int
    sku: str
    barcode: Optional[str] = None
    price_modifier: Decimal = Decimal("0")
    independent_price: Optional[Decimal] = None
    stock_qty: Decimal = Decimal("0")
    reserved_qty: Decimal = Decimal("0")
    image_url: Optional[str] = None
    weight_grams: Optional[int] = None
    length: Optional[Decimal] = None
    width: Optional[Decimal] = None
    height: Optional[Decimal] = None
    sort_order: int = 0
    attributes: dict = Field(default_factory=dict)
    is_active: bool = True
    is_default: bool = False
    expiry_date: Optional[date] = None
    expiry_status: str = "none"
    tier_prices: List[TierPriceOut] = Field(default_factory=list)

    model_config = {"from_attributes": True}


class StockStatusBrief(BaseModel):
    id: int
    name: str
    name_en: Optional[str] = None
    slug: str
    allow_purchase: bool
    badge_color: Optional[str] = None
    badge_text: Optional[str] = None
    badge_text_en: Optional[str] = None

    model_config = {"from_attributes": True}


class ProductCreate(ProductBase):
    cover_url: Optional[str] = None
    variants: List[ProductVariantIn] = Field(default_factory=list)
    tier_prices: List[TierPriceIn] = Field(default_factory=list)


class ProductUpdate(ProductBase):
    name: Optional[str] = None
    sku: Optional[str] = None
    cover_url: Optional[str] = None
    variants: Optional[List[ProductVariantIn]] = None
    tier_prices: Optional[List[TierPriceIn]] = None


class ProductOut(ProductBase):
    stock_qty: Decimal = Decimal("0")
    id: int
    tenant_id: int
    brand: Optional[str] = None
    brand_slug: Optional[str] = None
    cover_url: Optional[str] = None
    images: List[str] = []
    variants: List[ProductVariantOut] = Field(default_factory=list)
    tier_prices: List[TierPriceOut] = Field(default_factory=list)
    attachments: List[dict] = Field(default_factory=list)
    media_roles: dict = Field(default_factory=dict)
    sales_count: int = 0
    stock_status: Optional[StockStatusBrief] = None
    created_at: Optional[datetime] = None
    expiry_status: str = "none"
    # 商品价格规则展示：服务端按 store 渠道 + 当前客户 + 单件数量解析
    display_price: Optional[Decimal] = None
    original_price: Optional[Decimal] = None
    is_promotion: bool = False
    active_rule_summary: Optional[dict] = None
    # 进销存成本只读字段
    inventory_cost_managed: bool = False
    inventory_current_unit_cost: Optional[Decimal] = None
    inventory_last_purchase_unit_cost: Optional[Decimal] = None

    model_config = {"from_attributes": True}


class ProductListOut(BaseModel):
    id: int
    name: str
    name_en: Optional[str] = None
    sku: str
    categories: List[str] = []
    brand_id: Optional[int] = None
    brand: Optional[str] = None
    brand_slug: Optional[str] = None
    base_price: Decimal
    market_price: Optional[Decimal] = None
    member_price: Optional[Decimal] = None
    stock_qty: Decimal
    status: str
    slug: Optional[str] = None
    cover_url: Optional[str] = None
    sales_count: int = 0
    stock_status: Optional[StockStatusBrief] = None
    created_at: Optional[datetime] = None
    tier_prices: List[TierPriceOut] = Field(default_factory=list)
    expiry_date: Optional[date] = None
    expiry_status: str = "none"
    # 商品价格规则展示：服务端按 store 渠道 + 当前客户 + 单件数量解析
    # display_price   —— 命中规则或 member 价后给到前端的单价
    # original_price  —— 划线原价（base_price + variant price_modifier）
    # is_promotion    —— display_price 是否来自一条 is_promotion=true 的规则
    # active_rule_summary —— 命中规则的最小可审计摘要（id/min_quantity/price_type/ends_at）
    display_price: Optional[Decimal] = None
    original_price: Optional[Decimal] = None
    is_promotion: bool = False
    active_rule_summary: Optional[dict] = None

    model_config = {"from_attributes": True}


class BrandBase(BaseModel):
    name: str = Field(..., max_length=120)
    slug: str = Field(..., max_length=180)
    english_name: Optional[str] = None
    logo_url: Optional[str] = None
    description: Optional[str] = None
    website_url: Optional[str] = None
    country: Optional[str] = None
    sort_order: int = 0
    is_featured: bool = False
    is_active: bool = True
    meta_title: Optional[str] = None
    meta_description: Optional[str] = None


class BrandCreate(BrandBase):
    pass


class BrandUpdate(BaseModel):
    name: Optional[str] = None
    slug: Optional[str] = None
    english_name: Optional[str] = None
    logo_url: Optional[str] = None
    description: Optional[str] = None
    website_url: Optional[str] = None
    country: Optional[str] = None
    sort_order: Optional[int] = None
    is_featured: Optional[bool] = None
    is_active: Optional[bool] = None
    meta_title: Optional[str] = None
    meta_description: Optional[str] = None


class BrandOut(BrandBase):
    id: int
    tenant_id: int
    created_at: Optional[datetime] = None

    model_config = {"from_attributes": True}
