from functools import wraps
from flask import jsonify, request
from flask_login import current_user
from .exceptions import AuthorizationError, ValidationError

def admin_required(f):
    """Decorator para verificar se o usuário é administrador"""
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if not current_user.is_authenticated or not current_user.is_admin:
            raise AuthorizationError("Acesso restrito a administradores")
        return f(*args, **kwargs)
    return decorated_function

def validate_json(*required_fields):
    """Decorator para validar campos obrigatórios em requisições JSON"""
    def decorator(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            if not request.is_json:
                raise ValidationError("Content-Type deve ser application/json")
            
            data = request.get_json()
            missing_fields = [field for field in required_fields if field not in data]
            
            if missing_fields:
                raise ValidationError(f"Campos obrigatórios ausentes: {', '.join(missing_fields)}")
            
            return f(*args, **kwargs)
        return decorated_function
    return decorator

def handle_exceptions(f):
    """Decorator para tratamento global de exceções"""
    @wraps(f)
    def decorated_function(*args, **kwargs):
        try:
            return f(*args, **kwargs)
        except Exception as e:
            if hasattr(e, 'status_code'):
                return jsonify({'error': str(e)}), e.status_code
            return jsonify({'error': 'Erro interno do servidor'}), 500
    return decorated_function 