from __future__ import annotations
from pydantic import BaseModel
from typing import Any


class LanguageMeta(BaseModel):
    id: int
    name: str


class OptionTypeMeta(BaseModel):
    id: int
    type: str
    name: str


class CustomerGroupMeta(BaseModel):
    id: int
    name: str


class OcMeta(BaseModel):
    exported_at: str
    oc_prefix: str
    languages: list[LanguageMeta]
    option_types: list[OptionTypeMeta]
    customer_groups: list[CustomerGroupMeta]
    counts: dict[str, int]


class UploadResponse(BaseModel):
    import_id: str
    meta: OcMeta


# ── mapping config submitted in step 2 ──

class OptionMapping(BaseModel):
    option_id: int
    attribute_key: str = ""     # e.g. "规格"；前端清空时允许空字符串


class CustomerGroupMapping(BaseModel):
    customer_group_id: int
    member_level_id: int | None = None  # None = ignore；前端 clearable 清空时不传也OK


class MappingConfig(BaseModel):
    language_id: int
    english_language_id: int | None = None
    option_mappings: list[OptionMapping]
    customer_group_mappings: list[CustomerGroupMapping]
    price_source: str           # "product_price" | "group_{id}"
    conflict_strategy: str      # "skip" | "overwrite"
    oc_image_base_url: str = "" # 原 OpenCart 站图片根地址，如 https://oldstore.com
                                # 填写后图片直接指向旧站；留空则尝试从 ZIP 内复制


# ── preview response ──

class PreviewResponse(BaseModel):
    brands_total: int
    categories_total: int
    products_total: int
    sku_conflicts: int           # SKUs already in DB


# ── available server-side files ──

class ServerFile(BaseModel):
    filename: str
    size: int          # bytes
    mtime: float       # unix timestamp


class AvailableFilesResponse(BaseModel):
    drop_dir: str
    files: list[ServerFile]


class UseFileRequest(BaseModel):
    filename: str


# ── run response ──

class ImportError(BaseModel):
    sku: str
    name: str = ""
    reason: str


class RunResponse(BaseModel):
    brands_created: int
    brands_skipped: int
    categories_created: int
    products_created: int
    products_skipped: int
    products_overwritten: int
    variants_created: int
    tier_prices_created: int
    images_copied: int
    images_missing: int
    errors: list[ImportError]
    skipped_skus: list[str] = []
    error_log_url: str | None = None


class ImageSyncRequest(BaseModel):
    oc_image_base_url: str  # 旧 OpenCart 站域名，如 https://old.com
