from rest_framework import generics, permissions
from .models import Payment
from authentication.models import UserRoles
from authentication.permissions import IsAdmin, IsAdminOrSelf
from .serializers import PaymentSerializer
from authentication.firebase_auth import FirebaseAuthentication
from rest_framework.pagination import PageNumberPagination
from rest_framework import generics, status
from rest_framework.response import Response

class CustomPageNumberPagination(PageNumberPagination):
    page_size = 10
    page_size_query_param = 'page_size'
    max_page_size = 1000

class PaymentListView(generics.ListAPIView):
    authentication_classes = [FirebaseAuthentication]
    permission_classes = [IsAdminOrSelf]

    def get_queryset(self):
        user = self.request.user
        if UserRoles.objects.filter(user=user, role__name='ADMIN').exists():
            return Payment.objects.all()
        else:
            return Payment.objects.filter(userevent__userrole__user=user)

    serializer_class = PaymentSerializer
    pagination_class = CustomPageNumberPagination

class PaymentRetrieveUpdateDestroyView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [FirebaseAuthentication]
    permission_classes = [IsAdminOrSelf]
    serializer_class = PaymentSerializer
    queryset = Payment.objects.all()
    lookup_field = 'uid'

    def destroy(self, request, *args, **kwargs):
        instance = self.get_object()
        if not IsAdmin.has_permission(request=request):
            self.permission_denied(request)
        self.perform_destroy(instance)
        return Response(status=status.HTTP_204_NO_CONTENT)