from django.db import models
from django.db.models import Sum
from django.utils import timezone
from rest_framework import permissions
from rest_framework.response import Response
from rest_framework.views import APIView

from Members.models import Member
from accounting.models import Account, Transaction
from attendance.models import Attendance
from courses.models import MemberCourse


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

    def get(self, request):
        today = timezone.localdate()
        now = timezone.now()

        members_total = Member.objects.count()
        members_active = Member.objects.filter(is_active=True).count()
        members_inactive = members_total - members_active

        active_courses = MemberCourse.objects.filter(
            start_date__lte=now,
            end_date__gte=now,
            used_sessions__lt=models.F('total_sessions'),
        ).count()

        expired_courses = MemberCourse.objects.filter(end_date__lt=now).count()
        no_course_members = Member.objects.filter(courses__isnull=True).count()

        debt = MemberCourse.objects.aggregate(
            total=Sum('fee') - Sum('paid_fee')
        )['total'] or 0

        inside_now = Attendance.objects.filter(exit_at__isnull=True).count()
        today_attendance = Attendance.objects.filter(entry_at__date=today).count()

        income = Transaction.objects.filter(
            transaction_type='income'
        ).aggregate(total=Sum('amount'))['total'] or 0
        expense = Transaction.objects.filter(
            transaction_type='expense'
        ).aggregate(total=Sum('amount'))['total'] or 0
        opening = Account.objects.aggregate(total=Sum('opening_balance'))['total'] or 0

        return Response({
            'members': {
                'total': members_total,
                'active': members_active,
                'inactive': members_inactive,
                'no_course': no_course_members,
            },
            'courses': {
                'active': active_courses,
                'expired': expired_courses,
            },
            'attendance': {
                'inside_now': inside_now,
                'today': today_attendance,
            },
            'accounting': {
                'income': income,
                'expense': expense,
                'balance': opening + income - expense,
                'debt': debt,
            },
        })
