"""
Schémas Pydantic pour les pièces béton
"""
from pydantic import BaseModel, Field
from typing import Optional, Dict, Any
from datetime import datetime


class PieceBase(BaseModel):
    """Schéma de base pour une pièce"""
    reference: str = Field(..., min_length=1, max_length=50)
    type_piece: str = Field(..., min_length=2, max_length=100)
    quantite: int = Field(default=1, ge=1)
    
    type_coulage: str = Field(default="horizontal")
    
    epaisseur: float = Field(..., gt=0)
    largeur: float = Field(..., gt=0)
    longueur: float = Field(..., gt=0)
    
    ajustement_volume: float = Field(default=0.0)
    type_beton: str = Field(default="XF1", max_length=50)
    
    type_armature: str = Field(default="aucune")
    poids_cfa: Optional[float] = None
    config_treillis: Optional[Dict[str, Any]] = None
    
    becquet_type: Optional[str] = None
    becquet_longueur: Optional[float] = None
    becquet_auto: bool = Field(default=False)
    config_start: Optional[Dict[str, Any]] = None
    config_inserts: Optional[Dict[str, Any]] = None
    config_menuiserie: Optional[Dict[str, Any]] = None
    
    convoi_exceptionnel: bool = Field(default=False)
    prix_unitaire_ht: float = Field(default=0.0, ge=0)
    heures_budgetees: Optional[float] = None
    notes: Optional[str] = None


class PieceCreate(PieceBase):
    """Schéma pour créer une pièce"""
    projet_id: int
    niveau_id: int


class PieceUpdate(BaseModel):
    """Schéma pour mettre à jour une pièce"""
    reference: Optional[str] = None
    type_piece: Optional[str] = None
    quantite: Optional[int] = None
    niveau_id: Optional[int] = None
    type_coulage: Optional[str] = None
    epaisseur: Optional[float] = None
    largeur: Optional[float] = None
    longueur: Optional[float] = None
    ajustement_volume: Optional[float] = None
    type_beton: Optional[str] = None
    type_armature: Optional[str] = None
    poids_cfa: Optional[float] = None
    config_treillis: Optional[Dict[str, Any]] = None
    becquet_type: Optional[str] = None
    becquet_longueur: Optional[float] = None
    becquet_auto: Optional[bool] = None
    config_start: Optional[Dict[str, Any]] = None
    config_inserts: Optional[Dict[str, Any]] = None
    config_menuiserie: Optional[Dict[str, Any]] = None
    convoi_exceptionnel: Optional[bool] = None
    prix_unitaire_ht: Optional[float] = None
    notes: Optional[str] = None
    statut_realisation: Optional[str] = None
    date_fabrication_reelle: Optional[datetime] = None
    heures_budgetees: Optional[float] = None
    heures_reelles: Optional[float] = None
    heures_reelles_verrouillee: Optional[int] = None
    date_livraison_chantier: Optional[datetime] = None
    plans_fabriques: Optional[bool] = None
    etiquettes_editees: Optional[bool] = None
    vol_beton_reel: Optional[float] = None
    accelerateur_beton: Optional[str] = None


class PieceResponse(PieceBase):
    """Schéma de réponse pour une pièce"""
    id: int
    projet_id: int
    niveau_id: int
    
    # Calculs automatiques
    volume_unitaire: float
    volume_total: float
    poids_unitaire: float
    poids_total: float
    prix_total_ht: float
    
    date_creation: datetime
    date_modification: datetime
    statut_realisation: Optional[str] = 'en_attente'
    date_fabrication_reelle: Optional[datetime] = None
    date_livraison_chantier: Optional[datetime] = None
    heures_budgetees: Optional[float] = None
    heures_reelles: Optional[float] = None
    heures_reelles_verrouillee: Optional[int] = 0
    vol_beton_reel: Optional[float] = None
    accelerateur_beton: Optional[str] = None
    plans_fabriques: Optional[bool] = False
    etiquettes_editees: Optional[bool] = False
    
    class Config:
        from_attributes = True
