from __future__ import annotations
from typing import Optional, List
from decimal import Decimal
from datetime import datetime
from pydantic import BaseModel, Field


class ProductBase(BaseModel):
    name: str = Field(..., max_length=120)
    sku: str = Field(..., max_length=64)
    category: str = Field("", max_length=64)
    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: int = Field(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)
    slug: Optional[str] = None
    meta_title: Optional[str] = None
    meta_description: Optional[str] = None


class ProductVariantIn(BaseModel):
    id: Optional[int] = None
    sku: str = Field(..., max_length=100)
    barcode: Optional[str] = None
    price_modifier: Decimal = Field(Decimal("0"))
    stock_qty: int = Field(0, ge=0)
    reserved_qty: int = Field(0, ge=0)
    image_url: Optional[str] = None
    weight_grams: Optional[int] = Field(None, ge=0)
    sort_order: int = 0
    attributes: dict = Field(default_factory=dict)
    is_active: bool = True


class ProductVariantOut(BaseModel):
    id: int
    product_id: int
    tenant_id: int
    sku: str
    barcode: Optional[str] = None
    price_modifier: Decimal = Decimal("0")
    stock_qty: int = 0
    reserved_qty: int = 0
    image_url: Optional[str] = None
    weight_grams: Optional[int] = None
    sort_order: int = 0
    attributes: dict = Field(default_factory=dict)
    is_active: bool = True

    model_config = {"from_attributes": True}


class ProductCreate(ProductBase):
    cover_url: Optional[str] = None
    images: List[str] = Field(default_factory=list)      # NEW: full list of image URLs from ImageUploader
    variants: List[ProductVariantIn] = Field(default_factory=list)


class ProductUpdate(ProductBase):
    name: Optional[str] = None
    sku: Optional[str] = None
    cover_url: Optional[str] = None
    images: Optional[List[str]] = None                 # NEW: optional list for updates
    variants: Optional[List[ProductVariantIn]] = None


class ProductOut(ProductBase):
    id: int
    tenant_id: int
    brand: Optional[str] = None
    brand_slug: Optional[str] = None
    cover_url: Optional[str] = None
    images: List[str] = []        # 所有图片 URL 列表（按 sort_order 排序）
    variants: List[ProductVariantOut] = Field(default_factory=list)
    sales_count: int = 0
    created_at: Optional[datetime] = None

    model_config = {"from_attributes": True}


class ProductListOut(BaseModel):
    id: int
    name: str
    sku: str
    category: str
    brand: Optional[str] = None
    brand_slug: Optional[str] = None
    base_price: Decimal
    market_price: Optional[Decimal] = None
    member_price: Optional[Decimal] = None
    stock_qty: int
    status: str
    slug: Optional[str] = None
    cover_url: Optional[str] = None
    sales_count: int = 0
    created_at: Optional[datetime] = 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}
