"""
Script d'initialisation de la base de données
Crée les tables et insère des données de démonstration
"""
import sys
from pathlib import Path

# Ajouter le répertoire parent au path
sys.path.insert(0, str(Path(__file__).parent))

from app.database import engine, SessionLocal, Base
from app.models import Categorie, Article, Client, StatutArticle
from datetime import datetime


def init_categories(db):
    """Initialise les catégories par défaut"""
    print("📁 Création des catégories...")
    
    # Stock (racine)
    stock = Categorie(nom="Stock", icone="📦", niveau=1)
    db.add(stock)
    db.flush()
    
    # Sous-catégories de Stock
    bois = Categorie(nom="Bois", icone="🪵", niveau=2, parent_id=stock.id)
    consommable = Categorie(nom="Consommable", icone="🔩", niveau=2, parent_id=stock.id)
    chimie = Categorie(nom="Chimie", icone="🧪", niveau=2, parent_id=stock.id)
    acier = Categorie(nom="Acier", icone="⚙️", niveau=2, parent_id=stock.id)
    
    db.add_all([bois, consommable, chimie, acier])
    db.flush()
    
    # Sous-sous-catégories de Bois
    planche = Categorie(nom="Planche", niveau=3, parent_id=bois.id)
    db.add(planche)
    db.flush()
    
    # Béton (racine)
    beton = Categorie(nom="Béton", icone="🏗️", niveau=1)
    db.add(beton)
    db.flush()
    
    db.commit()
    print(f"✅ {db.query(Categorie).count()} catégories créées")
    
    return {"stock": stock, "bois": bois, "planche": planche, "consommable": consommable}


def init_articles(db, categories):
    """Initialise les articles de démonstration"""
    print("📦 Création des articles de démo...")
    
    articles = [
        Article(
            code="BCP-018",
            designation="Contre-plaqué 18 mm",
            categorie_id=categories["planche"].id,
            prix_achat_ht=28.50,
            unite="plaque",
            stock_actuel=46,
            stock_initial=50,
            seuil_alerte=10,
            longueur_cm=244,
            largeur_cm=122,
            epaisseur_cm=1.8,
            fournisseur_1="Panneaux du Nord",
            ref_fournisseur_1="PAN-18-FLM",
            delai_livraison_1="3-5 jours",
            fournisseur_2="Panneaux du Nord",
            ref_fournisseur_2="PAN-18-FLM",
            delai_livraison_2="3-5 jours",
            statut=StatutArticle.ACTIF
        ),
        Article(
            code="BCP-022",
            designation="Contre-plaqué 22 mm",
            categorie_id=categories["planche"].id,
            prix_achat_ht=34.00,
            unite="plaque",
            stock_actuel=4,
            stock_initial=50,
            seuil_alerte=10,
            longueur_cm=244,
            largeur_cm=122,
            epaisseur_cm=2.2,
            fournisseur_1="Panneaux du Nord",
            ref_fournisseur_1="PAN-22-FLM",
            delai_livraison_1="3-5 jours",
            statut=StatutArticle.STOCK_FAIBLE
        ),
        Article(
            code="BCP-027",
            designation="Contre-plaqué 27 mm",
            categorie_id=categories["planche"].id,
            prix_achat_ht=41.20,
            unite="plaque",
            stock_actuel=22,
            stock_initial=30,
            seuil_alerte=8,
            longueur_cm=244,
            largeur_cm=122,
            epaisseur_cm=2.7,
            fournisseur_1="Panneaux du Nord",
            ref_fournisseur_1="PAN-27-BRT",
            delai_livraison_1="3-5 jours",
            statut=StatutArticle.ACTIF
        ),
        Article(
            code="BPL-200",
            designation="Planche coffrage 200×20",
            categorie_id=categories["planche"].id,
            prix_achat_ht=5.40,
            unite="u.",
            stock_actuel=312,
            stock_initial=500,
            seuil_alerte=50,
            longueur_cm=200,
            largeur_cm=20,
            fournisseur_1="Scierie Martin",
            ref_fournisseur_1="SM-200-20",
            delai_livraison_1="5-7 jours",
            statut=StatutArticle.ACTIF
        ),
        Article(
            code="BCP-PH18",
            designation="CP Phénolique 18 mm",
            categorie_id=categories["planche"].id,
            prix_achat_ht=52.00,
            unite="plaque",
            stock_actuel=18,
            stock_initial=20,
            seuil_alerte=8,
            longueur_cm=244,
            largeur_cm=122,
            epaisseur_cm=1.8,
            fournisseur_1="EuroPanneaux",
            ref_fournisseur_1="EP-PH-18",
            delai_livraison_1="7-10 jours",
            statut=StatutArticle.NOUVEAU
        ),
        Article(
            code="BPL-100",
            designation="Planche 100×27 (obsolète)",
            categorie_id=categories["planche"].id,
            prix_achat_ht=3.20,
            unite="u.",
            stock_actuel=0,
            stock_initial=100,
            seuil_alerte=20,
            longueur_cm=100,
            epaisseur_cm=2.7,
            fournisseur_1="Scierie Martin",
            ref_fournisseur_1="SM-100-27",
            statut=StatutArticle.ARCHIVE
        ),
    ]
    
    db.add_all(articles)
    db.commit()
    print(f"✅ {len(articles)} articles créés")


