#!/usr/bin/env python
"""
Script pour ajouter des services à la base de données locale.
Ce script ajoute des services de démonstration à une base de données SQLite locale.
"""
import os
import sys
import shutil
from pathlib import Path

# Couleurs pour les messages console
COLORS = {
    'GREEN': '\033[92m',
    'YELLOW': '\033[93m',
    'RED': '\033[91m',
    'BOLD': '\033[1m',
    'END': '\033[0m'
}

# Fonction pour afficher des messages colorés
def print_colored(message, color):
    print(f"{COLORS[color]}{message}{COLORS['END']}")

def print_header(message):
    print("\n" + "=" * 80)
    print_colored(f" {message.upper()} ", 'BOLD')
    print("=" * 80)

def print_step(step, message):
    print(f"\n{COLORS['BOLD']}[{step}]{COLORS['END']} {message}")

def print_error(message):
    print(f"{COLORS['RED']}ERROR: {message}{COLORS['END']}")

def print_success(message):
    print(f"{COLORS['GREEN']}SUCCESS: {message}{COLORS['END']}")

def print_warning(message):
    print(f"{COLORS['YELLOW']}WARNING: {message}{COLORS['END']}")

# Vérification de l'existence du dossier pour les images des services
def check_services_folder():
    uploads_path = Path('static/uploads/services')
    if not uploads_path.exists():
        print_warning("Dossier pour les images des services non trouvé. Création...")
        uploads_path.mkdir(parents=True, exist_ok=True)
        print_success("Dossier créé: static/uploads/services")
    else:
        print_success("Dossier pour les images des services OK.")

# Copie des images de démonstration ou création d'images par défaut
def setup_demo_images():
    print_step("1", "Préparation des images de services...")
    
    # Vérifier le dossier d'images
    check_services_folder()
    
    # Liste des services avec leurs images par défaut
    service_images = {
        'service1.jpg': 'Maintenance moteur',
        'service2.jpg': 'Réparation',
        'service3.jpg': 'Diagnostic',
        'service4.jpg': 'Reconditionnement',
        'service5.jpg': 'Pièces détachées',
    }
    
    # Chercher les images existantes dans le dossier attached_assets
    attached_assets = Path('attached_assets')
    found_images = []
    
    if attached_assets.exists():
        # Chercher des images dans attached_assets
        for img_file in attached_assets.glob('*.jpg'):
            if img_file.name.startswith('IMG-') or 'WA' in img_file.name:
                shutil.copy(img_file, f'static/uploads/services/{img_file.name}')
                found_images.append(img_file.name)
                if len(found_images) >= 5:
                    break
    
    # Si nous n'avons pas assez d'images, créons des images par défaut avec du texte
    if len(found_images) < 5:
        print_warning(f"Seulement {len(found_images)} images trouvées. Création d'images par défaut...")
        
        try:
            from PIL import Image, ImageDraw, ImageFont
            
            for i, (img_name, service_name) in enumerate(service_images.items()):
                if i < len(found_images):
                    continue
                    
                # Créer une image avec du texte
                img = Image.new('RGB', (800, 600), color=(73, 109, 137))
                d = ImageDraw.Draw(img)
                
                # Essayer de trouver une police
                try:
                    font = ImageFont.truetype("arial.ttf", 36)
                except IOError:
                    try:
                        font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 36)
                    except IOError:
                        font = ImageFont.load_default()
                
                # Ajouter le texte
                d.text((400, 300), service_name, fill=(255, 255, 255), anchor="mm", font=font)
                
                # Sauvegarder
                img_path = f'static/uploads/services/{img_name}'
                img.save(img_path)
                found_images.append(img_name)
                print_success(f"Image créée: {img_path}")
                
        except ImportError:
            print_warning("PIL (Pillow) n'est pas installé. Tentative d'installation...")
            try:
                import subprocess
                subprocess.check_call([sys.executable, "-m", "pip", "install", "Pillow"])
                print_success("PIL (Pillow) installé avec succès!")
                # Rappel récursif après installation
                return setup_demo_images()
            except Exception as e:
                print_error(f"Impossible d'installer PIL: {e}")
                print_warning("Continuons sans créer d'images...")
    
    # Retourner les noms des images trouvées ou créées
    return found_images

