from django.http import JsonResponse
from django.shortcuts import render
from django.utils.translation import ugettext as _

from misago.core.utils import is_request_to_misago
from misago.admin.views.errorpages import admin_error_page, admin_csrf_failure


def _ajax_error(code=406, message=None):
    response_dict = {'is_error': True}
    if message:
        response_dict['message'] = message
    return JsonResponse(response_dict, status=code)


@admin_error_page
def _error_page(request, code, message=None):
    response = render(request,
                      'misago/errorpages/%s.html' % code,
                      {'message': message})
    response.status_code = code
    return response


def permission_denied(request, message=None):
    if request.is_ajax():
        return _ajax_error(403, message)
    else:
        return _error_page(request, 403, message)


def page_not_found(request):
    if request.is_ajax():
        return _ajax_error(404, _("Invalid API link."))
    else:
        return _error_page(request, 404)


@admin_csrf_failure
def csrf_failure(request, reason=""):
    if request.is_ajax():
        return _ajax_error(403, _("Request authentication is invalid."))
    else:
        response = render(request, 'misago/errorpages/csrf_failure.html')
        response.status_code = 403
        return response


# Decorators for custom error page handlers
def shared_403_exception_handler(f):
    def page_decorator(request, *args, **kwargs):
        if is_request_to_misago(request):
            return permission_denied(request)
        else:
            return f(request, *args, **kwargs)
    return page_decorator


def shared_404_exception_handler(f):
    def page_decorator(request, *args, **kwargs):
        if is_request_to_misago(request):
            return page_not_found(request)
        else:
            return f(request, *args, **kwargs)
    return page_decorator