"""Ürün + kategori + varyant request/response şemaları."""
from datetime import datetime
from decimal import Decimal

from pydantic import BaseModel, ConfigDict, Field

# ============================================================
# VARIANT
# ============================================================


class VariantInput(BaseModel):
    title: str = Field(min_length=1, max_length=300)
    sku: str | None = Field(default=None, max_length=100)
    price: Decimal = Field(ge=0, max_digits=10, decimal_places=2)
    stock_quantity: int = Field(default=0, ge=0)
    attributes: dict | None = None
    is_active: bool = True


class VariantResponse(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: str
    title: str
    sku: str | None
    price: Decimal
    stock_quantity: int
    attributes: dict | None
    is_active: bool


# ============================================================
# PRODUCT
# ============================================================


class CreateProductRequest(BaseModel):
    title: str = Field(min_length=1, max_length=500)
    description: str | None = None
    bullet_points: list[str] | None = None
    sku: str | None = Field(default=None, max_length=100)
    barcode: str | None = Field(default=None, max_length=100)
    price: Decimal = Field(ge=0, max_digits=10, decimal_places=2)
    compare_at_price: Decimal | None = Field(default=None, ge=0, max_digits=10, decimal_places=2)
    currency: str = Field(default="TRY", min_length=3, max_length=3)
    stock_quantity: int = Field(default=0, ge=0)
    low_stock_threshold: int = Field(default=5, ge=0)
    is_active: bool = True
    images: list[str] | None = None
    category_id: str | None = None
    meta: dict | None = None
    variants: list[VariantInput] | None = None


class UpdateProductRequest(BaseModel):
    title: str | None = Field(default=None, min_length=1, max_length=500)
    description: str | None = None
    bullet_points: list[str] | None = None
    sku: str | None = Field(default=None, max_length=100)
    barcode: str | None = Field(default=None, max_length=100)
    price: Decimal | None = Field(default=None, ge=0, max_digits=10, decimal_places=2)
    compare_at_price: Decimal | None = Field(default=None, ge=0, max_digits=10, decimal_places=2)
    currency: str | None = Field(default=None, min_length=3, max_length=3)
    stock_quantity: int | None = Field(default=None, ge=0)
    low_stock_threshold: int | None = Field(default=None, ge=0)
    is_active: bool | None = None
    images: list[str] | None = None
    category_id: str | None = None
    meta: dict | None = None


class ProductResponse(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: str
    tenant_id: str
    category_id: str | None
    title: str
    description: str | None
    bullet_points: list | None
    sku: str | None
    barcode: str | None
    price: Decimal
    compare_at_price: Decimal | None
    currency: str
    stock_quantity: int
    stock_status: str
    low_stock_threshold: int
    is_active: bool
    images: list | None
    embedding_status: str
    meta: dict | None
    variants: list[VariantResponse] = []
    created_at: datetime
    updated_at: datetime


# ============================================================
# CATEGORY
# ============================================================


class CreateCategoryRequest(BaseModel):
    name: str = Field(min_length=1, max_length=200)
    slug: str = Field(min_length=1, max_length=200, pattern=r"^[a-z0-9\-]+$")
    parent_id: str | None = None


class UpdateCategoryRequest(BaseModel):
    name: str | None = Field(default=None, min_length=1, max_length=200)
    slug: str | None = Field(default=None, min_length=1, max_length=200, pattern=r"^[a-z0-9\-]+$")
    parent_id: str | None = None


class CategoryResponse(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: str
    name: str
    slug: str
    parent_id: str | None
    created_at: datetime
