import django_filters
from django.db import models
from programs.models import Program
from notices.models import Notice
from events.models import Event
from faculty.models import Faculty
from gallery.models import GalleryImage, Album
from admissions.models import AdmissionInquiry
from contact.models import ContactMessage
from rest_framework.filters import SearchFilter, OrderingFilter

class AdmissionInquiryFilter(django_filters.FilterSet):
    created_after = django_filters.DateFilter(field_name="created_at", lookup_expr="gte")
    created_before = django_filters.DateFilter(field_name="created_at", lookup_expr="lte")

    class Meta:
        model = AdmissionInquiry
        fields = {
            'status': ['exact'],
            'source': ['exact'],
            'program': ['exact'],
            'academic_year': ['exact'],
        }


class ContactMessageFilter(django_filters.FilterSet):
    search = django_filters.CharFilter(method='filter_search', label='Search')
    ordering = django_filters.OrderingFilter(
        fields=(
            ('created_at', 'created_at'),
        ),
        label='Ordering'
    )

    class Meta:
        model = ContactMessage
        fields = {
            'status': ['exact'],
            'category': ['exact'],
        }

    def filter_search(self, queryset, name, value):
        return queryset.filter(
            models.Q(full_name__icontains=value) |
            models.Q(email__icontains=value) |
            models.Q(subject__icontains=value) |
            models.Q(message__icontains=value)
        )


class ProgramFilter(django_filters.FilterSet):
    search = django_filters.CharFilter(method='filter_search', label='Search')
    ordering = django_filters.OrderingFilter(
        fields=(
            ('name', 'name'),
            ('level', 'level'),
            ('created_at', 'created_at'),
        ),
        label='Ordering'
    )

    class Meta:
        model = Program
        fields = {
            'level': ['exact'],
            'department': ['exact'],
            'status': ['exact'],
            'is_featured': ['exact'],
        }

    def filter_search(self, queryset, name, value):
        return queryset.filter(
            models.Q(name__icontains=value) |
            models.Q(abbreviation__icontains=value) |
            models.Q(department__icontains=value)
        )


class NoticeFilter(django_filters.FilterSet):
    search = django_filters.CharFilter(method='filter_search', label='Search')
    ordering = django_filters.OrderingFilter(
        fields=(
            ('date', 'date'),
            ('created_at', 'created_at'),
            ('is_pinned', '-is_pinned'),
        ),
        label='Ordering'
    )

    class Meta:
        model = Notice
        fields = {
            'category': ['exact'],
            'priority': ['exact'],
            'is_new': ['exact'],
            'is_pinned': ['exact'],
            'is_published': ['exact'],
        }

    def filter_search(self, queryset, name, value):
        return queryset.filter(
            models.Q(title__icontains=value) |
            models.Q(excerpt__icontains=value) |
            models.Q(body__icontains=value)
        )


class EventFilter(django_filters.FilterSet):
    search = django_filters.CharFilter(method='filter_search', label='Search')
    ordering = django_filters.OrderingFilter(
        fields=(
            ('date', 'date'),
            ('created_at', 'created_at'),
            ('is_featured', '-is_featured'),
        ),
        label='Ordering'
    )

    class Meta:
        model = Event
        fields = {
            'category': ['exact'],
            'status': ['exact'],
            'is_featured': ['exact'],
            'is_past': ['exact'],
        }

    def filter_search(self, queryset, name, value):
        return queryset.filter(
            models.Q(title__icontains=value) |
            models.Q(description__icontains=value) |
            models.Q(location__icontains=value)
        )


class FacultyFilter(django_filters.FilterSet):
    search = django_filters.CharFilter(method='filter_search', label='Search')
    ordering = django_filters.OrderingFilter(
        fields=(
            ('full_name', 'full_name'),
            ('order', 'order'),
            ('experience_years', '-experience_years'),
        ),
        label='Ordering'
    )

    class Meta:
        model = Faculty
        fields = {
            'department': ['exact'],
            'employment_type': ['exact'],
            'status': ['exact'],
            'is_featured': ['exact'],
        }

    def filter_search(self, queryset, name, value):
        return queryset.filter(
            models.Q(full_name__icontains=value) |
            models.Q(email__icontains=value) |
            models.Q(designation__icontains=value) |
            models.Q(specialization__icontains=value)
        )


class GalleryFilter(django_filters.FilterSet):
    search = django_filters.CharFilter(method='filter_search', label='Search')
    ordering = django_filters.OrderingFilter(
        fields=(
            ('created_at', 'created_at'),
            ('order', 'order'),
            ('is_featured', '-is_featured'),
        ),
        label='Ordering'
    )

    class Meta:
        model = GalleryImage
        fields = {
            'category': ['exact'],
            'is_featured': ['exact'],
            'is_published': ['exact'],
            'album': ['exact'],
        }

    def filter_search(self, queryset, name, value):
        return queryset.filter(
            models.Q(caption__icontains=value) |
            models.Q(alt_text__icontains=value)
        )


class AlbumFilter(django_filters.FilterSet):
    search = django_filters.CharFilter(method='filter_search', label='Search')
    ordering = django_filters.OrderingFilter(
        fields=(
            ('date', 'date'),
            ('created_at', 'created_at'),
            ('is_featured', '-is_featured'),
        ),
        label='Ordering'
    )

    class Meta:
        model = Album
        fields = {
            'category': ['exact'],
            'is_featured': ['exact'],
            'is_published': ['exact'],
        }

    def filter_search(self, queryset, name, value):
        return queryset.filter(
            models.Q(title__icontains=value) |
            models.Q(description__icontains=value)
        )