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

from .models import Account, Transaction
from .serializers import AccountSerializer, TransactionSerializer


class AccountViewSet(viewsets.ModelViewSet):
    queryset = Account.objects.all()
    serializer_class = AccountSerializer
    permission_classes = (permissions.IsAuthenticated,)


class TransactionViewSet(viewsets.ModelViewSet):
    queryset = Transaction.objects.select_related('account', 'created_by').all()
    serializer_class = TransactionSerializer
    permission_classes = (permissions.IsAuthenticated,)

    def perform_create(self, serializer):
        serializer.save(created_by=self.request.user)


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

    def get(self, request):
        qs = Transaction.objects.all()
        income = qs.filter(transaction_type='income').aggregate(total=Sum('amount'))['total'] or 0
        expense = qs.filter(transaction_type='expense').aggregate(total=Sum('amount'))['total'] or 0
        opening = Account.objects.aggregate(total=Sum('opening_balance'))['total'] or 0

        return Response({
            'total_income': income,
            'total_expense': expense,
            'total_balance': opening + income - expense,
            'accounts_count': Account.objects.filter(is_active=True).count(),
            'transactions_count': qs.count(),
            'today': timezone.localdate(),
        })
