# Fichier: decorators.py (VERSION SÉCURISÉE : KILL SWITCH)

from functools import wraps
from flask import flash, redirect, url_for, abort
from flask_login import current_user, logout_user  # ✅ Ajout de logout_user

def role_required(roles):
    """
    Décorateur RBAC + Vérification Compte Actif.
    Compatible UUID.
    """
    if not isinstance(roles, list):
        roles = [roles]
        
    def decorator(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            # 1. Auth : Est-ce qu'il est connecté ?
            if not current_user.is_authenticated:
                flash('Veuillez vous connecter pour accéder à cette page.', 'warning')
                return redirect(url_for('auth.login'))
            
            # 2. Compte Actif ? (KILL SWITCH)
            # Si le compte est suspendu, on tue la session IMMÉDIATEMENT.
            if not getattr(current_user, 'is_active_account', True):
                logout_user()  # 🛑 DÉCONNEXION FORCÉE
                flash("Votre compte a été suspendu. Contactez l'administrateur.", 'danger')
                return redirect(url_for('auth.login'))
            
            # 3. Rôle : A-t-il le bon grade ?
            if current_user.role not in roles:
                flash("Accès refusé. Vous n'avez pas les permissions nécessaires.", 'danger')
                # On renvoie une 403 (Interdit) pour les admins/managers, sinon dashboard
                if 'admin' in roles or 'manager' in roles:
                    abort(403)
                return redirect(url_for('main.dashboard'))
            
            return f(*args, **kwargs)
        return decorated_function
    return decorator


def audit_permission_required(f):
    """Vérifie le droit de créer des audits."""
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if not current_user.is_authenticated:
            flash('Veuillez vous connecter.', 'warning')
            return redirect(url_for('auth.login'))
        
        # Vérifier le compte actif (KILL SWITCH)
        if not getattr(current_user, 'is_active_account', True):
            logout_user()  # 🛑 DÉCONNEXION FORCÉE
            flash("Votre compte a été suspendu.", 'danger')
            return redirect(url_for('auth.login'))
        
        # Vérifier la permission d'audit (Soft block)
        if not getattr(current_user, 'can_audit', True):
            flash("Vous n'avez pas la permission de créer des audits.", 'danger')
            return redirect(url_for('main.dashboard'))
        
        return f(*args, **kwargs)
    return decorated_function


def owner_or_admin_required(get_resource_owner_id):
    """
    Décorateur IDOR.
    Compatible UUID (comparaison string vs string).
    """
    def decorator(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            if not current_user.is_authenticated:
                abort(401)
            
            # On vérifie aussi ici si le compte est actif, par sécurité
            if not getattr(current_user, 'is_active_account', True):
                logout_user()
                return redirect(url_for('auth.login'))
            
            try:
                owner_id = get_resource_owner_id(**kwargs)
            except Exception:
                abort(404)
            
            # Vérification compatible UUID
            is_admin = getattr(current_user, 'role', '') == 'admin'
            is_owner = current_user.id == owner_id
            
            if not (is_admin or is_owner):
                abort(403)
            
            return f(*args, **kwargs)
        return decorated_function
    return decorator