#!/usr/bin/env python
"""
Script pour initialiser une base de données SQLite pour GMPL.
Il configure une base de données locale et ajoute des produits et services de démonstration.
"""
import os
import sys
import random
from datetime import datetime
import sqlite3
from werkzeug.security import generate_password_hash

# Couleurs pour l'affichage console
GREEN = '\033[92m'
YELLOW = '\033[93m'
RED = '\033[91m'
BLUE = '\033[94m'
BOLD = '\033[1m'
END = '\033[0m'

def print_header(text):
    print(f"\n{BLUE}{'=' * 60}{END}")
    print(f"{BLUE}{BOLD} {text} {END}")
    print(f"{BLUE}{'=' * 60}{END}\n")

def print_success(text):
    print(f"{GREEN}✓ {text}{END}")

def print_error(text):
    print(f"{RED}✗ {text}{END}")

def print_info(text):
    print(f"{YELLOW}> {text}{END}")

def create_database():
    """Crée ou initialise la base de données SQLite"""
    print_header("INITIALISATION DE LA BASE DE DONNÉES SQLite")
    
    # S'assurer que le dossier instance existe
    os.makedirs('instance', exist_ok=True)
    
    # Chemin de la base de données
    db_path = 'instance/gmpl.db'
    
    # Supprimer la base de données existante si elle existe
    if os.path.exists(db_path):
        print_info(f"Suppression de la base de données existante: {db_path}")
        os.remove(db_path)
        print_success("Base de données existante supprimée")
    
    # Créer la nouvelle base de données
    conn = sqlite3.connect(db_path)
    cursor = conn.cursor()
    
    # Créer les tables
    print_info("Création des tables...")
    
    # Table user
    cursor.execute('''
    CREATE TABLE user (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        username TEXT NOT NULL UNIQUE,
        email TEXT NOT NULL UNIQUE,
        password_hash TEXT NOT NULL,
        role TEXT DEFAULT 'user',
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        last_login TIMESTAMP
    )
    ''')
    
    # Table category
    cursor.execute('''
    CREATE TABLE category (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        description TEXT,
        parent_id INTEGER,
        FOREIGN KEY (parent_id) REFERENCES category (id)
    )
    ''')
    
    # Table product
    cursor.execute('''
    CREATE TABLE product (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        description TEXT NOT NULL,
        price REAL,
        image_url TEXT,
        category_id INTEGER,
        is_available BOOLEAN DEFAULT 1,
        condition TEXT DEFAULT 'new',
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        FOREIGN KEY (category_id) REFERENCES category (id)
    )
    ''')
    
    # Table service
    cursor.execute('''
    CREATE TABLE service (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        description TEXT NOT NULL,
        image_url TEXT,
        is_active BOOLEAN DEFAULT 1,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    )
    ''')
    
    # Table contact
    cursor.execute('''
    CREATE TABLE contact (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        email TEXT NOT NULL,
        phone TEXT,
        message TEXT NOT NULL,
        is_read BOOLEAN DEFAULT 0,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    )
    ''')
    
    # Table settings
    cursor.execute('''
    CREATE TABLE settings (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        company_name TEXT NOT NULL,
        company_description TEXT,
        company_address TEXT,
        company_email TEXT,
        company_phone TEXT,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    )
    ''')
    
    # Table page
    cursor.execute('''
    CREATE TABLE page (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        title TEXT NOT NULL,
        slug TEXT NOT NULL UNIQUE,
        description TEXT,
        is_active BOOLEAN DEFAULT 1,
        meta_keywords TEXT,
        meta_description TEXT,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    )
    ''')
    
    # Table section
    cursor.execute('''
    CREATE TABLE section (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        page_id INTEGER NOT NULL,
        title TEXT NOT NULL,
        content TEXT,
        section_type TEXT DEFAULT 'text',
        order_value INTEGER DEFAULT 0,
        is_active BOOLEAN DEFAULT 1,
        background_color TEXT DEFAULT '#ffffff',
        css_class TEXT,
        image_url TEXT,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        FOREIGN KEY (page_id) REFERENCES page (id)
    )
    ''')
    
    conn.commit()
    print_success("Tables créées avec succès")
    
    return conn, cursor

def create_admin(conn, cursor):
    """Crée un utilisateur administrateur"""
    print_info("Création de l'utilisateur administrateur...")
    
    # Informations de l'administrateur
    username = 'admin'
    email = 'admin@example.com'
    password = 'admin123456'
    role = 'admin'
    
    # Hasher le mot de passe
    password_hash = generate_password_hash(password)
    
    # Insérer l'administrateur
    cursor.execute(
        'INSERT INTO user (username, email, password_hash, role) VALUES (?, ?, ?, ?)',
        (username, email, password_hash, role)
    )
    
    conn.commit()
    print_success(f"Administrateur créé: {username} / {password}")

