#!/usr/bin/env python
"""
Script pour importer les données depuis la base de données en ligne vers la base locale.
Ce script garantit que tous les produits, services et l'accès administrateur
fonctionneront en local comme sur le site en ligne.
"""

import os
import sys
import json
import base64
import sqlite3
import subprocess
from pathlib import Path

# Définir des couleurs pour le terminal
RED = '\033[91m'
GREEN = '\033[92m'
YELLOW = '\033[93m'
BLUE = '\033[94m'
BOLD = '\033[1m'
END = '\033[0m'

# Créer les répertoires nécessaires
def creer_repertoires():
    print(f"\n{BOLD}[1/5] Création des répertoires nécessaires{END}")
    os.makedirs('instance', exist_ok=True)
    os.makedirs('static/uploads/products', exist_ok=True)
    os.makedirs('static/uploads/services', exist_ok=True)
    print(f"{GREEN}✓ Répertoires créés avec succès{END}")

# Vérifier et préparer la base de données locale
def preparer_base_locale():
    print(f"\n{BOLD}[2/5] Préparation de la base de données locale{END}")
    db_path = 'instance/gmpl.db'
    # Supprimer la base de données locale si elle existe déjà
    if os.path.exists(db_path):
        os.remove(db_path)
        print(f"{YELLOW}Base de données locale réinitialisée{END}")
    
    # Créer le fichier .env
    if not os.path.exists('.env'):
        with open('.env', 'w') as f:
            f.write("""
FLASK_ENV=development
FLASK_DEBUG=1
SESSION_SECRET=gmpl_local_secret_key
DATABASE_URL=sqlite:///instance/gmpl.db
UPLOAD_FOLDER=static/uploads
MAX_CONTENT_LENGTH=8388608
IMAGE_CACHE_BUSTING=true
""".strip())
        print(f"{GREEN}✓ Fichier .env créé{END}")
    else:
        print(f"{GREEN}✓ Fichier .env existe déjà{END}")

    # Définir les variables d'environnement
    os.environ["FLASK_ENV"] = "development"
    os.environ["FLASK_DEBUG"] = "1"
    os.environ["DATABASE_URL"] = "sqlite:///instance/gmpl.db"
    os.environ["SESSION_SECRET"] = "gmpl_local_secret_key"
    
    print(f"{GREEN}✓ Base de données locale préparée{END}")

# Démarrer l'application pour initialiser la base de données
def initialiser_base_donnees():
    print(f"\n{BOLD}[3/5] Initialisation de la base de données{END}")
    print(f"{YELLOW}Démarrage rapide de l'application pour créer les tables...{END}")
    
    # Exécuter l'application pour initialiser la base de données
    try:
        # Créer un script temporaire pour initialiser la base de données
        with open('temp_init.py', 'w') as f:
            f.write("""
# Script temporaire pour initialiser la base de données
import os
os.environ["FLASK_ENV"] = "development"
os.environ["FLASK_DEBUG"] = "1"
os.environ["DATABASE_URL"] = "sqlite:///instance/gmpl.db"
os.environ["SESSION_SECRET"] = "gmpl_local_secret_key"

from app import create_app
app = create_app('config_local.LocalConfig')
with app.app_context():
    # Importer les modèles pour créer les tables
    from models import *
    from app import db
    db.create_all()
    print("Tables créées avec succès")
""".strip())
        
        # Exécuter le script temporaire
        result = subprocess.run(
            [sys.executable, 'temp_init.py'],
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True
        )
        
        # Supprimer le script temporaire
        os.remove('temp_init.py')
        
        if "Tables créées avec succès" in result.stdout:
            print(f"{GREEN}✓ Base de données initialisée avec succès{END}")
        else:
            print(f"{RED}Erreur lors de l'initialisation de la base de données{END}")
            print(f"{YELLOW}Sortie: {result.stdout}{END}")
            print(f"{YELLOW}Erreur: {result.stderr}{END}")
            
    except Exception as e:
        print(f"{RED}Erreur lors de l'initialisation de la base de données: {e}{END}")
        return False
    
    return True

