"""Viewsets for investments and rewards."""

from __future__ import annotations

from drf_spectacular.utils import OpenApiResponse, extend_schema
from rest_framework import filters, permissions, viewsets

from .models import Investment, Reward
from .serializers import InvestmentSerializer, RewardSerializer


class InvestmentViewSet(viewsets.ModelViewSet):
    """Authenticated CRUD (create/list/retrieve) for a user's investments."""

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

    def get_queryset(self):
        queryset = (
            Investment.objects.filter(user=self.request.user)
            .order_by("-created_at")
        )
        
        # Filter by status if provided
        status = self.request.query_params.get('status')
        if status:
            queryset = queryset.filter(status=status)
        
        return queryset

    @extend_schema(
        operation_id="investments_create",
        responses={
            201: InvestmentSerializer,
            400: OpenApiResponse(
                description=(
                    "Validation error. Possible reasons: "
                    "amount below minimum ($10), invalid amount format, "
                    "or insufficient balance. Error format: "
                    '{"amount": ["error message"]}'
                )
            ),
        },
    )
    def create(self, request, *args, **kwargs):
        """Create a new investment, deducting balance from user's credit_balance."""
        return super().create(request, *args, **kwargs)


class RewardViewSet(viewsets.ReadOnlyModelViewSet):
    """Read-only access to rewards tied to the authenticated user."""

    queryset = Reward.objects.none()
    serializer_class = RewardSerializer
    permission_classes = [permissions.IsAuthenticated]
    filter_backends = [filters.OrderingFilter]
    ordering = ["-reward_date"]

    def get_queryset(self):
        queryset = (
            Reward.objects.select_related("investment")
            .filter(investment__user=self.request.user)
            .order_by("-reward_date")
        )

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

        return queryset
