"""
django-helpdesk - A Django powered ticket tracker for small enterprise.

(c) Copyright 2008 Jutda. All Rights Reserved. See LICENSE for details.

views/kb.py - Public-facing knowledgebase views. The knowledgebase is a
              simple categorised question/answer system to show common
              resolutions to common problems.
"""

from django.http import Http404, HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.views.decorators.clickjacking import xframe_options_exempt
from helpdesk import settings as helpdesk_settings, user
from helpdesk.models import KBCategory, KBItem


def index(request):
    huser = user.huser_from_request(request)
    # TODO: It'd be great to have a list of most popular items here.
    return render(
        request,
        "helpdesk/kb_index.html",
        {
            "kb_categories": huser.get_allowed_kb_categories(),
            "helpdesk_settings": helpdesk_settings,
        },
    )


def category(request, slug, iframe=False):
    category = get_object_or_404(KBCategory, slug__iexact=slug)
    if not user.huser_from_request(request).can_access_kbcategory(category):
        raise Http404
    items = category.kbitem_set.filter(enabled=True)
    selected_item = request.GET.get("kbitem", None)
    try:
        selected_item = int(selected_item)
    except TypeError:
        pass
    qparams = request.GET.copy()
    try:
        del qparams["kbitem"]
    except KeyError:
        pass
    template = "helpdesk/kb_category.html"
    if iframe:
        template = "helpdesk/kb_category_iframe.html"
    staff = request.user.is_authenticated and request.user.is_staff
    return render(
        request,
        template,
        {
            "category": category,
            "items": items,
            "selected_item": selected_item,
            "query_param_string": qparams.urlencode(),
            "helpdesk_settings": helpdesk_settings,
            "iframe": iframe,
            "staff": staff,
        },
    )


@xframe_options_exempt
def category_iframe(request, slug):
    return category(request, slug, iframe=True)


def vote(request, item, vote):
    item = get_object_or_404(KBItem, pk=item)
    if request.method == "POST":
        if vote == "up":
            if not item.voted_by.filter(pk=request.user.pk):
                item.votes += 1
                item.voted_by.add(request.user.pk)
                item.recommendations += 1
            if item.downvoted_by.filter(pk=request.user.pk):
                item.votes -= 1
                item.downvoted_by.remove(request.user.pk)
        if vote == "down":
            if not item.downvoted_by.filter(pk=request.user.pk):
                item.votes += 1
                item.downvoted_by.add(request.user.pk)
                item.recommendations -= 1
            if item.voted_by.filter(pk=request.user.pk):
                item.votes -= 1
                item.voted_by.remove(request.user.pk)
        item.save()
    return HttpResponseRedirect(item.get_absolute_url())
