"""
Modèles SQLAlchemy pour le module PROJETS
Préfabrication béton - Gestion commerciale et devis
"""
from sqlalchemy import Column, Integer, String, Float, DateTime, Text, ForeignKey, Boolean, JSON
from sqlalchemy.orm import relationship
from datetime import datetime
from app.database import Base


class Projet(Base):
    """
    Projet de préfabrication béton
    """
    __tablename__ = "projets"
    
    # Identification
    id = Column(Integer, primary_key=True, index=True)
    numero_affaire = Column(String(50), unique=True, nullable=False, index=True)  # Ex: AFF-2026-001
    nom = Column(String(255), nullable=False)
    couleur = Column(String(7), default="#4facfe")  # Couleur hex
    statut = Column(String(20), default="en_cours")  # en_cours, valide, archive
    
    # Client
    client_id = Column(Integer, ForeignKey("clients.id"), nullable=True)    
    # Contacts
    contact_projet_nom = Column(String(100), nullable=True)
    contact_projet_tel = Column(String(20), nullable=True)
    contact_chantier_nom = Column(String(100), nullable=True)
    contact_chantier_tel = Column(String(20), nullable=True)
    
    # Chantier
    adresse_chantier = Column(Text, nullable=False)
    code_postal_chantier = Column(String(10), nullable=False)
    ville_chantier = Column(String(100), nullable=False)
    
    # Planification
    date_reception_armatures = Column(DateTime, nullable=True)
    armaturier = Column(String(100), nullable=True)
    date_livraison_chantier = Column(DateTime, nullable=True)
    consignes_chargement = Column(Text, nullable=True)
    
    # Synthèse (calculés automatiquement)
    poids_total = Column(Float, default=0.0)  # Tonnes
    nb_transports = Column(Integer, default=0)
    convoi_exceptionnel = Column(Boolean, default=False)
    
    # Métadonnées
    date_creation = Column(DateTime, default=datetime.utcnow)
    date_modification = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
    date_archivage = Column(DateTime, nullable=True)
    actif = Column(Integer, default=1)  # 1=actif, 0=archivé
    
    def __repr__(self):
        return f"<Projet {self.numero_affaire} - {self.nom}>"


class Niveau(Base):
    """
    Niveau d'un projet (Fondation, RDC, R+1, etc.)
    """
    __tablename__ = "niveaux"
    
    id = Column(Integer, primary_key=True, index=True)
    projet_id = Column(Integer, ForeignKey("projets.id", ondelete="CASCADE"), nullable=False)
    nom = Column(String(50), nullable=False)  # Ex: Fondation, RDC, R+1
    ordre = Column(Integer, default=0)  # Pour le tri
    date_reception_armatures = Column(DateTime, nullable=True)
    armaturier = Column(String(100), nullable=True)
    date_livraison_chantier = Column(DateTime, nullable=True)
    
    # Métadonnées
    date_creation = Column(DateTime, default=datetime.utcnow)
    
    def __repr__(self):
        return f"<Niveau {self.nom}>"


class Piece(Base):
    """
    Pièce béton préfabriquée (dalle, poutre, longrine, etc.)
    """
    __tablename__ = "pieces"
    
    # Identification
    id = Column(Integer, primary_key=True, index=True)
    projet_id = Column(Integer, ForeignKey("projets.id", ondelete="CASCADE"), nullable=False, index=True)
    niveau_id = Column(Integer, ForeignKey("niveaux.id", ondelete="CASCADE"), nullable=False)
    reference = Column(String(50), nullable=False)
    type_piece = Column(String(100), nullable=False)  # Dalle, Poutre, Longrine, Mur, etc.
    quantite = Column(Integer, default=1)
    
    # Type de coulage
    type_coulage = Column(String(20), default="horizontal")  # horizontal, vertical
    
    # Dimensions (cm)
    epaisseur = Column(Float, nullable=False)
    largeur = Column(Float, nullable=False)  # ou hauteur si vertical
    longueur = Column(Float, nullable=False)
    
    # Béton
    ajustement_volume = Column(Float, default=0.0)  # m³ +/-
    type_beton = Column(String(50), default="XF1")  # XF1, XA2, XA3, Blanc
    
    # Armatures
    type_armature = Column(String(20), default="aucune")  # aucune, cfa, treillis, mixte
    poids_cfa = Column(Float, nullable=True)  # kg
    config_treillis = Column(JSON, nullable=True)  # Configuration treillis
    
    # Accessoires
    becquet_type = Column(String(100), nullable=True)
    becquet_longueur = Column(Float, nullable=True)  # cm
    becquet_auto = Column(Boolean, default=False)
    config_start = Column(JSON, nullable=True)  # Boîtes d'attentes
    config_inserts = Column(JSON, nullable=True)
    config_menuiserie = Column(JSON, nullable=True)
    
    # Transport
    convoi_exceptionnel = Column(Boolean, default=False)
    
    # Tarification
    prix_unitaire_ht = Column(Float, default=0.0)
    
    # Notes
    consignes_chargement = Column(Text, nullable=True)
    notes = Column(Text, nullable=True)
    
    # Calculs automatiques (readonly côté API)
    volume_unitaire = Column(Float, default=0.0)  # m³
    volume_total = Column(Float, default=0.0)  # m³
    poids_unitaire = Column(Float, default=0.0)  # Tonnes
    poids_total = Column(Float, default=0.0)  # Tonnes
    prix_total_ht = Column(Float, default=0.0)  # €
    
    # Métadonnées
    date_creation = Column(DateTime, default=datetime.utcnow)
    date_modification = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
    statut_realisation = Column(String(20), default='en_attente')
    plans_fabriques = Column(Boolean, default=False)
    etiquettes_editees = Column(Boolean, default=False)
    date_fabrication_reelle = Column(DateTime, nullable=True)
    heures_budgetees = Column(Float, nullable=True)
    heures_reelles = Column(Float, nullable=True)
    heures_reelles_verrouillee = Column(Boolean, default=False)
    vol_beton_reel = Column(Float, nullable=True)
    accelerateur_beton = Column(String(100), nullable=True)
    date_livraison_chantier = Column(DateTime, nullable=True)
    
    def calculer_volumes(self):
        """Calcule les volumes et poids"""
        # Volume géométrique + ajustement
        vol_geo = (self.longueur * self.largeur * self.epaisseur) / 1_000_000
        self.volume_unitaire = vol_geo + self.ajustement_volume
        self.volume_total = self.volume_unitaire * self.quantite
        
        # Poids (densité 2.5 T/m³)
        self.poids_unitaire = self.volume_unitaire * 2.5
        self.poids_total = self.poids_unitaire * self.quantite
        
        # Prix
        self.prix_total_ht = self.prix_unitaire_ht * self.quantite
        
        # Transport convoi si L > 250 ET l > 250
        if self.longueur > 250 and self.largeur > 250:
            self.convoi_exceptionnel = True
    
    def __repr__(self):
        return f"<Piece {self.reference} - {self.type_piece}>"
