from django.db.models import Prefetch
from rest_framework.filters import OrderingFilter
from rest_framework.viewsets import ModelViewSet

from courses.models import MemberCourse
from .models import Member
from .permissions import CanManageMembers
from .serializers import MemberSerializer


class MemberViewSet(ModelViewSet):
    serializer_class = MemberSerializer
    permission_classes = [CanManageMembers]
    filter_backends = [OrderingFilter]
    ordering_fields = [
        'first_name',
        'last_name',
        'mobile',
        'national_code',
        'enroll_code',
        'inserted_date_time',
        'updated_date_time',
    ]
    ordering = ['first_name', 'last_name']

    def get_queryset(self):
        current_course = MemberCourse.objects.order_by('-start_date')
        queryset = Member.objects.select_related('user').prefetch_related(
            Prefetch('courses', queryset=current_course, to_attr='_current_course')
        ).all()

        search = self.request.query_params.get('search', '').strip()
        if search:
            from django.db.models import Q

            queryset = queryset.filter(
                Q(first_name__icontains=search)
                | Q(last_name__icontains=search)
                | Q(mobile__icontains=search)
                | Q(national_code__icontains=search)
                | Q(enroll_code__icontains=search)
            )

        is_active = self.request.query_params.get('is_active')
        if is_active in ('true', 'false'):
            queryset = queryset.filter(is_active=(is_active == 'true'))

        return queryset
