from django.db.models import F, Sum
from rest_framework import permissions, status
from rest_framework.response import Response
from rest_framework.views import APIView

from courses.models import MemberCourse


class DebtorsReportView(APIView):
    permission_classes = (permissions.IsAuthenticated,)

    def get(self, request):
        queryset = MemberCourse.objects.select_related('member').filter(
            paid_fee__lt=F('fee')
        )

        member_id = request.query_params.get('member_id')
        active_only = request.query_params.get('active_only')

        if member_id:
            try:
                member_id = int(member_id)
            except (TypeError, ValueError):
                return Response(
                    {'detail': 'member_id باید عدد صحیح باشد.'},
                    status=status.HTTP_400_BAD_REQUEST,
                )
            queryset = queryset.filter(member_id=member_id)

        if active_only == 'true':
            from django.utils import timezone
            now = timezone.now()
            queryset = queryset.filter(
                start_date__lte=now,
                end_date__gte=now,
                used_sessions__lt=F('total_sessions'),
            )

        items = []
        for course in queryset:
            debt = max(course.fee - course.paid_fee, 0)
            items.append({
                'member_course_id': course.id,
                'member_id': course.member_id,
                'member_name': f'{course.member.first_name} {course.member.last_name}',
                'enroll_code': course.member.enroll_code,
                'mobile': course.member.mobile,
                'fee': course.fee,
                'paid_fee': course.paid_fee,
                'debt': debt,
                'start_date': course.start_date,
                'end_date': course.end_date,
                'total_sessions': course.total_sessions,
                'used_sessions': course.used_sessions,
                'remaining_sessions': course.remaining_sessions,
                'is_active': course.is_active,
                'is_expired': course.is_expired,
            })

        total_debt = sum(item['debt'] for item in items)

        return Response({
            'total_debt': total_debt,
            'debtors_count': len(items),
            'items': items,
        })
