# Copyright 2014 Budapest University of Technology and Economics (BME IK)
#
# This file is part of CIRCLE Cloud.
#
# CIRCLE is free software: you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option)
# any later version.
#
# CIRCLE is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along
# with CIRCLE.  If not, see <http://www.gnu.org/licenses/>.

from sys import exc_info

import logging

from django.shortcuts import render_to_response, redirect
from django.contrib import messages
from django.template import RequestContext
from django.http import JsonResponse
from django.utils.translation import ugettext_lazy as _

from .models import HumanReadableException

logger = logging.getLogger(__name__)


def get_context(request, exception):
    ctx = {}
    if issubclass(exception.__class__, HumanReadableException):
        try:
            if request.user.is_superuser:
                ctx['error'] = exception.get_admin_text()
            else:
                ctx['error'] = exception.get_user_text()
        except:
            pass
    return ctx


def handler500(request):
    cls, exception, traceback = exc_info()
    logger.exception("unhandled exception")
    ctx = get_context(request, exception)
    try:
        resp = render_to_response("500.html", ctx,
                                  RequestContext(request).flatten())
    except:
        resp = render_to_response("500.html", ctx)
    resp.status_code = 500
    return resp


def handler403(request):
    cls, exception, traceback = exc_info()
    ctx = get_context(request, exception)
    resp = render_to_response("403.html", ctx)
    resp.status_code = 403
    return resp


#TODO: something like this for quotas?
class CreateLimitedResourceMixin(object):
    resource_name = None
    model = None
    profile_attribute = None

    def post(self, *args, **kwargs):
        user = self.request.user
        try:
            limit = getattr(user.profile, self.profile_attribute)
        except Exception as e:
            logger.debug('No profile or %s: %s', self.profile_attribute, e)
        else:
            current = self.model.objects.filter(owner=user).count()
            logger.debug('%s current use: %d, limit: %d',
                         self.resource_name, current, limit)
            if current > limit:
                messages.error(self.request,
                               _('%s limit (%d) exceeded.')
                               % (self.resource_name, limit))
                if self.request.is_ajax():
                    return JsonResponse({'redirect': '/'})
                else:
                    return redirect('/')
        return super(CreateLimitedResourceMixin, self).post(*args, **kwargs)