def create_categories(conn, cursor):
    """Crée les catégories de produits"""
    print_info("Création des catégories...")
    
    # Catégories parentes
    categories = [
        ("Moteurs industriels", "Moteurs pour applications industrielles et véhicules lourds", None),
        ("Pièces détachées", "Composants et pièces pour la réparation et l'entretien des moteurs", None),
        ("Accessoires", "Accessoires et équipements complémentaires pour moteurs", None)
    ]
    
    parent_ids = {}
    
    for name, description, parent_id in categories:
        cursor.execute(
            'INSERT INTO category (name, description, parent_id) VALUES (?, ?, ?)',
            (name, description, parent_id)
        )
        category_id = cursor.lastrowid
        parent_ids[name] = category_id
        print_success(f"Catégorie créée: {name} (ID: {category_id})")
    
    # Sous-catégories
    subcategories = [
        ("Moteurs neufs", "Moteurs industriels neufs avec garantie complète", parent_ids["Moteurs industriels"]),
        ("Moteurs reconditionnés", "Moteurs remis à neuf avec garantie", parent_ids["Moteurs industriels"]),
        ("Filtres", "Filtres à air, à huile et à carburant", parent_ids["Pièces détachées"]),
        ("Pompes", "Pompes à eau, à huile et à carburant", parent_ids["Pièces détachées"]),
        ("Alternateurs et démarreurs", "Systèmes électriques pour moteurs", parent_ids["Pièces détachées"]),
        ("Outils spécialisés", "Outils pour la maintenance et la réparation", parent_ids["Accessoires"])
    ]
    
    for name, description, parent_id in subcategories:
        cursor.execute(
            'INSERT INTO category (name, description, parent_id) VALUES (?, ?, ?)',
            (name, description, parent_id)
        )
        category_id = cursor.lastrowid
        print_success(f"Sous-catégorie créée: {name} (ID: {category_id})")
    
    conn.commit()
    print_success(f"Total: {len(categories) + len(subcategories)} catégories créées")
    
    return parent_ids

def create_products(conn, cursor, parent_ids):
    """Crée des produits de démonstration"""
    print_info("Création des produits de démonstration...")
    
    # Produits avec des images de démonstration
    products = [
        # Moteurs (catégorie 1)
        ("Moteur industriel MAN D2066", "Moteur diesel 6 cylindres en ligne, 10,5 litres, puissance de 430 ch. Idéal pour les applications industrielles lourdes.", 1299000, "static/uploads/products/demo_motor1.jpg", parent_ids["Moteurs industriels"], True, "new"),
        ("Moteur MAN D2676", "Moteur diesel 6 cylindres, 12,4 litres, couple élevé, faible consommation. Parfait pour les véhicules de transport.", 1459000, "static/uploads/products/demo_motor2.jpg", parent_ids["Moteurs industriels"], True, "new"),
        ("Moteur reconditionné D0834", "Moteur 4 cylindres entièrement reconditionné, 4,6 litres, 177 ch, garanti 12 mois.", 845000, "static/uploads/products/demo_part3.jpg", parent_ids["Moteurs industriels"], True, "reconditioned"),
        
        # Pièces détachées (catégorie 2)
        ("Filtre à air haute performance", "Filtre à air industriel pour moteurs MAN, longue durée, filtration optimale même dans des conditions difficiles.", 25900, "static/uploads/products/demo_part1.jpg", parent_ids["Pièces détachées"], True, "new"),
        ("Pompe à eau renforcée", "Pompe à eau pour moteurs industriels, débit élevé, résistante à la corrosion et à l'usure.", 72500, "static/uploads/products/demo_part2.jpg", parent_ids["Pièces détachées"], True, "new"),
    ]
    
    for name, description, price, image_url, category_id, is_available, condition in products:
        cursor.execute(
            'INSERT INTO product (name, description, price, image_url, category_id, is_available, condition) VALUES (?, ?, ?, ?, ?, ?, ?)',
            (name, description, price, image_url, category_id, is_available, condition)
        )
        product_id = cursor.lastrowid
        print_success(f"Produit créé: {name} (ID: {product_id})")
    
    conn.commit()
    print_success(f"Total: {len(products)} produits créés")

def create_services(conn, cursor):
    """Crée des services de démonstration"""
    print_info("Création des services de démonstration...")
    
    # Services avec images de démonstration
    services = [
        ("Réparation de moteurs industriels", "Service complet de diagnostic, réparation et test des moteurs industriels de toutes marques. Nos techniciens expérimentés utilisent des équipements de pointe pour garantir une remise en état optimale de votre moteur.", "static/uploads/services/demo_service1.jpg", True),
        ("Reconditionnement de moteurs", "Reconditionnement complet de votre moteur avec remplacement des pièces d'usure, remise à neuf des composants majeurs et tests de performance. Service garanti 12 mois pièces et main d'œuvre.", "static/uploads/services/demo_service2.jpg", True),
        ("Maintenance préventive", "Programmes de maintenance préventive personnalisés pour votre parc de véhicules ou vos installations industrielles. Optimisez la durée de vie de vos moteurs et évitez les pannes coûteuses.", "static/uploads/services/demo_service3.jpg", True),
    ]
    
    for name, description, image_url, is_active in services:
        cursor.execute(
            'INSERT INTO service (name, description, image_url, is_active) VALUES (?, ?, ?, ?)',
            (name, description, image_url, is_active)
        )
        service_id = cursor.lastrowid
        print_success(f"Service créé: {name} (ID: {service_id})")
    
    conn.commit()
    print_success(f"Total: {len(services)} services créés")

