"""Views for the Hiccup statistics."""

from django.http import HttpResponse, Http404, HttpResponseRedirect
from django.template import loader
from django.contrib.auth.decorators import user_passes_test
from django import forms
from django.contrib import messages
from django.urls import reverse

from crashreports.models import Device
from crashreports.permissions import user_is_hiccup_staff


class DeviceUUIDForm(forms.Form):
    """Form for searching devices by UUID."""

    uuid = forms.CharField(label="Device UUID:", max_length=100)


@user_passes_test(user_is_hiccup_staff)
def device_stats(request):
    """Respond with statistics for a specific device."""
    template = loader.get_template("crashreport_stats/device.html")
    uuid = request.GET.get("uuid", "NO_UUID")
    if not Device.objects.filter(uuid=uuid).exists():
        raise Http404("Device doesn't exist.")
    return HttpResponse(template.render({"uuid": uuid}, request))


@user_passes_test(user_is_hiccup_staff)
def versions_all_overview(request):
    """Respond with the distribution of official release versions."""
    template = loader.get_template("crashreport_stats/versions.html")
    return HttpResponse(template.render({"is_official_release": "1"}, request))


@user_passes_test(user_is_hiccup_staff)
def versions_overview(request):
    """Respond with the distribution of non-official release versions."""
    template = loader.get_template("crashreport_stats/versions.html")
    return HttpResponse(template.render({"is_official_release": "2"}, request))


@user_passes_test(user_is_hiccup_staff)
def home(request):
    """Respond with a form for searching devices by UUID.

    When using a HTTP GET method, the search device form view is returned.
    The response additionally includes possible results if a HTTP POST message
    was sent. If a single device was found, a redirect to the device
    statistics of that device is sent.
    """
    devices = None
    if request.method == "POST":
        # create a form instance and populate it with data from the request:
        form = DeviceUUIDForm(request.POST)
        if form.is_valid():
            uuid = form.cleaned_data["uuid"]
            if not Device.objects.filter(uuid=uuid).exists():
                devices = Device.objects.filter(uuid__startswith=uuid)
                if len(devices) == 1:
                    return HttpResponseRedirect(
                        reverse("hiccup_stats_device")
                        + "?uuid="
                        + devices[0].uuid
                    )
                if not devices:
                    messages.warning(request, "No devices found.")
            else:
                return HttpResponseRedirect(
                    reverse("hiccup_stats_device") + "?uuid=" + uuid
                )
    else:
        form = DeviceUUIDForm()
    template = loader.get_template("crashreport_stats/home.html")
    return HttpResponse(
        template.render({"form": form, "devices": devices}, request)
    )
