from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework.exceptions import ValidationError, NotFound
from drf_yasg.utils import swagger_auto_schema
from django.shortcuts import get_object_or_404

from service_ownership.models.service_ownership import ServiceOwnership
from service_ownership.serializers.service_ownership_serializer import ServiceOwnershipSerializer, ServiceOwnershipStatusSerializer
from common.pagination.custom_pagination import CustomPageNumberPagination
from common.exceptions.exceptions import custom_exception_handler
from django.db.models import Q
from rest_framework.parsers import MultiPartParser, FormParser
from rest_framework.permissions import IsAuthenticated, AllowAny

class ServiceOwnershipListCreateAPIView(APIView):
    parser_classes = [MultiPartParser, FormParser]
    permission_classes = [IsAuthenticated]  
    
    # def get_permissions(self):
    #     if self.request.method == "GET":
    #         return [AllowAny()]  
    #     return [IsAuthenticated()]

    @swagger_auto_schema(request_body=ServiceOwnershipSerializer)
    def post(self, request):
        serializer = ServiceOwnershipSerializer(data=request.data, context={'request': request})
        serializer.is_valid(raise_exception=True)
        serializer.save(user=request.user, created_by=request.user)
        return Response({"success": "Ownership request created successfully"}, status=status.HTTP_201_CREATED)
    
    def get(self, request):
        ownerships = ServiceOwnership.objects.filter(is_active=True).select_related(
            'user',
            'service',
            'service__created_by',
            'created_by'
        )
        
        if request.user.is_authenticated:
            user = request.user
            if user.role == 'admin':
                pass
            else:
                ownerships = ownerships.filter(
                    Q(user=user) | 
                    Q(service__created_by=user)  
                )
        else:
            pass
        
        paginator = CustomPageNumberPagination()
        result_page = paginator.paginate_queryset(ownerships, request)
        serializer = ServiceOwnershipSerializer(result_page, many=True, context={'request': request})
        return paginator.get_paginated_response(serializer.data)    

class ServiceOwnershipDetailAPIView(APIView):
    parser_classes = [MultiPartParser, FormParser]
    permission_classes = [AllowAny]

    @swagger_auto_schema(request_body=ServiceOwnershipStatusSerializer)
    def patch(self, request, pk):
        category = get_object_or_404(ServiceOwnership, pk=pk)
        serializer = ServiceOwnershipStatusSerializer(category, data=request.data, context={'request': request})
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response({"success": "Service ownership updated successfully"}, status=status.HTTP_200_OK)

    def get(self, request, pk):
        category = get_object_or_404(ServiceOwnership, pk=pk)
        serializer = ServiceOwnershipSerializer(category, context={'request': request})
        return Response(serializer.data)

    def delete(self, request, pk):
        category = get_object_or_404(ServiceOwnership, pk=pk)
        category.delete()
        return Response({"success": "Ownership request deleted successfully"}, status=status.HTTP_200_OK)
    