# views.py
from django.shortcuts import render, redirect, get_object_or_404
from .forms import ContactPersonForm, ContactDetailFormSet, FarmerContactForm
from .models import ContactPerson, ContactDetail
from farmerapp.models import Farmer
from django.contrib.auth.decorators import login_required
from dal import autocomplete
from django.db.models import Q
import logging
from django.views.generic import ListView, DetailView
from django.views.generic import UpdateView
from django.urls import reverse_lazy
from common.utils import is_supervisor, is_manager
from django import forms
from django.contrib import messages

logger = logging.getLogger(__name__)


@login_required(login_url='accounts/login/')
def add_contact_person(request, farmer_id=None):
    user = request.user
    farmer = None  # Initialize farmer as None

    if farmer_id:
        # Retrieve the specific farmer
        farmer = get_object_or_404(Farmer, id=farmer_id)

        # Permission checks for the specific farmer
        if is_supervisor(user):
            pass
        elif is_manager(user):
            if farmer.client_status == 'unprocessed' or farmer.interactions.filter(
                    Q(user=user) | Q(assigned_to=user)).exists():
                pass
            else:
                return HttpResponseForbidden("Ви не маєте доступу до цього фермера.")
        else:
            return HttpResponseForbidden("Ви не маєте доступу до цього фермера.")
    else:
        # Permission checks when no specific farmer is provided
        if is_supervisor(user):
            pass
        elif is_manager(user):
            pass  # Add additional checks if necessary
        else:
            return HttpResponseForbidden("Ви не маєте доступу до цієї сторінки.")

    if request.method == 'POST':
        form = ContactPersonForm(request.POST)
        formset = ContactDetailFormSet(request.POST)
        if form.is_valid() and formset.is_valid():
            contact_person = form.save()
            if farmer:
                # Associate the contact person with the specific farmer
                contact_person.farmers.add(farmer)
            else:
                # Associate with selected farmers from the form
                farmers = form.cleaned_data.get('farmers')
                if farmers:
                    contact_person.farmers.add(*farmers)
            formset.instance = contact_person
            formset.save()
            messages.success(request, "Контактна особа успішно додана.")
            return redirect('contacts:contact_person_detail', pk=contact_person.id)
        else:
            messages.error(request, "Будь ласка, виправте помилки у формі.")
            return render(request, 'contacts/add_contact_person.html', {'form': form, 'formset': formset, 'farmer': farmer})
    else:
        if farmer:
            # Pre-fill the form with the specific farmer and hide the farmers field
            initial_data = {'farmers': [farmer]}
            form = ContactPersonForm(initial=initial_data)
            form.fields['farmers'].widget = forms.HiddenInput()
        else:
            form = ContactPersonForm()
        formset = ContactDetailFormSet()
        return render(request, 'contacts/add_contact_person.html', {'form': form, 'formset': formset, 'farmer': farmer})


@login_required(login_url='accounts/login/')
def contact_success(request, contact_person_id):
    return render(request, 'contacts/contact_success.html', {'contact_person_id': contact_person_id})


class FarmerAutocomplete(autocomplete.Select2QuerySetView):
    def get_queryset(self):
        if not self.request.user.is_authenticated:
            return Farmer.objects.none()

        qs = Farmer.objects.all()

        if self.q:
            search_terms = self.q.split()
            query = Q()
            for term in search_terms:
                query |= Q(name__icontains=term)

            qs = qs.filter(query)
            logger.debug(f"Фільтровані об'єкти: {qs.count()}")
            logger.debug(f"SQL запит: {qs.query}")

        return qs

    def get_result_label(self, item):
        return item.name

    def get_selected_result_label(self, item):
        return item.name

class ContactPersonListView(ListView):
    model = ContactPerson
    template_name = 'contacts/contact_person_list.html'
    context_object_name = 'contact_persons'
    paginate_by = 10

    def get_queryset(self):
        queryset = super().get_queryset()
        query = self.request.GET.get('q')
        filter_letter = self.request.GET.get('letter')

        if query:
            queryset = queryset.filter(
                Q(surname__icontains=query) |
                Q(name__icontains=query) |
                Q(contact_details__value__icontains=query)
            ).distinct()

        if filter_letter:
            queryset = queryset.filter(surname__istartswith=filter_letter)

        return queryset

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['alphabet'] = 'АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ'
        context['filter_letter'] = self.request.GET.get('letter', '')
        context['search_query'] = self.request.GET.get('q', '')
        return context

class ContactPersonDetailView(DetailView):
    model = ContactPerson
    template_name = 'contacts/contact_person_detail.html'
    context_object_name = 'contact_person'


class ContactPersonAutocomplete(autocomplete.Select2QuerySetView):
    def get_queryset(self):
        qs = ContactPerson.objects.all()

        if self.q:
            qs = qs.filter(
                Q(name__icontains=self.q) |
                Q(surname__icontains=self.q) |
                Q(father_name__icontains=self.q)
            )

        return qs

    def get_result_label(self, item):
        # Формуємо повне ім'я
        full_name = f"{item.surname or ''} {item.name or ''} {item.father_name or ''}".strip()
        return full_name


class ContactPersonUpdateView(UpdateView):
    model = ContactPerson
    form_class = ContactPersonForm
    template_name = 'contacts/contact_person_form.html'  # Використаємо той самий шаблон
    success_url = reverse_lazy('contacts:contact_person_list')

    def get_context_data(self, **kwargs):
        data = super().get_context_data(**kwargs)
        if self.request.POST:
            data['formset'] = ContactDetailFormSet(self.request.POST, instance=self.object)
        else:
            data['formset'] = ContactDetailFormSet(instance=self.object)
        return data

    def form_valid(self, form):
        context = self.get_context_data()
        formset = context['formset']
        if form.is_valid() and formset.is_valid():
            self.object = form.save()
            formset.instance = self.object
            formset.save()
            return redirect('contacts:contact_person_detail', pk=self.object.pk)
        else:
            return self.render_to_response(self.get_context_data(form=form))
