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

import django_filters
from django import forms
from django.db.models import Q
from .models import Order, OrderStatus, Delivery


class OrderFilter(django_filters.FilterSet):
    """
    Фильтр для списка заказов
    Поддерживает фильтрацию по:
    - Поиску (номер, клиент, телефон, email)
    - Дате доставки (диапазон)
    - Дате создания (диапазон)
    - Статусу заказа
    - Типу доставки
    - Статусу оплаты
    """

    # Поиск по нескольким полям
    search = django_filters.CharFilter(
        method='filter_search',
        label='Поиск',
        widget=forms.TextInput(attrs={
            'class': 'form-control',
            'placeholder': 'Номер заказа, клиент, телефон...'
        })
    )

    # Фильтр по диапазону дат доставки (используем delivery__delivery_date после рефакторинга)
    delivery_date_after = django_filters.DateFilter(
        field_name='delivery__delivery_date',
        lookup_expr='gte',
        label='Дата доставки от',
        widget=forms.DateInput(attrs={
            'class': 'form-control date-input',
            'type': 'date'
        })
    )

    delivery_date_before = django_filters.DateFilter(
        field_name='delivery__delivery_date',
        lookup_expr='lte',
        label='Дата доставки до',
        widget=forms.DateInput(attrs={
            'class': 'form-control date-input',
            'type': 'date'
        })
    )

    # Фильтр по диапазону дат создания
    created_at_after = django_filters.DateFilter(
        field_name='created_at',
        lookup_expr='gte',
        label='Дата создания от',
        widget=forms.DateInput(attrs={
            'class': 'form-control date-input',
            'type': 'date'
        })
    )

    created_at_before = django_filters.DateFilter(
        field_name='created_at',
        lookup_expr='lte',
        label='Дата создания до',
        widget=forms.DateInput(attrs={
            'class': 'form-control date-input',
            'type': 'date'
        })
    )

    # Фильтр по статусу
    status = django_filters.ModelChoiceFilter(
        queryset=OrderStatus.objects.all().order_by('order', 'name'),
        empty_label='Все статусы',
        label='Статус',
        widget=forms.Select(attrs={'class': 'form-select'})
    )

    # Фильтр по типу доставки
    delivery_type = django_filters.ChoiceFilter(
        method='filter_delivery_type',
        choices=[
            ('delivery', 'Доставка'),
            ('pickup', 'Самовывоз')
        ],
        empty_label='Все типы',
        label='Тип',
        widget=forms.Select(attrs={'class': 'form-select'})
    )

    # Фильтр по статусу оплаты
    payment_status = django_filters.ChoiceFilter(
        choices=Order.PAYMENT_STATUS_CHOICES,
        empty_label='Все статусы оплаты',
        label='Оплата',
        widget=forms.Select(attrs={'class': 'form-select'})
    )

    # Фильтр: показывать все заказы, включая завершённые и отменённые
    show_all_orders = django_filters.BooleanFilter(
        method='filter_show_all_orders',
        label='Включая завершённые',
        widget=forms.CheckboxInput(attrs={'class': 'form-check-input'})
    )

    class Meta:
        model = Order
        fields = ['search', 'status', 'delivery_type', 'payment_status',
                  'delivery_date_after', 'delivery_date_before',
                  'created_at_after', 'created_at_before',
                  'show_all_orders']

    def filter_search(self, queryset, name, value):
        """
        Кастомный метод для поиска по нескольким полям:
        - Номер заказа
        - Имя клиента
        - Телефон клиента
        - Email клиента
        """
        if not value:
            return queryset

        return queryset.filter(
            Q(order_number__icontains=value) |
            Q(customer__name__icontains=value) |
            Q(customer__phone__icontains=value) |
            Q(customer__email__icontains=value)
        )

    def filter_delivery_type(self, queryset, name, value):
        """
        Кастомный фильтр для типа доставки (используем delivery__delivery_type после рефакторинга)
        """
        if value == 'delivery':
            return queryset.filter(delivery__delivery_type=Delivery.DELIVERY_TYPE_COURIER)
        elif value == 'pickup':
            return queryset.filter(delivery__delivery_type=Delivery.DELIVERY_TYPE_PICKUP)
        return queryset

    def filter_show_all_orders(self, queryset, name, value):
        """
        Фильтр для показа всех заказов.
        - Если False или не передан: только активные заказы
          (статусы с is_positive_end=False И is_negative_end=False)
        - Если True: все заказы без ограничений
        """
        if not value:
            # Активные заказы = НЕ (is_positive_end OR is_negative_end)
            return queryset.filter(
                Q(status__isnull=True) |
                (Q(status__is_positive_end=False) & Q(status__is_negative_end=False))
            )
        return queryset