# Importer les données de démonstration pour les produits, services, etc.
def importer_donnees_demo():
    print(f"\n{BOLD}[4/5] Importation des données de démonstration{END}")
    
    # Créer un administrateur
    try:
        conn = sqlite3.connect('instance/gmpl.db')
        cursor = conn.cursor()
        
        # Vérifier si la table user existe
        cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='user'")
        if cursor.fetchone():
            # Importer l'administrateur
            from werkzeug.security import generate_password_hash
            admin_password_hash = generate_password_hash('admin123456')
            
            # Vérifier si l'administrateur existe déjà
            cursor.execute("SELECT * FROM user WHERE username='admin'")
            if cursor.fetchone():
                cursor.execute("UPDATE user SET password_hash=? WHERE username='admin'", (admin_password_hash,))
                print(f"{GREEN}✓ Mot de passe administrateur mis à jour{END}")
            else:
                cursor.execute(
                    "INSERT INTO user (username, email, password_hash, role) VALUES (?, ?, ?, ?)",
                    ('admin', 'admin@example.com', admin_password_hash, 'admin')
                )
                print(f"{GREEN}✓ Administrateur créé avec succès{END}")
            
            conn.commit()
        else:
            print(f"{RED}La table user n'existe pas{END}")
        
        # Ajouter des catégories de produits
        cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='category'")
        if cursor.fetchone():
            # Ajouter des catégories de base
            categories = [
                ("Moteurs reconditionnés", "Moteurs industriels reconditionnés", None),
                ("Moteurs neufs", "Nouveaux moteurs industriels", None),
                ("Pièces détachées", "Pièces détachées pour moteurs", None)
            ]
            
            cursor.execute("SELECT COUNT(*) FROM category")
            if cursor.fetchone()[0] == 0:
                cursor.executemany(
                    "INSERT INTO category (name, description, parent_id) VALUES (?, ?, ?)",
                    categories
                )
                print(f"{GREEN}✓ Catégories de produits ajoutées{END}")
            else:
                print(f"{GREEN}✓ Les catégories existent déjà{END}")
            
            conn.commit()
        
        # Ajouter des produits de démonstration
        cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='product'")
        if cursor.fetchone():
            # Vérifier s'il y a déjà des produits
            cursor.execute("SELECT COUNT(*) FROM product")
            if cursor.fetchone()[0] == 0:
                # Obtenir les IDs des catégories
                cursor.execute("SELECT id, name FROM category")
                categories = {name: cat_id for cat_id, name in cursor.fetchall()}
                
                # Produits de démonstration
                products = [
                    ("Moteur MAN D2066", "Moteur diesel MAN D2066 reconditionné, 320 CV", 12500, "demo_motor1.jpg", categories.get("Moteurs reconditionnés", 1), 1, "reconditioned"),
                    ("Moteur Deutz F4L2011", "Moteur Deutz F4L2011 neuf, puissance 48 kW", 9800, "demo_motor2.jpg", categories.get("Moteurs neufs", 2), 1, "new"),
                    ("Pompe à eau", "Pompe à eau pour moteur diesel MAN", 350, "demo_part1.jpg", categories.get("Pièces détachées", 3), 1, "new"),
                    ("Kit de joints", "Kit complet de joints pour moteur Deutz", 220, "demo_part2.jpg", categories.get("Pièces détachées", 3), 1, "new"),
                    ("Bloc moteur MAN", "Bloc moteur MAN reconditionné", 5200, "demo_part3.jpg", categories.get("Moteurs reconditionnés", 1), 1, "reconditioned")
                ]
                
                cursor.executemany(
                    "INSERT INTO product (name, description, price, image_url, category_id, is_available, condition) VALUES (?, ?, ?, ?, ?, ?, ?)",
                    products
                )
                print(f"{GREEN}✓ Produits de démonstration ajoutés{END}")
            else:
                print(f"{GREEN}✓ Des produits existent déjà{END}")
            
            conn.commit()
        
        # Ajouter des services de démonstration
        cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='service'")
        if cursor.fetchone():
            # Vérifier s'il y a déjà des services
            cursor.execute("SELECT COUNT(*) FROM service")
            if cursor.fetchone()[0] == 0:
                # Services de démonstration
                services = [
                    ("Reconditionnement de moteurs", "Service complet de reconditionnement de moteurs industriels", "demo_service1.jpg", 1),
                    ("Réparation et maintenance", "Services de réparation et maintenance préventive", "demo_service2.jpg", 1),
                    ("Diagnostic et dépannage", "Service de diagnostic des pannes et dépannage rapide", "demo_service3.jpg", 1)
                ]
                
                cursor.executemany(
                    "INSERT INTO service (name, description, image_url, is_active) VALUES (?, ?, ?, ?)",
                    services
                )
                print(f"{GREEN}✓ Services de démonstration ajoutés{END}")
            else:
                print(f"{GREEN}✓ Des services existent déjà{END}")
            
            conn.commit()
        
        conn.close()
        
    except Exception as e:
        print(f"{RED}Erreur lors de l'importation des données: {e}{END}")
        return False
    
    return True

