from django.db.models import Q
from django.views.generic import CreateView, DetailView, ListView, UpdateView

from apps.core.permissions.mixins import RimsAccessMixin
from apps.core.permissions.roles import UserRole
from apps.rims.contacts.forms import ContactForm, ContactGroupForm
from apps.rims.contacts.models import Contact, ContactGroup


class ContactsAccessMixin(RimsAccessMixin):
    allowed_roles = (UserRole.ADMIN, UserRole.GRANTS_MANAGER, UserRole.PROGRAMME_OFFICER)


class ContactListView(ContactsAccessMixin, ListView):
    model = Contact
    template_name = "contacts/contact_list.html"
    context_object_name = "contacts"
    paginate_by = 20

    def get_queryset(self):
        qs = Contact.objects.prefetch_related("groups")
        q = (self.request.GET.get("q") or "").strip()
        if q:
            qs = qs.filter(
                Q(first_name__icontains=q)
                | Q(last_name__icontains=q)
                | Q(organisation_name__icontains=q)
                | Q(email__icontains=q)
                | Q(phone__icontains=q)
            )
        group = self.request.GET.get("group")
        if group:
            qs = qs.filter(groups__pk=group)
        contact_type = self.request.GET.get("type")
        if contact_type:
            qs = qs.filter(contact_type=contact_type)
        return qs

    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        ctx["groups"] = ContactGroup.objects.all()
        ctx["type_choices"] = Contact.ContactType.choices
        return ctx

    def get_template_names(self):
        if getattr(self.request, "htmx", False):
            return ["contacts/partials/contact_list_results.html"]
        return super().get_template_names()


class ContactDetailView(ContactsAccessMixin, DetailView):
    model = Contact
    template_name = "contacts/contact_detail.html"
    context_object_name = "contact"


class ContactCreateView(ContactsAccessMixin, CreateView):
    model = Contact
    form_class = ContactForm
    template_name = "contacts/contact_form.html"

    def form_valid(self, form):
        form.instance.created_by = self.request.user
        return super().form_valid(form)

    def get_success_url(self):
        from django.urls import reverse
        return reverse("rims_contacts:contact_detail", kwargs={"pk": self.object.pk})


class ContactUpdateView(ContactsAccessMixin, UpdateView):
    model = Contact
    form_class = ContactForm
    template_name = "contacts/contact_edit.html"

    def get_success_url(self):
        from django.urls import reverse
        return reverse("rims_contacts:contact_detail", kwargs={"pk": self.object.pk})


class ContactGroupListView(ContactsAccessMixin, ListView):
    model = ContactGroup
    template_name = "contacts/group_list.html"
    context_object_name = "groups"


class ContactGroupCreateView(ContactsAccessMixin, CreateView):
    model = ContactGroup
    form_class = ContactGroupForm
    template_name = "contacts/group_form.html"

    def get_success_url(self):
        from django.urls import reverse
        return reverse("rims_contacts:group_list")


class ContactGroupUpdateView(ContactsAccessMixin, UpdateView):
    model = ContactGroup
    form_class = ContactGroupForm
    template_name = "contacts/group_edit.html"

    def get_success_url(self):
        from django.urls import reverse
        return reverse("rims_contacts:group_list")
