# -*- coding: utf-8 -*-
"""
Фильтры для клиентов с использованием django-filter
"""

import django_filters
from django import forms
from .models import Customer


class CustomerFilter(django_filters.FilterSet):
    """
    Фильтр для списка клиентов
    Поддерживает фильтрацию по:
    - Наличию заметок
    - Отсутствию телефона
    - Отсутствию email
    """

    # Фильтр: есть заметки
    has_notes = django_filters.BooleanFilter(
        method='filter_has_notes',
        label='Есть заметки',
        widget=forms.CheckboxInput(attrs={'class': 'form-check-input'})
    )

    # Фильтр: нет телефона
    no_phone = django_filters.BooleanFilter(
        method='filter_no_phone',
        label='Нет телефона',
        widget=forms.CheckboxInput(attrs={'class': 'form-check-input'})
    )

    # Фильтр: нет email
    no_email = django_filters.BooleanFilter(
        method='filter_no_email',
        label='Нет email',
        widget=forms.CheckboxInput(attrs={'class': 'form-check-input'})
    )

    # Фильтр: есть канал связи
    has_contact_channel = django_filters.BooleanFilter(
        method='filter_has_contact_channel',
        label='Есть канал связи',
        widget=forms.CheckboxInput(attrs={'class': 'form-check-input'})
    )

    class Meta:
        model = Customer
        fields = ['has_notes', 'no_phone', 'no_email', 'has_contact_channel']

    def filter_has_notes(self, queryset, name, value):
        """Фильтр клиентов с заметками"""
        if value:
            return queryset.filter(notes__isnull=False).exclude(notes='')
        return queryset

    def filter_no_phone(self, queryset, name, value):
        """Фильтр клиентов без телефона"""
        if value:
            return queryset.filter(phone__isnull=True) | queryset.filter(phone='')
        return queryset

    def filter_no_email(self, queryset, name, value):
        """Фильтр клиентов без email"""
        if value:
            return queryset.filter(email__isnull=True) | queryset.filter(email='')
        return queryset

    def filter_has_contact_channel(self, queryset, name, value):
        """Фильтр клиентов с каналами связи (Instagram, Telegram и т.д.)"""
        if value:
            from .models import ContactChannel
            # Возвращаем только клиентов у которых есть хотя бы один канал связи
            customer_ids = ContactChannel.objects.values_list('customer_id', flat=True).distinct()
            return queryset.filter(id__in=customer_ids)
        return queryset
