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

from accounting.models import Transaction
from accounting.serializers import TransactionSerializer


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

    def get(self, request):
        queryset = Transaction.objects.select_related('account', 'created_by').filter(
            transaction_type='income'
        )

        date_value = request.query_params.get('date')
        account_id = request.query_params.get('account_id')

        if date_value:
            from datetime import datetime

            try:
                report_date = datetime.strptime(date_value, '%Y-%m-%d').date()
            except ValueError:
                return Response(
                    {'detail': 'date باید با فرمت YYYY-MM-DD باشد.'},
                    status=status.HTTP_400_BAD_REQUEST
                )
        else:
            from django.utils import timezone
            report_date = timezone.localdate()

        queryset = queryset.filter(transaction_date=report_date)

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

        total_payment = queryset.aggregate(total=Sum('amount'))['total'] or 0

        return Response({
            'date': report_date,
            'total_payment': total_payment,
            'payments_count': queryset.count(),
            'items': TransactionSerializer(queryset, many=True).data,
        })
