"""Viewsets for referral commissions."""

from __future__ import annotations

from rest_framework import filters, permissions, viewsets

from .models import Commission
from .serializers import CommissionSerializer


class CommissionViewSet(viewsets.ReadOnlyModelViewSet):
    """Authenticated access to commissions earned by the user."""

    queryset = Commission.objects.none()
    serializer_class = CommissionSerializer
    permission_classes = [permissions.IsAuthenticated]
    filter_backends = [filters.OrderingFilter]
    ordering = ["-created_at"]

    def get_queryset(self):
        queryset = (
            Commission.objects.select_related("upline_user", "downline_user", "reward")
            .filter(upline_user=self.request.user)
            .order_by("-created_at")
        )

        status_param = self.request.query_params.get("status")
        if status_param:
            queryset = queryset.filter(status=status_param)

        return queryset


class ReferralNetworkViewSet(viewsets.ReadOnlyModelViewSet):
    """Authenticated access to the list of users referred by the current user."""

    permission_classes = [permissions.IsAuthenticated]
    serializer_class = CommissionSerializer  # Placeholder, will be overriden in get_serializer_class

    def get_queryset(self):
        # Avoid circular import
        from apps.users.models import User
        from apps.investments.models import Investment
        from django.db.models import Sum, Q, DecimalField
        from django.db.models.functions import Coalesce

        queryset = User.objects.filter(referred_by=self.request.user).annotate(
            active_investment_total=Coalesce(
                Sum(
                    'investments__amount',
                    filter=Q(
                        investments__status__in=[
                            Investment.STATUS_PENDING,
                            Investment.STATUS_ACTIVE
                        ]
                    )
                ),
                0,
                output_field=DecimalField(max_digits=20, decimal_places=8)
            ),
            total_investment=Coalesce(
                Sum(
                    'investments__amount',
                    filter=Q(
                        investments__status__in=[
                            Investment.STATUS_PENDING,
                            Investment.STATUS_ACTIVE,
                            Investment.STATUS_COMPLETED
                        ]
                    )
                ),
                0,
                output_field=DecimalField(max_digits=20, decimal_places=8)
            )
        ).order_by("-created_at")
        
        return queryset

    def get_serializer_class(self):
        from .serializers import ReferralNetworkSerializer

        return ReferralNetworkSerializer
