"""
Custom Decorators for Web Views
"""
from functools import wraps
from django.shortcuts import redirect
from django.contrib.auth import REDIRECT_FIELD_NAME
from django.http import JsonResponse


def login_required_web(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url='/login/'):
    """
    Decorator for views that checks that the user is logged in,
    redirecting to the log-in page if necessary.
    """
    def decorator(view_func):
        @wraps(view_func)
        def wrapper(request, *args, **kwargs):
            if request.user.is_authenticated:
                return view_func(request, *args, **kwargs)
            if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
                return JsonResponse({'error': 'Authentication required'}, status=401)
            return redirect(f'{login_url}?{redirect_field_name}={request.path}')
        return wrapper
    if function:
        return decorator(function)
    return decorator


def ajax_required(function):
    """
    Decorator to ensure that a view only receives AJAX requests
    """
    @wraps(function)
    def wrapper(request, *args, **kwargs):
        if not request.headers.get('X-Requested-With') == 'XMLHttpRequest':
            return JsonResponse({'error': 'AJAX request required'}, status=400)
        return function(request, *args, **kwargs)
    return wrapper
