from django.shortcuts import render
from django.urls import reverse_lazy
from django.http import Http404
from django.utils.translation import gettext as _
from django.views.generic import DetailView, ListView, CreateView
from django.contrib.auth.models import Group
from guardian.mixins import PermissionRequiredMixin, PermissionListMixin
from guardian.shortcuts import assign_perm

from . import models
from . import forms

from django import template

class PublicKeyListView(PermissionListMixin, ListView):
    model = models.PublicKey
    permission_required = ['view_publickey', 'list_publickey']

class PublicKeyDetailView(PermissionRequiredMixin, DetailView):
    model = models.PublicKey
    permission_required = ['view_publickey', 'list_publickey']


class PublicKeyFingerprintDetailView(PermissionRequiredMixin, DetailView):
    model = models.PublicKey
    permission_required = ['view_publickey']
    slug_url_kwarg = 'fingerprint'
    slug_field = 'keyid'

    def get_object(self, queryset=None):
        if queryset is None:
            queryset = self.get_queryset()

        slug_field = self.get_slug_field()
        slug = self.kwargs.get(self.slug_url_kwarg)
        slug = slug.lower()
        if slug.startswith("0x"):
            slug = slug[2:]

        params = {slug_field + "__endswith": slug}
        queryset = queryset.filter(**params)
        try:
            # Get the single item from the filtered queryset
            key = queryset.get()
        except queryset.model.DoesNotExist:
            raise Http404("No OpenPGP Public Key found %matching the query")
        except queryset.model.MultipleObjectsReturned:
            # Lookup was with ID, assume the same key matched multple times
            return queryset.all()[0]
        return key

class PublicKeyCreateView(PermissionRequiredMixin, CreateView):
    form_class = forms.PublicKeyForm
    model = models.PublicKey
    permission_required = ['add_publickey']
    permission_object = None
    success_url = reverse_lazy('publickey-list') 

    def form_valid(self, form):
        resp = super().form_valid(form)
        assign_perm('view_publickey', self.request.user, self.object)
        assign_perm('list_publickey', self.request.user, self.object)
        assign_perm('change_publickey', self.request.user, self.object)

        if form.cleaned_data["public"]:
            any_user = Group.objects.get(name="any-user")
            assign_perm('view_publickey', any_user, self.object)

        if form.cleaned_data["index"]:
            any_user = Group.objects.get(name="any-user")
            assign_perm('list_publickey', any_user, self.object)

        return resp