from datetime import datetime, time

from django.utils import timezone
from rest_framework import permissions, status
from rest_framework.response import Response
from rest_framework.views import APIView

from Members.models import Member
from attendance.models import Attendance
from attendance.serializers import AttendanceSerializer


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

    def get(self, request):
        queryset = Attendance.objects.select_related('member').all()

        start_date = request.query_params.get('start_date')
        end_date = request.query_params.get('end_date')
        member_id = request.query_params.get('member_id')

        if start_date:
            try:
                day = datetime.strptime(start_date, '%Y-%m-%d').date()
            except ValueError:
                return Response(
                    {'detail': 'فرمت start_date باید YYYY-MM-DD باشد.'},
                    status=status.HTTP_400_BAD_REQUEST,
                )
            start = timezone.make_aware(datetime.combine(day, time.min))
            queryset = queryset.filter(entry_at__gte=start)

        if end_date:
            try:
                day = datetime.strptime(end_date, '%Y-%m-%d').date()
            except ValueError:
                return Response(
                    {'detail': 'فرمت end_date باید YYYY-MM-DD باشد.'},
                    status=status.HTTP_400_BAD_REQUEST,
                )
            end = timezone.make_aware(datetime.combine(day, time.max))
            queryset = queryset.filter(entry_at__lte=end)

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

            if not Member.objects.filter(id=member_id).exists():
                return Response(
                    {'detail': 'عضو موردنظر پیدا نشد.'},
                    status=status.HTTP_404_NOT_FOUND,
                )

            queryset = queryset.filter(member_id=member_id)

        data = AttendanceSerializer(queryset, many=True).data
        total_duration = sum(item.get('duration_seconds') or 0 for item in data)

        return Response({
            'total_visits': len(data),
            'total_duration_seconds': total_duration,
            'items': data,
        })
