#!/usr/bin/env python
"""
Script pour réinitialiser le mot de passe administrateur.
Ce script crée ou réinitialise un compte administrateur avec un mot de passe connu.
"""
import os
import sys
import sqlite3
from pathlib import Path
from werkzeug.security import generate_password_hash

# 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']}")

# Réinitialiser le mot de passe administrateur dans la base de données
def reset_admin_password_sqlite():
    print_step("1", "Réinitialisation directe du mot de passe dans SQLite...")
    
    # Vérifier l'existence de la base de données
    db_file = Path('instance/gmpl.db')
    if not db_file.exists():
        print_error("Base de données SQLite introuvable: instance/gmpl.db")
        return False
    
    try:
        # Se connecter à la base de données
        conn = sqlite3.connect(db_file)
        cursor = conn.cursor()
        
        # Vérifier si la table user existe
        cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='user'")
        table_exists = cursor.fetchone()
        
        if not table_exists:
            print_error("La table 'user' n'existe pas dans la base de données.")
            conn.close()
            return False
        
        # Vérifier si l'utilisateur admin existe
        cursor.execute("SELECT id, username, email FROM user WHERE username='admin' OR role='admin'")
        admin_user = cursor.fetchone()
        
        # Générer le hash du mot de passe
        password_hash = generate_password_hash('admin123456')
        
        if admin_user:
            # Mettre à jour le mot de passe de l'admin existant
            user_id = admin_user[0]
            print_warning(f"Utilisateur admin trouvé: {admin_user[1]} (ID: {user_id})")
            
            cursor.execute(
                "UPDATE user SET password_hash = ?, role = 'admin' WHERE id = ?",
                (password_hash, user_id)
            )
            conn.commit()
            print_success(f"Mot de passe réinitialisé pour l'utilisateur {admin_user[1]}")
        else:
            # Créer un nouvel utilisateur admin
            print_warning("Aucun utilisateur admin trouvé. Création d'un nouvel administrateur...")
            
            cursor.execute(
                "INSERT INTO user (username, email, password_hash, role) VALUES (?, ?, ?, ?)",
                ('admin', 'admin@example.com', password_hash, 'admin')
            )
            conn.commit()
            print_success("Nouvel utilisateur admin créé avec succès.")
        
        # Fermer la connexion
        conn.close()
        
        print_success("Informations de connexion admin:")
        print("  Nom d'utilisateur: admin")
        print("  Mot de passe: admin123456")
        
        return True
    
    except sqlite3.Error as e:
        print_error(f"Erreur SQLite: {e}")
        return False
    except Exception as e:
        print_error(f"Erreur inattendue: {e}")
        return False

# Créer un administrateur via l'API Flask
def reset_admin_password_flask_api():
    print_step("2", "Tentative de réinitialisation via l'API Flask...")
    
    try:
        # Essayer d'utiliser les modules Flask
        from app import app, db
        from models import User
        
        with app.app_context():
            # Chercher un utilisateur admin existant
            admin = User.query.filter(User.username == 'admin').first()
            
            if admin:
                print_warning(f"Utilisateur admin trouvé: {admin.username} (ID: {admin.id})")
                # Réinitialiser le mot de passe
                admin.set_password('admin123456')
                # S'assurer que le rôle est bien admin
                admin.role = 'admin'
                db.session.commit()
                print_success(f"Mot de passe réinitialisé pour l'utilisateur {admin.username}")
            else:
                # Chercher tout utilisateur avec le rôle admin
                admin = User.query.filter(User.role == 'admin').first()
                
                if admin:
                    print_warning(f"Administrateur trouvé avec un nom différent: {admin.username} (ID: {admin.id})")
                    # Réinitialiser le mot de passe
                    admin.set_password('admin123456')
                    db.session.commit()
                    print_success(f"Mot de passe réinitialisé pour l'administrateur {admin.username}")
                else:
                    # Créer un nouvel administrateur
                    print_warning("Aucun administrateur trouvé. Création d'un nouvel administrateur...")
                    new_admin = User(username='admin', email='admin@example.com', role='admin')
                    new_admin.set_password('admin123456')
                    db.session.add(new_admin)
                    db.session.commit()
                    print_success("Nouvel administrateur créé avec succès.")
        
        print_success("Informations de connexion admin:")
        print("  Nom d'utilisateur: admin")
        print("  Mot de passe: admin123456")
        
        return True
        
    except ImportError as e:
        print_warning(f"Importation Flask impossible: {e}")
        print_warning("Tentative de réinitialisation directe dans SQLite...")
        return False
    except Exception as e:
        print_error(f"Erreur lors de la réinitialisation via Flask: {e}")
        print_warning("Tentative de réinitialisation directe dans SQLite...")
        return False

# Fonction principale
def main():
    print_header("Réinitialisation du mot de passe administrateur")
    
    # Essayer la méthode Flask d'abord
    success = reset_admin_password_flask_api()
    
    # Si ça échoue, utiliser SQLite directement
    if not success:
        success = reset_admin_password_sqlite()
    
    if success:
        print_header("Mot de passe administrateur réinitialisé avec succès")
        print(f"\n{COLORS['GREEN']}Un compte administrateur avec mot de passe connu a été configuré.{COLORS['END']}")
        print("\nPour vous connecter:")
        print(f"1. Accédez à: {COLORS['BOLD']}http://localhost:5000/admin{COLORS['END']}")
        print(f"2. Identifiants: {COLORS['BOLD']}admin / admin123456{COLORS['END']}")
    else:
        print_header("Échec de la réinitialisation du mot de passe")
        print(f"\n{COLORS['RED']}Impossible de réinitialiser le mot de passe administrateur.{COLORS['END']}")
        print("\nSolutions alternatives:")
        print("1. Supprimer la base de données et la recréer:")
        print(f"   {COLORS['BOLD']}rm instance/gmpl.db{COLORS['END']} (Linux/Mac)")
        print(f"   {COLORS['BOLD']}del instance\gmpl.db{COLORS['END']} (Windows)")
        print("2. Exécuter les scripts de configuration complets:")
        print(f"   {COLORS['BOLD']}python fix_admin_access.py{COLORS['END']}")
        print(f"   {COLORS['BOLD']}python run_local_debug.py{COLORS['END']}")

if __name__ == "__main__":
    main()
