"""Modèles de données SQLModel pour la cave à vin."""
from typing import Optional
from datetime import datetime, date
from sqlmodel import SQLModel, Field


class Cave(SQLModel, table=True):
    """Unité de stockage physique (rayonnage, meuble vitrine...)."""
    id: Optional[int] = Field(default=None, primary_key=True)
    nom: str
    type: str = "rayonnage"          # rayonnage | meuble_vitrine
    nb_etageres: int = 5
    nb_positions: int = 12           # positions par étagère
    temperature: Optional[float] = None  # °C
    description: Optional[str] = None
    date_creation: datetime = Field(default_factory=datetime.utcnow)


class CaveCreate(SQLModel):
    nom: str
    type: str = "rayonnage"
    nb_etageres: int = 5
    nb_positions: int = 12
    temperature: Optional[float] = None
    description: Optional[str] = None


class CaveUpdate(SQLModel):
    nom: Optional[str] = None
    type: Optional[str] = None
    nb_etageres: Optional[int] = None
    nb_positions: Optional[int] = None
    temperature: Optional[float] = None
    description: Optional[str] = None


class BouteilleBase(SQLModel):
    """Champs communs à la création et à la mise à jour."""
    nom: str
    producteur: Optional[str] = None
    appellation: Optional[str] = None
    region: Optional[str] = None
    pays: Optional[str] = "France"
    couleur: str = "rouge"           # rouge | blanc | rosé | effervescent | autre
    cepages: Optional[str] = None
    millesime: Optional[int] = None  # None = sans-année
    quantite: int = 1
    format: Optional[str] = "Bouteille 75cl"
    sous_type: Optional[str] = None     # Still | Sparkling | Port | …
    designation: Optional[str] = None  # AOP | IGP | …
    classification: Optional[str] = None  # Grand Cru | Premier Cru Classé | …
    cave_id: Optional[int] = None      # référence à Cave.id
    etagere: Optional[int] = None      # numéro d'étagère (1-based)
    position: Optional[int] = None     # position sur l'étagère (1-based)
    prix_achat: Optional[float] = None
    date_achat: Optional[date] = None
    apogee_debut: Optional[int] = None
    apogee_fin: Optional[int] = None
    note: Optional[float] = None     # sur 20
    commentaire: Optional[str] = None


class Bouteille(BouteilleBase, table=True):
    """Table principale de la cave."""
    id: Optional[int] = Field(default=None, primary_key=True)
    date_creation: datetime = Field(default_factory=datetime.utcnow)
    date_modification: datetime = Field(default_factory=datetime.utcnow)


class BouteilleCreate(BouteilleBase):
    """Schéma pour la création d'une bouteille (POST)."""
    pass


class BouteilleUpdate(SQLModel):
    """Schéma pour la mise à jour partielle (PUT) — tous les champs sont optionnels."""
    nom: Optional[str] = None
    producteur: Optional[str] = None
    appellation: Optional[str] = None
    region: Optional[str] = None
    pays: Optional[str] = None
    couleur: Optional[str] = None
    cepages: Optional[str] = None
    millesime: Optional[int] = None
    quantite: Optional[int] = None
    format: Optional[str] = None
    sous_type: Optional[str] = None
    designation: Optional[str] = None
    classification: Optional[str] = None
    cave_id: Optional[int] = None
    etagere: Optional[int] = None
    position: Optional[int] = None
    prix_achat: Optional[float] = None
    date_achat: Optional[date] = None
    apogee_debut: Optional[int] = None
    apogee_fin: Optional[int] = None
    note: Optional[float] = None
    commentaire: Optional[str] = None
