"""
Modèle SQLAlchemy pour les articles de la bibliothèque
"""
from sqlalchemy import Column, Integer, String, Float, DateTime, ForeignKey, Enum, Text
from sqlalchemy.orm import relationship
from datetime import datetime
from app.database import Base
import enum


class StatutArticle(str, enum.Enum):
    """Statuts possibles d'un article"""
    ACTIF = "actif"
    STOCK_FAIBLE = "stock_faible"
    ARCHIVE = "archive"
    NOUVEAU = "nouveau"


class Article(Base):
    """
    Article de la bibliothèque Ressources
    Peut être du bois, consommable, chimie, acier, béton, etc.
    """
    __tablename__ = "articles"
    
    # Identification
    id = Column(Integer, primary_key=True, index=True)
    code = Column(String(50), unique=True, nullable=False, index=True)  # ex: BCP-018
    designation = Column(String(255), nullable=False)  # ex: Contre-plaqué 18mm filmé
    categorie_id = Column(Integer, ForeignKey("categories.id"), nullable=False)
    
    # Tarification
    prix_achat_ht = Column(Float, nullable=True)  # Prix d'achat HT
    unite = Column(String(20), nullable=False)  # pièce, plaque, m², m³, ml, kg, litre
    conditionnement = Column(String(100), nullable=True)
    
    # Stock
    stock_actuel = Column(Integer, default=0)
    stock_initial = Column(Integer, default=0)
    seuil_alerte = Column(Integer, default=10)
    statut = Column(Enum(StatutArticle), default=StatutArticle.ACTIF)
    
    # Dimensions (optionnel)
    longueur_cm = Column(Float, nullable=True)
    largeur_cm = Column(Float, nullable=True)
    epaisseur_cm = Column(Float, nullable=True)

    # Longueur unitaire pour calcul de consommation
    longueur_unitaire = Column(Float, nullable=True)
    taux_perte = Column(Float, default=0.0)  # % de perte ex: 5.0 pour 5%
    
    # Fournisseurs (2 fournisseurs possibles)
    fournisseur_1 = Column(String(255), nullable=True)
    ref_fournisseur_1 = Column(String(100), nullable=True)
    delai_livraison_1 = Column(String(50), nullable=True)
    
    fournisseur_2 = Column(String(255), nullable=True)
    ref_fournisseur_2 = Column(String(100), nullable=True)
    delai_livraison_2 = Column(String(50), nullable=True)
    
    # Description
    description = Column(Text, nullable=True)
    
    # Métadonnées
    date_creation = Column(DateTime, default=datetime.utcnow)
    date_modification = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
    
    # Relations
    categorie = relationship("Categorie", back_populates="articles")
    mouvements_stock = relationship("MouvementStock", back_populates="article")
    
    def __repr__(self):
        return f"<Article {self.code} - {self.designation}>"
    
    @property
    def volume_m3(self):
        """Calcule le volume en m³ si dimensions renseignées"""
        if self.longueur_cm and self.largeur_cm and self.epaisseur_cm:
            return (self.longueur_cm * self.largeur_cm * self.epaisseur_cm) / 1_000_000
        return None
    
    @property
    def surface_m2(self):
        """Calcule la surface en m² si dimensions renseignées"""
        if self.longueur_cm and self.largeur_cm:
            return (self.longueur_cm * self.largeur_cm) / 10_000
        return None
    
    @property
    def poids_estime_kg(self):
        """Estime le poids en kg (densité béton 2400 kg/m³)"""
        volume = self.volume_m3
        if volume:
            return volume * 2400
        return None
    
    @property
    def badge_statut(self):
        """Détermine le badge à afficher"""
        if self.statut == StatutArticle.ARCHIVE:
            return {"class": "bar", "text": "⊘ Archivé"}
        elif self.statut == StatutArticle.NOUVEAU:
            return {"class": "bnw", "text": "□ Nouveau"}
        elif self.stock_actuel <= self.seuil_alerte:
            return {"class": "blo", "text": "⚠ Stock faible"}
        else:
            return {"class": "bok", "text": "● Stock OK"}


class MouvementStock(Base):
    """
    Historique des mouvements de stock
    Permet de tracer les entrées/sorties
    """
    __tablename__ = "mouvements_stock"
    
    id = Column(Integer, primary_key=True, index=True)
    article_id = Column(Integer, ForeignKey("articles.id"), nullable=False)
    quantite = Column(Integer, nullable=False)  # Positif=entrée, Négatif=sortie
    type_mouvement = Column(String(50), nullable=False)  # achat, utilisation, ajustement, etc.
    reference = Column(String(100), nullable=True)  # Bon de commande, projet, etc.
    commentaire = Column(Text, nullable=True)
    date_mouvement = Column(DateTime, default=datetime.utcnow)
    projet_id = Column(Integer, nullable=True)
    niveau_id = Column(Integer, nullable=True)
    
    # Relation
    article = relationship("Article", back_populates="mouvements_stock")
    
    def __repr__(self):
        return f"<Mouvement {self.type_mouvement} {self.quantite} - {self.article.code}>"
