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

from api.property_api.property.serializers.property_serializer import PropertySerializer
from producers_products.serializers.producers_products_serializer import ProducersProductsSerializer
from service.models.services import Services
from service.serializers.services_serializer import ServiceSerializer
from api.property_api.property.models.property import Property
from jobs_company.models.jobs import Jobs
from jobs_company.serializers.jobs_serializer import JobsSerializer
from producers_products.models.producers_products import ProducersProducts

from common.pagination.custom_pagination import CustomPageNumberPagination
from common.exceptions.exceptions import custom_exception_handler

from rest_framework.parsers import MultiPartParser, FormParser

# from service_ownership.permissions import IsOwnerOrReadOnly
from rest_framework.permissions import AllowAny

from django.db.models import Q


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

    def get(self, request):
        query = request.query_params.get("q", "").strip()
        section = request.query_params.get("section")   # services / properties / jobs / products

        if not section:
            return Response({"error": "section query param is required"}, status=400)

        paginator = CustomPageNumberPagination()

        if section.lower() == "services" or section.lower() == "service":
            qs = Services.objects.select_related('service_ownership','company','category_services')
            if query:
                qs = qs.filter(
                    Q(name__icontains=query) |
                    Q(company__name__icontains=query) |
                    Q(category_services__name__icontains=query)
                )
            result_page = paginator.paginate_queryset(qs, request)
            serializer = ServiceSerializer(result_page, many=True, context={'request': request})
            return paginator.get_paginated_response(serializer.data)

        elif section.lower() == "properties" or section.lower() == "property":
            qs = Property.objects.select_related('agent','country','city','state').prefetch_related('property','media')
            if query:
                qs = qs.filter(Q(title__icontains=query) | Q(description__icontains=query))
            result_page = paginator.paginate_queryset(qs, request)
            serializer = PropertySerializer(result_page, many=True, context={'request': request})
            return paginator.get_paginated_response(serializer.data)

        elif section.lower() == "jobs" or section.lower() == "job":
            qs = Jobs.objects.all()
            if query:
                qs = qs.filter(Q(title__icontains=query) | Q(description__icontains=query))
            result_page = paginator.paginate_queryset(qs, request)
            serializer = JobsSerializer(result_page, many=True, context={'request': request})
            return paginator.get_paginated_response(serializer.data)

        elif section.lower() == "products" or section.lower() == "product":
            qs = ProducersProducts.objects.select_related('sub_category').prefetch_related("product_variant",'product_color','product_image','product_size')
            if query:
                qs = qs.filter(Q(name__icontains=query) | Q(description__icontains=query))
            result_page = paginator.paginate_queryset(qs, request)
            serializer = ProducersProductsSerializer(result_page, many=True, context={'request': request})
            return paginator.get_paginated_response(serializer.data)

        else:
            return Response({"error": "Invalid section"}, status=400)