from rest_framework.generics import ListAPIView,CreateAPIView
from .models import City , Holiday,ContactUs,PackageInquiry,Package,HomeBanner,Packagetype,CruisePackage,CruisePackageInquiry,Gallery,Review
from .serializers import CitySerializer,ReviewSerializer,GallerySerializer,ContactUsSerializer,CruisePackageInquirySerializer,HolidaySerializer,PackageInquirySerializer,CruisePackageSerializer,PackageSerializer,BannerSerializer,PackagetypeSerializer
from helpers import api_response


class CityListAPI(ListAPIView):
    queryset = City.objects.all().order_by('-id')
    
    serializer_class = CitySerializer

    def list(self, request, *args, **kwargs):
        queryset = self.get_queryset()

        page = self.paginate_queryset(queryset)

        if page is not None:
            serializer = self.get_serializer(page, many=True)

            return api_response(
                data=serializer.data,
                pagination=self.paginator
            )

        serializer = self.get_serializer(queryset, many=True)

        return api_response(data=serializer.data)


class PackageTypeListAPI(ListAPIView):
    queryset = Packagetype.objects.all().order_by('-id')
    
    serializer_class = PackagetypeSerializer

    def list(self, request, *args, **kwargs):
        queryset = self.get_queryset()

        page = self.paginate_queryset(queryset)

        if page is not None:
            serializer = self.get_serializer(page, many=True)

            return api_response(
                data=serializer.data,
                pagination=self.paginator
            )

        serializer = self.get_serializer(queryset, many=True)

        return api_response(data=serializer.data)


class HolidayListAPI(ListAPIView):
    queryset = Holiday.objects.all().order_by('-id')
    
    serializer_class = HolidaySerializer

    def list(self, request, *args, **kwargs):
        queryset = self.get_queryset()

        page = self.paginate_queryset(queryset)

        if page is not None:
            serializer = self.get_serializer(page, many=True)

            return api_response(
                data=serializer.data,
                pagination=self.paginator
            )

        serializer = self.get_serializer(queryset, many=True)

        return api_response(data=serializer.data)
    

class BannerListAPI(ListAPIView):
    queryset = HomeBanner.objects.all().order_by('-id')
    
    serializer_class = BannerSerializer

    def list(self, request, *args, **kwargs):
        queryset = self.get_queryset()

        page = self.paginate_queryset(queryset)

        if page is not None:
            serializer = self.get_serializer(page, many=True)

            return api_response(
                data=serializer.data,
                pagination=self.paginator
            )

        serializer = self.get_serializer(queryset, many=True)

        return api_response(data=serializer.data)
    
class PackageListAPI(ListAPIView):
    queryset = Package.objects.select_related(
        'holiday', 'location'
    ).prefetch_related(
        'images', 'itineraries'
    ).order_by('-id')

    serializer_class = PackageSerializer

    def list(self, request, *args, **kwargs):
        queryset = self.get_queryset()

        page = self.paginate_queryset(queryset)

        serializer = self.get_serializer(
            page if page is not None else queryset,
            many=True,
            context={"request": request}
        )

        return api_response(
            data=serializer.data,
            pagination=self.paginator if page is not None else None
        )
    
from rest_framework.views import APIView

class PackageDetailAPI(APIView):
    def get(self, request, id):
        try:
            instance = Package.objects.select_related(
                'holiday', 'location'
            ).prefetch_related(
                'images', 'itineraries'
            ).get(id=id)
        except Package.DoesNotExist:
            return api_response(
                success=False,
                message="Package not found",
                data=None
            )

        serializer = PackageSerializer(
            instance, context={"request": request}
        )

        return api_response(
            success=True,
            message="Package fetched successfully",
            data=serializer.data
        )
    

from rest_framework.generics import ListAPIView

