from rest_framework import generics, permissions, filters, status
from rest_framework.response import Response
from rest_framework.views import APIView
from django.db.models import Q
from .models import Member
from .serializers import MemberSerializer, MemberListSerializer


class MemberListCreateView(generics.ListCreateAPIView):
    permission_classes = [permissions.IsAuthenticated]
    filter_backends = [filters.SearchFilter, filters.OrderingFilter]
    search_fields = ['full_name', 'phone', 'email', 'member_id']
    ordering_fields = ['full_name', 'date_joined', 'created_at']

    def get_queryset(self):
        queryset = Member.objects.select_related('department', 'created_by')
        status = self.request.query_params.get('status')
        department = self.request.query_params.get('department')
        gender = self.request.query_params.get('gender')

        if status:
            queryset = queryset.filter(membership_status=status)
        if department:
            queryset = queryset.filter(department_id=department)
        if gender:
            queryset = queryset.filter(gender=gender)
        return queryset

    def get_serializer_class(self):
        if self.request.method == 'GET':
            return MemberListSerializer
        return MemberSerializer


class MemberDetailView(generics.RetrieveUpdateDestroyAPIView):
    queryset = Member.objects.select_related('department', 'created_by')
    serializer_class = MemberSerializer
    permission_classes = [permissions.IsAuthenticated]


class MemberStatsView(APIView):
    permission_classes = [permissions.IsAuthenticated]

    def get(self, request):
        total = Member.objects.count()
        active = Member.objects.filter(membership_status='active').count()
        inactive = Member.objects.filter(membership_status='inactive').count()
        male = Member.objects.filter(gender='M').count()
        female = Member.objects.filter(gender='F').count()

        return Response({
            'total': total,
            'active': active,
            'inactive': inactive,
            'male': male,
            'female': female,
        })