from rest_framework import status
from rest_framework.pagination import PageNumberPagination
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView

from .models import PowerStreamBonusRecord, PowerStreamMonthlyClaim
from .serializers import PowerStreamBonusRecordSerializer, PowerStreamMonthlyClaimSerializer
from .services.power_stream_service import get_user_power_stream_summary, process_monthly_claim


class PowerStreamSummaryView(APIView):
    """GET /api/v1/web/power-stream/summary/ — positions, eligibility, earnings, monthly status."""
    permission_classes = [IsAuthenticated]

    def get(self, request):
        opportunity_bundle_id = request.query_params.get('opportunity_bundle_id') or None
        earner_distributor_id = request.query_params.get('earner_distributor_id') or None
        data = get_user_power_stream_summary(
            request.user,
            opportunity_bundle_id=opportunity_bundle_id,
            earner_distributor_id=earner_distributor_id,
        )
        return Response({'success': True, 'data': data})


class LedgerPagination(PageNumberPagination):
    page_size = 20
    page_size_query_param = 'page_size'
    max_page_size = 100


class PowerStreamLedgerView(APIView):
    """GET /api/v1/web/power-stream/ledger/ — paginated bonus record history."""
    permission_classes = [IsAuthenticated]

    def get(self, request):
        qs = PowerStreamBonusRecord.objects.filter(earner=request.user).select_related('opportunity_bundle', 'earner_distributor').order_by('-earned_at')
        status_filter = request.query_params.get('status')
        opportunity_bundle_id = request.query_params.get('opportunity_bundle_id')
        earner_distributor_id = request.query_params.get('earner_distributor_id')
        if status_filter:
            qs = qs.filter(status=status_filter.upper())
        if opportunity_bundle_id:
            qs = qs.filter(opportunity_bundle_id=opportunity_bundle_id)
        if earner_distributor_id:
            qs = qs.filter(earner_distributor_id=earner_distributor_id)

        paginator = LedgerPagination()
        page = paginator.paginate_queryset(qs, request)
        serializer = PowerStreamBonusRecordSerializer(page, many=True)
        return paginator.get_paginated_response(serializer.data)


class PowerStreamClaimView(APIView):
    """POST /api/v1/web/power-stream/claim/ — claim accumulated monthly bonuses."""
    permission_classes = [IsAuthenticated]

    def post(self, request):
        try:
            result = process_monthly_claim(request.user)
            return Response({'success': True, 'data': result}, status=status.HTTP_200_OK)
        except Exception as exc:
            return Response({'success': False, 'error': str(exc)}, status=status.HTTP_400_BAD_REQUEST)


class PowerStreamClaimHistoryView(APIView):
    """GET /api/v1/web/power-stream/claim-history/ — monthly claim records."""
    permission_classes = [IsAuthenticated]

    def get(self, request):
        claims = PowerStreamMonthlyClaim.objects.filter(user=request.user).order_by('-claim_month')
        serializer = PowerStreamMonthlyClaimSerializer(claims, many=True)
        return Response({'success': True, 'data': serializer.data})
