"""
Schémas Pydantic pour la validation des articles
"""
from pydantic import BaseModel, Field, field_validator
from typing import Optional
from datetime import datetime
from app.models.article import StatutArticle


class ArticleBase(BaseModel):
    """Schéma de base pour un article"""
    code: str = Field(..., min_length=3, max_length=50, description="Code article unique")
    designation: str = Field(..., min_length=3, max_length=255, description="Désignation de l'article")
    categorie_id: int = Field(..., gt=0, description="ID de la catégorie")
    
    prix_achat_ht: Optional[float] = Field(None, ge=0, description="Prix d'achat HT")
    unite: str = Field(..., description="Unité (pièce, plaque, m², etc.)")
    conditionnement: Optional[str] = None
    
    stock_initial: int = Field(default=0, ge=0, description="Stock initial")
    seuil_alerte: int = Field(default=10, ge=0, description="Seuil d'alerte stock")
    
    # Dimensions
    longueur_cm: Optional[float] = Field(None, gt=0)
    largeur_cm: Optional[float] = Field(None, gt=0)
    epaisseur_cm: Optional[float] = Field(None, gt=0)

    # Longueur unitaire (cm pour barres, cm² pour panneaux, None pour unités)
    longueur_unitaire: Optional[float] = Field(None, gt=0)
    taux_perte: Optional[float] = Field(0.0, ge=0)  # % de perte
    
    # Fournisseurs
    fournisseur_1: Optional[str] = None
    ref_fournisseur_1: Optional[str] = None
    delai_livraison_1: Optional[str] = None
    
    fournisseur_2: Optional[str] = None
    ref_fournisseur_2: Optional[str] = None
    delai_livraison_2: Optional[str] = None
    
    description: Optional[str] = None


class ArticleCreate(ArticleBase):
    """Schéma pour créer un article"""
    pass


class ArticleUpdate(BaseModel):
    """Schéma pour mettre à jour un article (tous les champs optionnels)"""
    code: Optional[str] = None
    designation: Optional[str] = None
    categorie_id: Optional[int] = None
    prix_achat_ht: Optional[float] = None
    unite: Optional[str] = None
    conditionnement: Optional[str] = None
    stock_initial: Optional[int] = None
    seuil_alerte: Optional[int] = None
    longueur_cm: Optional[float] = None
    largeur_cm: Optional[float] = None
    epaisseur_cm: Optional[float] = None
    longueur_unitaire: Optional[float] = None
    fournisseur_1: Optional[str] = None
    ref_fournisseur_1: Optional[str] = None
    delai_livraison_1: Optional[str] = None
    fournisseur_2: Optional[str] = None
    ref_fournisseur_2: Optional[str] = None
    delai_livraison_2: Optional[str] = None
    description: Optional[str] = None
    statut: Optional[StatutArticle] = None
    longueur_unitaire: Optional[float] = None
    taux_perte: Optional[float] = None


class ArticleResponse(ArticleBase):
    """Schéma de réponse pour un article"""
    id: int
    stock_actuel: int
    statut: StatutArticle
    date_creation: datetime
    date_modification: datetime
    
    # Propriétés calculées
    volume_m3: Optional[float] = None
    surface_m2: Optional[float] = None
    poids_estime_kg: Optional[float] = None
    badge_statut: dict
    
    class Config:
        from_attributes = True


class MouvementStockCreate(BaseModel):
    article_id: int = Field(..., gt=0)
    quantite: int = Field(..., description="Quantité (+ entrée, - sortie)")
    type_mouvement: str = Field(..., description="Type: achat, utilisation, ajustement, etc.")
    reference: Optional[str] = None
    commentaire: Optional[str] = None
    projet_id: Optional[int] = None
    niveau_id: Optional[int] = None


class MouvementStockResponse(BaseModel):
    """Schéma de réponse pour un mouvement de stock"""
    id: int
    article_id: int
    quantite: int
    type_mouvement: str
    reference: Optional[str]
    commentaire: Optional[str]
    date_mouvement: datetime
    
    class Config:
        from_attributes = True
