from functools import wraps
from flask import request, redirect, url_for, flash, current_app
from flask_login import current_user

def login_required_api(f):
    """
    Decorador para verificar autenticación en endpoints de API.
    A diferencia del decorador estándar de Flask-Login, este devuelve
    una respuesta JSON en lugar de redirigir.
    
    Args:
        f: Función a decorar
        
    Returns:
        function: Función decorada
    """
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if not current_user.is_authenticated:
            return {
                'success': False,
                'message': 'Autenticación requerida',
                'code': 401
            }, 401
        return f(*args, **kwargs)
    return decorated_function

def check_permission(required_level):
    """
    Decorador para verificar nivel de permisos en endpoints de API.
    
    Args:
        required_level (int): Nivel mínimo requerido
        
    Returns:
        function: Decorador configurado
    """
    def decorator(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            if not current_user.is_authenticated:
                return {
                    'success': False,
                    'message': 'Autenticación requerida',
                    'code': 401
                }, 401
                
            if not current_user.has_permission(required_level):
                return {
                    'success': False,
                    'message': 'No tiene permisos suficientes para esta acción',
                    'code': 403
                }, 403
                
            return f(*args, **kwargs)
        return decorated_function
    return decorator

def check_active_user(f):
    """
    Decorador para verificar que el usuario está activo y no ha expirado.
    
    Args:
        f: Función a decorar
        
    Returns:
        function: Función decorada
    """
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if not current_user.is_authenticated:
            return redirect(url_for('auth.login'))
            
        if not current_user.is_active():
            flash('Su cuenta está desactivada. Contacte al administrador.', 'danger')
            return redirect(url_for('auth.logout'))
            
        if current_user.is_expired():
            flash('Su cuenta ha expirado. Contacte al administrador.', 'danger')
            return redirect(url_for('auth.logout'))
            
        return f(*args, **kwargs)
    return decorated_function

def log_activity(activity_type):
    """
    Decorador para registrar actividad del usuario.
    
    Args:
        activity_type (str): Tipo de actividad a registrar
        
    Returns:
        function: Decorador configurado
    """
    def decorator(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            # Ejecutar la función original
            result = f(*args, **kwargs)
            
            # Registrar actividad si el usuario está autenticado
            if current_user.is_authenticated:
                from utils.logger import log_user_activity
                
                # Extraer información relevante
                user_id = current_user.id
                ip_address = request.remote_addr
                user_agent = request.user_agent.string
                
                # Registrar actividad
                log_user_activity(
                    user_id=user_id,
                    activity_type=activity_type,
                    ip_address=ip_address,
                    user_agent=user_agent,
                    details=kwargs
                )
            
            return result
        return decorated_function
    return decorator