# Préparation et ajout des services dans la base de données
def add_demo_services():
    print_step("2", "Ajout des services dans la base de données locale...")
    
    try:
        # Obtenir les images pour les services
        service_images = setup_demo_images()
        
        # Configuration Flask pour accéder à la base de données
        from app import app, db
        from models import Service
        
        # Service démos à ajouter
        demo_services = [
            {
                "name": "Maintenance moteur industriel",
                "description": "Notre service de maintenance de moteurs industriels assure la performance et la longévité de vos équipements. Nos techniciens qualifiés interviennent pour l'entretien préventif et correctif de tous types de moteurs industriels.",
                "image_url": f"uploads/services/{service_images[0]}" if service_images else "",
                "is_active": True
            },
            {
                "name": "Réparation spécialisée",
                "description": "Service de réparation pour tous les types de pannes sur moteurs de véhicules poids lourds et industriels. Diagnostics précis et interventions rapides pour minimiser vos temps d'arrêt.",
                "image_url": f"uploads/services/{service_images[1]}" if len(service_images) > 1 else "",
                "is_active": True
            },
            {
                "name": "Reconditionnement moteur",
                "description": "Donnez une seconde vie à votre moteur grâce à notre service de reconditionnement complet. Nous restaurons les performances d'origine tout en intégrant les améliorations techniques les plus récentes.",
                "image_url": f"uploads/services/{service_images[2]}" if len(service_images) > 2 else "",
                "is_active": True
            },
            {
                "name": "Diagnostic électronique avancé",
                "description": "Avec nos outils de diagnostic de pointe, nous identifions rapidement les problèmes électroniques et mécaniques de votre moteur. Un rapport détaillé vous est fourni avec les recommandations appropriées.",
                "image_url": f"uploads/services/{service_images[3]}" if len(service_images) > 3 else "",
                "is_active": True
            },
            {
                "name": "Installation de pièces détachées",
                "description": "Service professionnel d'installation de pièces détachées pour moteurs industriels et véhicules poids lourds. Nos techniciens sont formés pour installer correctement toutes les pièces disponibles dans notre catalogue.",
                "image_url": f"uploads/services/{service_images[4]}" if len(service_images) > 4 else "",
                "is_active": True
            }
        ]
        
        # Créer un contexte d'application Flask
        with app.app_context():
            # Vérifier si la table des services existe
            existing_services = Service.query.count()
            print(f"Services existants dans la base de données: {existing_services}")
            
            if existing_services == 0:
                print_warning("Aucun service trouvé. Ajout des services de démonstration...")
                
                # Ajouter les services de démo
                for service_data in demo_services:
                    service = Service(
                        name=service_data["name"],
                        description=service_data["description"],
                        image_url=service_data["image_url"],
                        is_active=service_data["is_active"]
                    )
                    db.session.add(service)
                
                # Sauvegarder dans la base de données
                db.session.commit()
                print_success(f"{len(demo_services)} services ajoutés avec succès!")
            else:
                print_warning(f"La base de données contient déjà {existing_services} services.")
                answer = input("Voulez-vous ajouter quand même 5 services supplémentaires? (o/n): ")
                if answer.lower() == 'o':
                    # Ajouter les services de démo
                    for service_data in demo_services:
                        service = Service(
                            name=service_data["name"],
                            description=service_data["description"],
                            image_url=service_data["image_url"],
                            is_active=service_data["is_active"]
                        )
                        db.session.add(service)
                    
                    # Sauvegarder dans la base de données
                    db.session.commit()
                    print_success(f"{len(demo_services)} services supplémentaires ajoutés avec succès!")
                else:
                    print_warning("Aucun service supplémentaire ajouté.")
        
        return True
        
    except ImportError as e:
        print_error(f"Erreur d'importation: {e}")
        print_warning("Vérifiez que vous avez bien exécuté la commande 'python run_local_debug.py' au moins une fois.")
        return False
    except Exception as e:
        print_error(f"Erreur lors de l'ajout des services: {e}")
        return False

# Fonction principale
def main():
    print_header("Ajout de services de démonstration pour GMPL")
    
    if add_demo_services():
        print_header("Services ajoutés avec succès")
        print(f"\n{COLORS['GREEN']}Des services de démonstration ont été ajoutés à votre base de données locale.{COLORS['END']}")
        print("\nPour les voir:")
        print(f"1. Exécutez: {COLORS['BOLD']}python run_local_debug.py{COLORS['END']}")
        print(f"2. Accédez à: {COLORS['BOLD']}http://localhost:5000/services{COLORS['END']}")
        print(f"\nPour gérer les services:")
        print(f"1. Accédez à: {COLORS['BOLD']}http://localhost:5000/admin/services{COLORS['END']}")
    else:
        print_header("Impossible d'ajouter des services")
        print(f"\n{COLORS['YELLOW']}Des erreurs ont été rencontrées lors de l'ajout des services.{COLORS['END']}")
        print("\nSolutions alternatives:")
        print("1. Exécutez d'abord le script de correction pour l'admin:")
        print(f"   {COLORS['BOLD']}python fix_admin_local.py{COLORS['END']}")
        print("2. Puis lancez le serveur en mode local:")
        print(f"   {COLORS['BOLD']}python run_local_debug.py{COLORS['END']}")
        print("3. Connectez-vous à l'admin et ajoutez des services manuellement:")
        print(f"   {COLORS['BOLD']}http://localhost:5000/admin/services/add{COLORS['END']}")

if __name__ == "__main__":
    main()