def create_settings(conn, cursor):
    """Crée les paramètres du site"""
    print_info("Configuration des paramètres du site...")
    
    cursor.execute(
        'INSERT INTO settings (company_name, company_description, company_address, company_email, company_phone) VALUES (?, ?, ?, ?, ?)',
        (
            "GMPL - General Motors Poids Lourds",
            "Spécialiste des moteurs industriels et pièces détachées pour poids lourds au Sénégal",
            "Km 12, route de Rufisque, Dakar, Sénégal",
            "gmplsn6@gmail.com",
            "+221 77 125 29 29 / 77 049 62 17 / 76 011 53 53 / 77 522 36 36"
        )
    )
    
    conn.commit()
    print_success("Paramètres du site configurés")

def create_pages(conn, cursor):
    """Crée les pages du site"""
    print_info("Création des pages du site...")
    
    pages = [
        ("Accueil", "accueil", "Page d'accueil de GMPL", True, "moteurs industriels, pièces détachées, GMPL, Dakar", "GMPL - Spécialiste des moteurs industriels et pièces détachées pour poids lourds au Sénégal"),
        ("À propos", "a-propos", "À propos de GMPL", True, "GMPL, histoire, entreprise, Dakar", "Découvrez l'histoire et les valeurs de GMPL, votre partenaire de confiance pour les moteurs industriels au Sénégal"),
        ("Produits", "produits", "Catalogue des produits GMPL", True, "moteurs, pièces détachées, catalogue", "Consultez notre catalogue complet de moteurs industriels et pièces détachées pour tous types de véhicules lourds"),
        ("Services", "services", "Services offerts par GMPL", True, "réparation, maintenance, reconditionnement", "GMPL vous propose une gamme complète de services pour l'entretien et la réparation de vos moteurs industriels"),
        ("Contact", "contact", "Contactez GMPL", True, "contact, téléphone, email, adresse", "Contactez GMPL pour toute demande d'information ou de devis sur nos produits et services")
    ]
    
    for title, slug, description, is_active, meta_keywords, meta_description in pages:
        cursor.execute(
            'INSERT INTO page (title, slug, description, is_active, meta_keywords, meta_description) VALUES (?, ?, ?, ?, ?, ?)',
            (title, slug, description, is_active, meta_keywords, meta_description)
        )
        page_id = cursor.lastrowid
        print_success(f"Page créée: {title} (ID: {page_id})")
    
    conn.commit()
    print_success(f"Total: {len(pages)} pages créées")

def create_test_data(conn, cursor):
    """Ajoute quelques données de test supplémentaires"""
    print_info("Ajout de données de test supplémentaires...")
    
    # Ajouter un message de contact pour test
    cursor.execute(
        'INSERT INTO contact (name, email, phone, message, is_read) VALUES (?, ?, ?, ?, ?)',
        ("Client Test", "client@example.com", "+221 77 123 45 67", "Je souhaite obtenir un devis pour un moteur industriel MAN D2066. Merci de me contacter.", False)
    )
    
    conn.commit()
    print_success("Données de test ajoutées")

def main():
    try:
        # Créer la base de données
        conn, cursor = create_database()
        
        # Créer les données de base
        create_admin(conn, cursor)
        parent_ids = create_categories(conn, cursor)
        create_products(conn, cursor, parent_ids)
        create_services(conn, cursor)
        create_settings(conn, cursor)
        create_pages(conn, cursor)
        create_test_data(conn, cursor)
        
        # Finaliser
        conn.close()
        print_header("BASE DE DONNÉES SQLite CRÉÉE AVEC SUCCÈS")
        print_info("La base de données a été initialisée avec toutes les données de démonstration.")
        print_info("Vous pouvez maintenant démarrer l'application avec: python run_local.py")
        print()
        print_info(f"URL Admin: {BOLD}http://localhost:5000/admin{END}")
        print_info(f"Identifiants: {BOLD}admin / admin123456{END}")
        print()
        
    except sqlite3.Error as e:
        print_error(f"Erreur SQLite: {e}")
        return False
    except Exception as e:
        print_error(f"Erreur: {e}")
        return False
    
    return True

if __name__ == "__main__":
    if main():
        sys.exit(0)
    else:
        sys.exit(1)