class PackageLocationListAPI(ListAPIView):
    serializer_class = PackageSerializer

    def get_queryset(self):
        location_id = self.kwargs.get("id")

        return Package.objects.select_related(
            'holiday', 'location', 'package_type'
        ).prefetch_related(
            'images', 'itineraries'
        ).filter(
            location_id=location_id,
            is_active=True
        ).order_by('-id')

    def list(self, request, *args, **kwargs):
        queryset = self.get_queryset()

        serializer = self.get_serializer(
            queryset,
            many=True,
            context={"request": request}
        )

        return api_response(
            success=True,
            message="Packages fetched successfully",
            data=serializer.data
        )
    


class PackageHolidayLocationAPI(ListAPIView):
    serializer_class = PackageSerializer

    def get_queryset(self):
        
        holiday_id = self.kwargs.get("id")

        qs = Package.objects.select_related(
            'holiday', 'location', 'package_type'
        ).prefetch_related(
            'images', 'itineraries'
        ).filter(is_active=True)

        if holiday_id:
            qs = qs.filter(holiday_id=holiday_id)

        return qs.order_by('-id')

    def list(self, request, *args, **kwargs):
        queryset = self.get_queryset()

        serializer = self.get_serializer(
            queryset,
            many=True,
            context={"request": request}
        )

        return api_response(
            success=True,
            message="Packages fetched successfully",
            data=serializer.data
        )
    

class PackageTrendingListAPI(ListAPIView):
    serializer_class = PackageSerializer

    def get_queryset(self):
        package_type_id = 1

        qs = Package.objects.select_related(
            'holiday', 'location', 'package_type'
        ).prefetch_related(
            'images', 'itineraries'
        ).filter(
            is_active=True
        )

        # ✅ Filter by package_type_id (single or multiple)
        if package_type_id:
                
                qs = qs.filter(package_type_id=package_type_id)

        return qs.order_by('-id')

    def list(self, request, *args, **kwargs):
        queryset = self.get_queryset()

        page = self.paginate_queryset(queryset)

        serializer = self.get_serializer(
            page if page is not None else queryset,
            many=True,
            context={"request": request}
        )

        return api_response(
            data=serializer.data,
            pagination=self.get_paginated_response(serializer.data).data if page is not None else None
        )


class PackageTrendingListAPI(ListAPIView):
    serializer_class = PackageSerializer

    def get_queryset(self):
        package_type_id = 1

        qs = Package.objects.select_related(
            'holiday', 'location', 'package_type'
        ).prefetch_related(
            'images', 'itineraries'
        ).filter(
            is_active=True
        )

        # ✅ Filter by package_type_id (single or multiple)
        if package_type_id:
                
                qs = qs.filter(package_type_id=package_type_id)

        return qs.order_by('-id')

    def list(self, request, *args, **kwargs):
        queryset = self.get_queryset()

        page = self.paginate_queryset(queryset)

        serializer = self.get_serializer(
            page if page is not None else queryset,
            many=True,
            context={"request": request}
        )

        return api_response(
            data=serializer.data,
            pagination=self.get_paginated_response(serializer.data).data if page is not None else None
        )
    
    
class PackageDubaiListAPI(ListAPIView):
    serializer_class = PackageSerializer

    def get_queryset(self):
        qs = Package.objects.select_related(
            'holiday', 'location', 'package_type'
        ).prefetch_related(
            'images', 'itineraries'
        ).filter(
            is_active=True,
            package_type_id=1,  # Trending
            location__name__iexact="dubai"  # ✅ case-insensitive
        )

        return qs.order_by('-id')

    def list(self, request, *args, **kwargs):
        queryset = self.get_queryset()

        page = self.paginate_queryset(queryset)

        serializer = self.get_serializer(
            page if page is not None else queryset,
            many=True,
            context={"request": request}
        )

        return api_response(
            data=serializer.data,
            pagination=self.get_paginated_response(serializer.data).data if page else None
        )

