from __future__ import annotations
from datetime import datetime
from pydantic import BaseModel, Field


# ── Collection ────────────────────────────────────────────────

class CollectionCreate(BaseModel):
    name: str = Field(..., max_length=100)
    name_en: str | None = None
    description: str | None = None
    sort_order: int = 0

class CollectionUpdate(BaseModel):
    name: str | None = None
    name_en: str | None = None
    description: str | None = None
    sort_order: int | None = None

class CollectionOut(BaseModel):
    id: int
    name: str
    name_en: str | None = None
    description: str | None = None
    sort_order: int
    template_count: int = 0
    tenant_count: int = 0
    created_at: datetime
    model_config = {"from_attributes": True}

class CollectionBrief(BaseModel):
    id: int
    name: str
    name_en: str | None = None
    model_config = {"from_attributes": True}


# ── Template Image / Variant ─────────────────────────────────

class TemplateImageIn(BaseModel):
    url: str
    alt_text: str | None = None
    is_primary: bool = False
    sort_order: int = 0

class TemplateImageOut(BaseModel):
    id: int
    url: str
    alt_text: str | None = None
    is_primary: bool
    sort_order: int
    model_config = {"from_attributes": True}

class TemplateVariantIn(BaseModel):
    sku: str | None = None
    attributes: dict | None = None
    price_modifier: float | None = None
    independent_price: float | None = None
    weight: int | None = None
    is_default: bool = False

class TemplateVariantOut(BaseModel):
    id: int
    sku: str | None = None
    attributes: dict | None = None
    price_modifier: float | None = None
    independent_price: float | None = None
    weight: int | None = None
    is_default: bool
    model_config = {"from_attributes": True}


# ── Template Source ───────────────────────────────────────────

class TemplateSourceOut(BaseModel):
    id: int
    tenant_id: int
    product_id: int
    tenant_name: str | None = None
    created_at: datetime
    model_config = {"from_attributes": True}


# ── Product Template ─────────────────────────────────────────

class TemplateCreate(BaseModel):
    sku: str = Field(..., max_length=100)
    name: str = Field(..., max_length=255)
    name_en: str | None = None
    description: str | None = None
    description_en: str | None = None
    ai_description: str | None = None
    ai_description_en: str | None = None
    base_price: float | None = None
    cost_price: float | None = None
    market_price: float | None = None
    weight: int | None = None
    length: float | None = None
    width: float | None = None
    height: float | None = None
    extra_attributes: dict | None = None
    meta_title: str | None = None
    meta_title_en: str | None = None
    meta_description: str | None = None
    meta_description_en: str | None = None
    seo_keywords: str | None = None
    seo_keywords_en: str | None = None
    status: str = "pending"
    images: list[TemplateImageIn] = []
    variants: list[TemplateVariantIn] = []
    collection_ids: list[int] = []

class TemplateUpdate(BaseModel):
    sku: str | None = None
    name: str | None = None
    name_en: str | None = None
    description: str | None = None
    description_en: str | None = None
    ai_description: str | None = None
    ai_description_en: str | None = None
    base_price: float | None = None
    cost_price: float | None = None
    market_price: float | None = None
    weight: int | None = None
    length: float | None = None
    width: float | None = None
    height: float | None = None
    extra_attributes: dict | None = None
    meta_title: str | None = None
    meta_title_en: str | None = None
    meta_description: str | None = None
    meta_description_en: str | None = None
    seo_keywords: str | None = None
    seo_keywords_en: str | None = None
    status: str | None = None
    images: list[TemplateImageIn] | None = None
    variants: list[TemplateVariantIn] | None = None
    collection_ids: list[int] | None = None

class TemplateListOut(BaseModel):
    id: int
    sku: str
    name: str
    name_en: str | None = None
    base_price: float | None = None
    status: str
    cover_url: str | None = None
    source_count: int = 0
    import_count: int = 0
    collections: list[CollectionBrief] = []
    created_at: datetime
    model_config = {"from_attributes": True}

class TemplateDetailOut(BaseModel):
    id: int
    sku: str
    name: str
    name_en: str | None = None
    description: str | None = None
    description_en: str | None = None
    ai_description: str | None = None
    ai_description_en: str | None = None
    base_price: float | None = None
    cost_price: float | None = None
    market_price: float | None = None
    weight: int | None = None
    length: float | None = None
    width: float | None = None
    height: float | None = None
    extra_attributes: dict | None = None
    meta_title: str | None = None
    meta_title_en: str | None = None
    meta_description: str | None = None
    meta_description_en: str | None = None
    seo_keywords: str | None = None
    seo_keywords_en: str | None = None
    status: str
    images: list[TemplateImageOut] = []
    variants: list[TemplateVariantOut] = []
    sources: list[TemplateSourceOut] = []
    collections: list[CollectionBrief] = []
    created_at: datetime
    updated_at: datetime
    model_config = {"from_attributes": True}


# ── Duplicate SKU ─────────────────────────────────────────────

class DuplicateSkuOut(BaseModel):
    sku: str
    template_id: int
    template_name: str
    sources: list[TemplateSourceOut] = []


# ── Import Request ────────────────────────────────────────────

class TemplateImportRequest(BaseModel):
    template_ids: list[int] = Field(..., min_length=1, description="要导入的模板 ID 列表")

class TemplateImportResult(BaseModel):
    imported: int
    skipped_skus: list[str] = Field(default_factory=list, description="因 SKU 冲突跳过的模板")


# ── Tenant Collection Assignment ──────────────────────────────

class TenantCollectionAssign(BaseModel):
    tenant_id: int
    collection_ids: list[int]