def init_clients(db):
    """Initialise les clients de démonstration"""
    print("👥 Création des clients de démo...")
    
    clients = [
        Client(
            raison_sociale="Bouygues Construction",
            siret="39751014200034",
            adresse="32 Avenue Hoche",
            code_postal="75008",
            ville="Paris",
            nom_contact="Lefebvre",
            prenom_contact="Jean",
            civilite_contact="M.",
            telephone="01 44 20 00 00",
            nombre_projets=12
        ),
        Client(
            raison_sociale="Vinci Immobilier",
            siret="55212086600306",
            adresse="1 Cours Ferdinand de Lesseps",
            code_postal="69006",
            ville="Lyon",
            nom_contact="Bernard",
            prenom_contact="Marie",
            civilite_contact="Mme.",
            telephone="04 72 00 00 00",
            nombre_projets=8
        ),
        Client(
            raison_sociale="Eiffage Construction",
            siret="38966006700059",
            adresse="3-7 Place de l'Europe",
            code_postal="33000",
            ville="Bordeaux",
            nom_contact="Moreau",
            civilite_contact="M.",
            telephone="05 56 00 00 00",
            nombre_projets=5
        ),
        Client(
            raison_sociale="Nexity",
            siret="44071140800160",
            adresse="19 Rue de Vienne",
            code_postal="13013",
            ville="Marseille",
            nom_contact="Dupuis",
            prenom_contact="Sophie",
            civilite_contact="Mme.",
            telephone="04 91 00 00 00",
            nombre_projets=3
        ),
    ]
    
    db.add_all(clients)
    db.commit()
    print(f"✅ {len(clients)} clients créés")


def main():
    """Fonction principale d'initialisation"""
    print("🚀 MAESTRO - Initialisation de la base de données")
    print("=" * 60)
    
    # Créer toutes les tables
    print("📊 Création des tables...")
    Base.metadata.create_all(bind=engine)
    print("✅ Tables créées")
    
    # Créer une session
    db = SessionLocal()
    
    try:
        # Vérifier si des données existent déjà
        if db.query(Categorie).count() > 0:
            print("⚠️  Des données existent déjà dans la base.")
            response = input("Voulez-vous réinitialiser ? (oui/non): ")
            if response.lower() != "oui":
                print("❌ Initialisation annulée")
                return
            
            # Supprimer toutes les données
            print("🗑️  Suppression des données existantes...")
            Base.metadata.drop_all(bind=engine)
            Base.metadata.create_all(bind=engine)
        
        # Initialiser les données de démo
        categories = init_categories(db)
        init_articles(db, categories)
        init_clients(db)
        
        print("=" * 60)
        print("✅ Initialisation terminée avec succès !")
        print("\n📝 Résumé:")
        print(f"   • Catégories: {db.query(Categorie).count()}")
        print(f"   • Articles: {db.query(Article).count()}")
        print(f"   • Clients: {db.query(Client).count()}")
        print("\n🚀 Vous pouvez maintenant démarrer l'API:")
        print("   python -m app.main")
        print("   ou: uvicorn app.main:app --reload")
        
    except Exception as e:
        print(f"❌ Erreur: {e}")
        db.rollback()
    finally:
        db.close()


if __name__ == "__main__":
    main()