class PackageEuropeListAPI(ListAPIView):
    serializer_class = PackageSerializer

    def get_queryset(self):
        qs = Package.objects.select_related(
            'holiday', 'location', 'package_type'
        ).prefetch_related(
            'images', 'itineraries'
        ).filter(
            is_active=True,
            package_type_id=1,  # Trending
            location__name__iexact="europe"  # ✅ case-insensitive
        )

        return qs.order_by('-id')

    def list(self, request, *args, **kwargs):
        queryset = self.get_queryset()

        page = self.paginate_queryset(queryset)

        serializer = self.get_serializer(
            page if page is not None else queryset,
            many=True,
            context={"request": request}
        )

        return api_response(
            data=serializer.data,
            pagination=self.get_paginated_response(serializer.data).data if page else None
        )
    

class PackageInquiryCreateAPI(CreateAPIView):
    queryset = PackageInquiry.objects.all()
    serializer_class = PackageInquirySerializer

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)

        if serializer.is_valid():
            serializer.save()

            return api_response(
                data=serializer.data,
                message="Inquiry submitted successfully"
            )

        return api_response(
            data=serializer.errors,
            message="Validation error"
        )


class CruisePackageListAPI(ListAPIView):
    queryset = CruisePackage.objects.all().order_by('-id')
    
    serializer_class = CruisePackageSerializer

    def list(self, request, *args, **kwargs):
        queryset = self.get_queryset()

        page = self.paginate_queryset(queryset)

        if page is not None:
            serializer = self.get_serializer(page, many=True)

            return api_response(
                data=serializer.data,
                pagination=self.paginator
            )

        serializer = self.get_serializer(queryset, many=True)

        return api_response(data=serializer.data)
    
from rest_framework.generics import RetrieveAPIView

class CruisePackageIdAPI(RetrieveAPIView):

    queryset = CruisePackage.objects.all().order_by('-id')

    serializer_class = CruisePackageSerializer

    lookup_field = "id"

    def retrieve(self, request, *args, **kwargs):

        instance = self.get_object()

        serializer = self.get_serializer(instance)

        return api_response(
            data=serializer.data
        )
    
class ContactUsCreateAPI(CreateAPIView):
    queryset = ContactUs.objects.all()
    serializer_class = ContactUsSerializer

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)

        if serializer.is_valid():
            serializer.save()

            return api_response(
                data=serializer.data,
                message="Contact request submitted successfully"
            )

        return api_response(
            success=False,
            errors=serializer.errors
        )
    
class CruisePackageInquiryCreateAPI(CreateAPIView):
    queryset = CruisePackageInquiry.objects.all()
    serializer_class = CruisePackageInquirySerializer

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)

        if serializer.is_valid():
            serializer.save()

            return api_response(
                data=serializer.data,
                message="Cruise inquiry submitted successfully"
            )

        return api_response(
            data=serializer.errors,
            message="Validation error"
        )
    
class PackageContinentDetailAPI(APIView):

    def get(self, request, package_type):
        queryset = Package.objects.filter(package_type=package_type)

        serializer = PackageSerializer(
            queryset,
            many=True,
            context={"request": request}
        )

        return api_response(
            success=True,
            message="Packages fetched successfully",
            data=serializer.data
        )
    
class GalleryListAPI(ListAPIView):
    queryset = Gallery.objects.all().order_by('-id')
    
    serializer_class = GallerySerializer

    def list(self, request, *args, **kwargs):
        queryset = self.get_queryset()

        page = self.paginate_queryset(queryset)

        if page is not None:
            serializer = self.get_serializer(page, many=True)

            return api_response(
                data=serializer.data,
                pagination=self.paginator
            )

        serializer = self.get_serializer(queryset, many=True)

        return api_response(data=serializer.data)   
    
class ReviewListAPI(ListAPIView):
    queryset = Review.objects.all().order_by('-id')
    
    serializer_class = ReviewSerializer

    def list(self, request, *args, **kwargs):
        queryset = self.get_queryset()

        page = self.paginate_queryset(queryset)

        if page is not None:
            serializer = self.get_serializer(page, many=True)

            return api_response(
                data=serializer.data,
                pagination=self.paginator
            )

        serializer = self.get_serializer(queryset, many=True)

        return api_response(data=serializer.data)   