from functools import wraps
from flask import session, redirect, url_for, flash, abort, request, jsonify

def is_api_or_json_request():
    """Retorna True se a requisição for de API (qualquer rota contendo /api/), JSON ou AJAX"""
    if request.is_json or '/api/' in request.path:
        return True
    acc = request.headers.get('Accept', '')
    req_with = request.headers.get('X-Requested-With', '')
    return 'application/json' in acc or req_with == 'XMLHttpRequest'

def login_required(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        from ..models import db, Usuario
        user_id = session.get('usuario_id')
        if not user_id:
            if is_api_or_json_request():
                return jsonify({'error': 'Não autenticado', 'redirect': '/login'}), 401
            flash('Por favor, faça login para acessar esta página.', 'warning')
            return redirect(url_for('auth.login', next=request.url))
            
        usuario = db.session.get(Usuario, user_id)
        if not usuario:
            session.clear()
            if is_api_or_json_request():
                return jsonify({'error': 'Sessão inválida', 'redirect': '/login'}), 401
            flash('Sessão expirada. Por favor, faça login novamente.', 'info')
            return redirect(url_for('auth.login'))
            
        return f(*args, **kwargs)
    return decorated_function

def roles_required(*roles):
    def decorator(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            if 'usuario_id' not in session:
                if is_api_or_json_request():
                    return jsonify({'error': 'Não autenticado', 'redirect': '/login'}), 401
                return redirect(url_for('auth.login'))
            
            user_role = session.get('usuario_perfil')
            if user_role not in roles:
                if is_api_or_json_request():
                    return jsonify({'error': 'Acesso negado. Permissão insuficiente.'}), 403
                flash('Acesso negado. Você não possui permissão para acessar este recurso.', 'danger')
                return redirect(url_for('dashboards.index'))
            return f(*args, **kwargs)
        return decorated_function
    return decorator

def dev_required(f):
    return roles_required('dev', 'admin', 'superadmin_dev', 'administrador', 'admin_1', 'admin_2')(f)

def admin_required(f):
    return roles_required('dev', 'admin', 'superadmin_dev', 'administrador', 'admin_1', 'admin_2')(f)

def write_required(f):
    """Enforces write permission: blocks 'visualizador' profile from POST/PUT/DELETE actions"""
    @wraps(f)
    def decorated_function(*args, **kwargs):
        user_role = session.get('usuario_perfil')
        if user_role == 'visualizador':
            if is_api_or_json_request():
                return jsonify({'error': 'Perfil Visualizador possui apenas acesso de leitura.'}), 403
            flash('Perfil Visualizador possui apenas permissão de leitura.', 'warning')
            return redirect(url_for('dashboards.index'))
        return f(*args, **kwargs)
    return decorated_function
