from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from drf_yasg.utils import swagger_auto_schema
from django.shortcuts import get_object_or_404

from common.pagination.custom_pagination import CustomPageNumberPagination
from common.exceptions.exceptions import custom_exception_handler
from ads.models.ads import Ads
from ads.serializers.ads_serializer import AdsSerializer
from rest_framework.parsers import MultiPartParser, FormParser
from rest_framework.permissions import IsAuthenticated, AllowAny


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

    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=AdsSerializer)
    def post(self, request):
        serializer = AdsSerializer(data=request.data, context={'request': request})
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response({"Success": "Ads created successfully"}, status=status.HTTP_201_CREATED)
    
    def get(self, request):
        ads = Ads.objects.all().order_by('-id')
        user_id = request.query_params.get("user")
        if user_id:
            ads = ads.filter(user_id=user_id)
        is_active_param = request.query_params.get('is_active')
        if is_active_param and isinstance(is_active_param, str):
            if is_active_param.lower() == 'true':
                ads = ads.filter(is_active=True)
            else:
                ads = ads.filter(is_active=False)
        # else:
        #     return Response({"Wrong params": "Parameter is_active has to be a string(True/False)"}, status=status.HTTP_400_BAD_REQUEST)
        paginator = CustomPageNumberPagination()
        paginated_queryset = paginator.paginate_queryset(ads, request)
        serializer = AdsSerializer(paginated_queryset, many=True, context={'request': request})
        return paginator.get_paginated_response(serializer.data)
    

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

    @swagger_auto_schema(request_body=AdsSerializer)
    def put(self, request, pk):
        ads = get_object_or_404(Ads, pk=pk)
        serializer = AdsSerializer(ads, data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response({"Success": "Ads updated successfully"}, status=status.HTTP_200_OK)
    
    def get(self, request, pk):
        ads = get_object_or_404(Ads, pk=pk)
        serializer = AdsSerializer(ads, context={'request': request})
        return Response(serializer.data)
    
    def delete(self,request,pk):
        ads = get_object_or_404(Ads, pk=pk)
        ads.delete()
        return Response({"Success": "Ads deleted successfully"}, status=status.HTTP_200_OK)
