"""
Schémas Pydantic pour la validation des clients
"""
from pydantic import BaseModel, Field, EmailStr
from typing import Optional
from datetime import datetime


class ClientBase(BaseModel):
    """Schéma de base pour un client"""
    raison_sociale: str = Field(..., min_length=2, max_length=255)
    forme_juridique: Optional[str] = None
    siret: Optional[str] = Field(None, max_length=14)
    numero_tva: Optional[str] = Field(None, max_length=20)
    
    adresse: str = Field(..., min_length=5, max_length=255)
    code_postal: str = Field(..., min_length=4, max_length=10)
    ville: str = Field(..., min_length=2, max_length=100)
    pays: str = Field(default="France", max_length=100)
    
    civilite_contact: Optional[str] = None
    prenom_contact: Optional[str] = None
    nom_contact: Optional[str] = Field(None, max_length=100)
    telephone: str = Field(..., min_length=10, max_length=20)
    email: Optional[EmailStr] = None
    poste_contact: Optional[str] = None
    
    delai_paiement: str = Field(default="30 jours fin de mois", max_length=100)
    remise_pourcentage: float = Field(default=0.0, ge=0, le=100)
    notes_commerciales: Optional[str] = None
    consignes_chargement: Optional[str] = None


class ClientCreate(ClientBase):
    """Schéma pour créer un client"""
    pass


class ClientUpdate(BaseModel):
    """Schéma pour mettre à jour un client (tous les champs optionnels)"""
    raison_sociale: Optional[str] = None
    forme_juridique: Optional[str] = None
    siret: Optional[str] = None
    numero_tva: Optional[str] = None
    adresse: Optional[str] = None
    code_postal: Optional[str] = None
    ville: Optional[str] = None
    pays: Optional[str] = None
    civilite_contact: Optional[str] = None
    prenom_contact: Optional[str] = None
    nom_contact: Optional[str] = None
    telephone: Optional[str] = None
    email: Optional[EmailStr] = None
    poste_contact: Optional[str] = None
    delai_paiement: Optional[str] = None
    remise_pourcentage: Optional[float] = None
    notes_commerciales: Optional[str] = None
    consignes_chargement: Optional[str] = None
    actif: Optional[int] = None


class ClientResponse(ClientBase):
    """Schéma de réponse pour un client"""
    id: int
    nombre_projets: int
    date_creation: datetime
    date_modification: datetime
    actif: int
    
    # Propriétés calculées
    nom_complet_contact: str
    ville_complete: str
    
    class Config:
        from_attributes = True
