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 rest_framework.views import APIView
from rest_framework.parsers import MultiPartParser, FormParser, JSONParser

from company_review.models.service_review import CompanyReview
from company_review.serializers.service_review_serializer import CompanyReviewSerializer
from common.pagination.custom_pagination import CustomPageNumberPagination
from common.exceptions.exceptions import custom_exception_handler
from package_details.utils import ensure_user_has_storage_capacity

from rest_framework.permissions import AllowAny, IsAuthenticated


class CompanyReviewListCreateAPIView(APIView):
    parser_classes = [MultiPartParser, FormParser, JSONParser]

    def get_permissions(self):
        if self.request.method == "POST":
            return [IsAuthenticated()]  # only logged-in users can POST
        return [AllowAny()]  # anyone can GET

    @swagger_auto_schema(request_body=CompanyReviewSerializer)
    def post(self, request):
        # ✅ Enhanced storage capacity check for both image and video
        review_image = request.FILES.get("review_image")
        review_video = request.FILES.get("review_video")
        
        if review_image:
            ensure_user_has_storage_capacity(
                request.user, 
                review_image, 
                field_name="review_image"
            )
        elif review_video:
            ensure_user_has_storage_capacity(
                request.user, 
                review_video, 
                field_name="review_video"
            )

        serializer = CompanyReviewSerializer(data=request.data,context={'request': request})
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response({"success": "Company review created successfully"}, status=status.HTTP_201_CREATED)
    
    def get(self, request):
        service = CompanyReview.objects.filter(is_active=True)
        user_id = request.query_params.get("user")
        if user_id:
            service = service.filter(user_id=user_id)
        service_id = request.query_params.get("service")
        if service_id:
            service = service.filter(service_id=service_id)
        paginator = CustomPageNumberPagination()
        result_page = paginator.paginate_queryset(service, request)
        serializer = CompanyReviewSerializer(result_page, many=True)
        return paginator.get_paginated_response(serializer.data)
    

class CompanyReviewDetailAPIView(APIView):
    parser_classes = [MultiPartParser, FormParser, JSONParser]

    @swagger_auto_schema(request_body=CompanyReviewSerializer)
    def put(self, request, pk):
        service = get_object_or_404(CompanyReview, pk=pk)
        serializer = CompanyReviewSerializer(service, data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response({"success": "Company review updated successfully"}, status=status.HTTP_200_OK)
    
    def get(self, request, pk):
        service = get_object_or_404(CompanyReview, pk=pk)
        serializer = CompanyReviewSerializer(service)
        return Response(serializer.data)
    
    def delete(self, request, pk):
        service = get_object_or_404(CompanyReview, pk=pk)
        service.soft_delete()
        return Response({"success": "Company review deleted successfully"}, status=status.HTTP_200_OK)
