from functools import wraps
from flask import session, flash, redirect, request
from db import get_db

def obtener_modulos_usuario_actual(usuario_id):
    """Consulta en tiempo real desde sistema_modulos y usuario_modulos."""
    conn = get_db()
    cursor = conn.cursor(dictionary=True)
    cursor.execute("""
        SELECT sm.id_modulo, sm.codigo, sm.nombre, sm.icono, sm.ruta 
        FROM sistema_modulos sm
        INNER JOIN usuario_modulos um ON sm.id_modulo = um.modulo_id
        WHERE um.usuario_id = %s AND sm.activo = 1
        ORDER BY sm.orden ASC
    """, (usuario_id,))
    modulos = cursor.fetchall()
    cursor.close()
    conn.close()
    return modulos

def requiere_modulo(codigo_modulo):

    def decorador(f):
        @wraps(f)
        def funcion_decorada(*args, **kwargs):
            if 'usuario_id' not in session:
                return redirect('/login')
            
            es_admin = (session.get('rol_id') == 1)

            # 1. El admin tiene pase directo ÚNICAMENTE al Dashboard
            if es_admin and codigo_modulo == 'DASHBOARD':
                return f(*args, **kwargs)

            # 2. Consultar en vivo en usuario_modulos
            modulos_actuales = obtener_modulos_usuario_actual(session['usuario_id'])
            session['modulos'] = modulos_actuales
            codigos_permitidos = [m['codigo'] for m in modulos_actuales]

            # 3. El operario siempre tiene pase a sus requerimientos
            if not es_admin and codigo_modulo == 'RQ_GENERAL':
                return f(*args, **kwargs)

            # 4. Para todo lo demás (sea Admin u Operario), verificar asignación en la BD
            if codigo_modulo not in codigos_permitidos:
                flash("Acceso denegado: Este módulo lo tienes restringido. Contacta al Administrador.", "danger")
                
                if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
                    return {'success': False, 'error': 'Módulo restringido'}, 403

                if 'DASHBOARD' in codigos_permitidos:
                    return redirect('/dashboard')
                elif modulos_actuales:
                    return redirect(modulos_actuales[0]['ruta'])
                else:
                    return redirect('/solicitud_mantenimiento')

            return f(*args, **kwargs)
        return funcion_decorada
    return decorador