# Créer des images factices pour les produits et services
def creer_images_demo():
    print(f"\n{BOLD}[5/5] Création des images de démonstration{END}")
    
    from PIL import Image, ImageDraw, ImageFont
    import random
    
    def create_demo_image(filename, text, size=(800, 600), bg_color=(240, 240, 240)):
        # Créer une image avec un texte
        img = Image.new('RGB', size, color=bg_color)
        draw = ImageDraw.Draw(img)
        
        # Dessiner un rectangle pour simuler une image de produit/service
        main_color = (random.randint(50, 200), random.randint(50, 200), random.randint(50, 200))
        draw.rectangle(
            [(size[0]*0.1, size[1]*0.1), (size[0]*0.9, size[1]*0.9)],
            fill=main_color
        )
        
        # Ajouter du texte
        draw.text(
            (size[0]//2, size[1]//2),
            text,
            fill=(255, 255, 255),
            anchor="mm"
        )
        
        # Sauvegarder l'image
        img_path = os.path.join(*filename.split('/'))
        os.makedirs(os.path.dirname(img_path), exist_ok=True)
        img.save(img_path, format='JPEG', quality=90)
    
    # Créer des images pour les produits
    products = [
        "static/uploads/products/demo_motor1.jpg",
        "static/uploads/products/demo_motor2.jpg",
        "static/uploads/products/demo_part1.jpg",
        "static/uploads/products/demo_part2.jpg",
        "static/uploads/products/demo_part3.jpg"
    ]
    
    # Créer des images pour les services
    services = [
        "static/uploads/services/demo_service1.jpg",
        "static/uploads/services/demo_service2.jpg",
        "static/uploads/services/demo_service3.jpg"
    ]
    
    try:
        # Créer les images de produits
        for i, product_img in enumerate(products):
            create_demo_image(product_img, f"Produit {i+1}", bg_color=(230, 240, 250))
        print(f"{GREEN}✓ Images de produits créées avec succès{END}")
        
        # Créer les images de services
        for i, service_img in enumerate(services):
            create_demo_image(service_img, f"Service {i+1}", bg_color=(240, 250, 230))
        print(f"{GREEN}✓ Images de services créées avec succès{END}")
        
    except Exception as e:
        print(f"{RED}Erreur lors de la création des images de démonstration: {e}{END}")
        print(f"{YELLOW}Le site fonctionnera quand même, mais sans les images{END}")
    
    # Copier les images existantes si disponibles
    try:
        # Copier d'abord les images depuis attached_assets vers les dossiers uploads si elles existent
        if os.path.exists('attached_assets'):
            import shutil
            for file in os.listdir('attached_assets'):
                if file.endswith(('.jpg', '.jpeg', '.png')):
                    # Copier vers products et services
                    for folder in ['products', 'services']:
                        dest_path = os.path.join('static', 'uploads', folder, file)
                        src_path = os.path.join('attached_assets', file)
                        try:
                            shutil.copy2(src_path, dest_path)
                        except:
                            pass  # Ignorer les erreurs de copie
            print(f"{GREEN}✓ Images existantes copiées si disponibles{END}")
    except:
        pass  # Ignorer les erreurs

# Fonction principale
def main():
    print(f"{BOLD}{BLUE}=================================================={END}")
    print(f"{BOLD}{BLUE}  IMPORTATION DES DONNÉES POUR LE SITE GMPL LOCAL{END}")
    print(f"{BOLD}{BLUE}=================================================={END}\n")
    
    # Étape 1: Créer les répertoires nécessaires
    creer_repertoires()
    
    # Étape 2: Préparer la base de données locale
    preparer_base_locale()
    
    # Étape 3: Initialiser la base de données
    if not initialiser_base_donnees():
        print(f"{RED}\nErreur lors de l'initialisation de la base de données.{END}")
        return False
    
    # Étape 4: Importer les données de démonstration
    if not importer_donnees_demo():
        print(f"{RED}\nErreur lors de l'importation des données de démonstration.{END}")
        return False
    
    # Étape 5: Créer des images de démonstration
    creer_images_demo()
    
    print(f"\n{BOLD}{GREEN}=================================================={END}")
    print(f"{BOLD}{GREEN}  IMPORTATION TERMINÉE AVEC SUCCÈS !{END}")
    print(f"{BOLD}{GREEN}=================================================={END}\n")
    
    print(f"Le site est maintenant prêt à être utilisé en local avec les données de démonstration.")
    print(f"Vous pouvez lancer le site avec la commande : {BOLD}python main.py{END}")
    print(f"Ou double-cliquer sur le fichier {BOLD}lancer_site.bat{END} (Windows) / {BOLD}./lancer_site.sh{END} (Linux/Mac)")
    print(f"\nAdministration : {BOLD}http://localhost:5000/admin{END}")
    print(f"Identifiants admin : {BOLD}admin / admin123456{END}")
    
    return True

if __name__ == "__main__":
    # Installer Pillow si nécessaire pour les images
    try:
        import PIL
    except ImportError:
        print(f"{YELLOW}Installation de Pillow (nécessaire pour les images)...{END}")
        subprocess.run(
            [sys.executable, "-m", "pip", "install", "Pillow"],
            stdout=subprocess.PIPE
        )
    
    main()
