from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy
from django.views.generic import ListView, CreateView, UpdateView, DeleteView

from master.models import City , Holiday , SocialMedia ,HomeBanner,CruisePackageInquiry,Gallery,Review # Adjust path if needed


# -------------------- Enquiry Management --------------------

from django.views.generic import ListView
from django.db.models import Q
from .forms import BannerForm
from helpers import PaginatedListView

class CityListView(LoginRequiredMixin, PaginatedListView):
   
    model = City
    template_name = 'city/city_list.html'
    context_object_name = 'cities'

    def get_queryset(self):

        qs = City.objects.all().order_by("-id")

        name = self.request.GET.get("name", "").strip()
        

        if name:
            qs = qs.filter(name__icontains=name)

        return qs
  
from django.contrib import messages
from django.urls import reverse_lazy
from django.views.generic import CreateView
from django.contrib.auth.mixins import LoginRequiredMixin

from .models import City , SocialMedia
from .forms import CityForm , SocialMediaForm ,HolidayForm,PackageItineraryImageFormSet# 👈 import form


class CityCreateView(LoginRequiredMixin, CreateView):
    model = City
    form_class = CityForm
    template_name = 'city/city_form.html'
    success_url = reverse_lazy('master:city_list')

    def form_valid(self, form):
        messages.success(self.request, "✅ City submitted successfully!")
        return super().form_valid(form)


class CityUpdateView(LoginRequiredMixin, UpdateView):
    model = City
    form_class = CityForm
    template_name = 'city/city_form.html'
    success_url = reverse_lazy('master:city_list')

    def form_valid(self, form):
        messages.success(self.request, "✏️ City updated successfully!")
        return super().form_valid(form)

class CityDeleteView(LoginRequiredMixin, DeleteView):
    model = City
    template_name = 'city/city_confirm_delete.html'
    success_url = reverse_lazy('master:city_list')


    def delete(self, request, *args, **kwargs):
        messages.warning(request, "🗑️ City deleted successfully!")
        return super().delete(request, *args, **kwargs)
    

from django.views.generic import ListView
from django.db.models import Q
from .forms import BannerForm
from helpers import PaginatedListView
from .models import City , SocialMedia,Packagetype

class PackagetypeListView(LoginRequiredMixin, PaginatedListView):
   
    model = Packagetype
    template_name = 'packagetype/packageType_list.html'
    context_object_name = 'packagetype'

    def get_queryset(self):

        qs = Packagetype.objects.all().order_by("-id")
        
        name = self.request.GET.get("name", "").strip()
        

        if name:
            qs = qs.filter(name__icontains=name)

        return qs
  
from django.contrib import messages
from django.urls import reverse_lazy
from django.views.generic import CreateView
from django.contrib.auth.mixins import LoginRequiredMixin


from .forms import CityForm , SocialMediaForm ,HolidayForm,PackagetypeForm,PackageItineraryImageFormSet# 👈 import form


class PackagetypeCreateView(LoginRequiredMixin, CreateView):
    model = Packagetype
    form_class = PackagetypeForm
    template_name = 'packagetype/packagetype_form.html'
    success_url = reverse_lazy('master:packageType_list')

    def form_valid(self, form):
        messages.success(self.request, "✅ Packagetype submitted successfully!")
        return super().form_valid(form)


class PackagetypeUpdateView(LoginRequiredMixin, UpdateView):
    model = Packagetype
    form_class = PackagetypeForm
    template_name = 'packagetype/packagetype_form.html'
    success_url = reverse_lazy('master:packageType_list')

    def form_valid(self, form):
        messages.success(self.request, "✏️ Packagetype updated successfully!")
        return super().form_valid(form)

class PackagetypeDeleteView(LoginRequiredMixin, DeleteView):
    model = Packagetype
    template_name = 'packagetype/packagetype_confirm_delete.html'
    success_url = reverse_lazy('master:packageType_list')


    def delete(self, request, *args, **kwargs):
        messages.warning(request, "🗑️ Packagetype deleted successfully!")
        return super().delete(request, *args, **kwargs)




from django.views.generic import ListView, CreateView, UpdateView, DeleteView
from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy
from django.contrib import messages
from django.db.models import Q



from .models import Package


class PackageListView(PaginatedListView):

    model = Package
    template_name = 'packages/package_list.html'
    context_object_name = 'packages'
  

    def get_queryset(self):

        queryset = super().get_queryset()

        title = self.request.GET.get("title")

        if title:
            queryset = queryset.filter(title__icontains=title)

        return queryset
    
from django.views.generic import CreateView, UpdateView
from django.shortcuts import redirect

from .models import Package,PackageItineraryImage
from .forms import (
    PackageForm,
    PackageImageFormSet,
    PackageItineraryFormSet
)

class PackageCreateView(CreateView):

    model = Package
    form_class = PackageForm
    template_name = "packages/package_form.html"
    success_url = "/master/package/"

    def get_context_data(self, **kwargs):

        context = super().get_context_data(**kwargs)

        if self.request.POST:

            context['image_formset'] = PackageImageFormSet(
                self.request.POST,
                self.request.FILES
            )

            context['itinerary_formset'] = PackageItineraryFormSet(
                self.request.POST
            )

            # ✅ ADD THIS (VERY IMPORTANT)
            context['itinerary_image_formsets'] = []

            for i, form in enumerate(context['itinerary_formset']):
                prefix = f'itinerary_images-{i}'

                formset = PackageItineraryImageFormSet(
                    self.request.POST,
                    self.request.FILES,
                    prefix=prefix
                )

                context['itinerary_image_formsets'].append(formset)

        else:

            context['image_formset'] = PackageImageFormSet()
            context['itinerary_formset'] = PackageItineraryFormSet()

            # ✅ ADD THIS
            context['itinerary_image_formsets'] = []

            for i, form in enumerate(context['itinerary_formset']):
                prefix = f'itinerary_images-{i}'

                formset = PackageItineraryImageFormSet(
                    prefix=prefix
                )

                context['itinerary_image_formsets'].append(formset)

        return context


    def form_valid(self, form):

        context = self.get_context_data()

        image_formset = context['image_formset']
        itinerary_formset = context['itinerary_formset']
        itinerary_image_formsets = context['itinerary_image_formsets']

        if (image_formset.is_valid() and
            itinerary_formset.is_valid() and
            all(fs.is_valid() for fs in itinerary_image_formsets)):

            # ✅ Save main package
            self.object = form.save()

            # ✅ Save gallery
            image_formset.instance = self.object
            image_formset.save()

            # ✅ FIXED LOGIC (same as update)
            forms = itinerary_formset.forms

            for i, form in enumerate(forms):

                if not form.cleaned_data or form.cleaned_data.get("DELETE"):
                    continue

                itinerary = form.save(commit=False)
                itinerary.package = self.object
                itinerary.save()

                # ✅ Save itinerary images (FORMSET WAY)
                formset = itinerary_image_formsets[i]
                formset.instance = itinerary
                formset.save()

            return redirect(self.success_url)

        return self.form_invalid(form)



# UPDATE
class PackageUpdateView(UpdateView):

    model = Package
    form_class = PackageForm
    template_name = "packages/package_form.html"
    success_url = "/master/package/"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        print(context,'ver alala')
        if self.request.POST:
            context['image_formset'] = PackageImageFormSet(
                self.request.POST,
                self.request.FILES,
                instance=self.object
            )

            context['itinerary_formset'] = PackageItineraryFormSet(
                self.request.POST,
                instance=self.object
            )

            context['itinerary_image_formsets'] = []

            for i, form in enumerate(context['itinerary_formset']):
                prefix = f'itinerary_images_{i}'

                formset = PackageItineraryImageFormSet(
                    self.request.POST,
                    self.request.FILES,
                    instance=form.instance,
                    prefix=prefix
                )

                context['itinerary_image_formsets'].append(formset)

        else:
            context['image_formset'] = PackageImageFormSet(instance=self.object)

            context['itinerary_formset'] = PackageItineraryFormSet(
                instance=self.object
            )

            context['itinerary_image_formsets'] = []

            for i, form in enumerate(context['itinerary_formset']):
                prefix = f'itinerary_images_{i}'

                formset = PackageItineraryImageFormSet(
                    instance=form.instance,
                    prefix=prefix
                )

                context['itinerary_image_formsets'].append(formset)

        return context


    def form_valid(self, form):

        context = self.get_context_data()

        image_formset = context['image_formset']
        itinerary_formset = context['itinerary_formset']
        itinerary_image_formsets = context['itinerary_image_formsets']

        if (image_formset.is_valid() and
            itinerary_formset.is_valid() and
            all(fs.is_valid() for fs in itinerary_image_formsets)):

            self.object = form.save()

            image_formset.instance = self.object
            image_formset.save()

            forms = itinerary_formset.forms   # ✅ FIX HERE

            for i, form in enumerate(forms):

                if not form.cleaned_data or form.cleaned_data.get("DELETE"):
                    continue

                itinerary = form.save(commit=False)
                itinerary.package = self.object
                itinerary.save()

                # ✅ correct mapping
                formset = itinerary_image_formsets[i]
                formset.instance = itinerary
                formset.save()

            return redirect(self.success_url)

        return self.form_invalid(form)
    
class PackageDeleteView(LoginRequiredMixin, DeleteView):

    model = Package

    template_name = "packages/package_confirm_delete.html"

    success_url = reverse_lazy("master:package_list")


    def delete(self, request, *args, **kwargs):

        messages.warning(
            request,
            "🗑️ Package deleted successfully!"
        )

        return super().delete(request, *args, **kwargs)

#Holiday
from helpers import PaginatedListView
class HolidayListView(LoginRequiredMixin, PaginatedListView):
        model = Holiday
        template_name = 'holiday/holiday_list.html'
        context_object_name = 'holidays'


        def get_queryset(self):

            qs = Holiday.objects.all().order_by("-id")

            name = self.request.GET.get("name", "").strip()
            

            if name:
                qs = qs.filter(name__icontains=name)

            return qs
        


class HolidayCreateView(LoginRequiredMixin, CreateView):
    model = Holiday
    form_class = HolidayForm
    template_name = 'holiday/holiday_form.html'
    success_url = reverse_lazy('master:holiday_list')

    def form_valid(self, form):
        messages.success(self.request, "✅ Holiday submitted successfully!")
        return super().form_valid(form)


class HolidayUpdateView(LoginRequiredMixin, UpdateView):
    model = Holiday
    form_class = HolidayForm
    template_name = 'holiday/holiday_form.html'
    success_url = reverse_lazy('master:holiday_list')

    def form_valid(self, form):
        messages.success(self.request, "✏️ Holiday updated successfully!")
        return super().form_valid(form)


class HolidayDeleteView(LoginRequiredMixin, DeleteView):
    model = Holiday
    template_name = 'holiday/holiday_confirm_delete.html'
    success_url = reverse_lazy('master:holiday_list')


    def delete(self, request, *args, **kwargs):
        messages.warning(request, "🗑️ holiday deleted successfully!")
        return super().delete(request, *args, **kwargs)


#Social Media

class SocialMediaListView(LoginRequiredMixin, PaginatedListView):
   
    model = SocialMedia
    template_name = 'social_media/socialMedia_list.html'
    context_object_name = 'socialMedia'

    def get_queryset(self):

        qs = SocialMedia.objects.all().order_by("-id")

        name = self.request.GET.get("name", "").strip()
        

        if name:
            qs = qs.filter(name__icontains=name)

        return qs
    

class SocialMediaCreateView(LoginRequiredMixin, CreateView):
    model = SocialMedia
    form_class = SocialMediaForm      # 👈 use custom form
    template_name = 'social_media/socialMedia_form.html'
    success_url = reverse_lazy('master:SocialMedia_list')

    def form_valid(self, form):
       
        messages.success(self.request, "✅ SocialMedia submitted successfully!")
        return super().form_valid(form)


class SocialMediaUpdateView(LoginRequiredMixin, UpdateView):
    model = SocialMedia
    fields = ['name']
    template_name = 'social_media/socialMedia_form.html'
    success_url = reverse_lazy('master:SocialMedia_list')

    def form_valid(self, form):
        messages.success(self.request, "✏️ SocialMedia updated successfully!")
        return super().form_valid(form)


class SocialMediaDeleteView(LoginRequiredMixin, DeleteView):
    model = SocialMedia
    template_name = 'social_media/socialMedia_confirm_delete.html'
    success_url = reverse_lazy('master:SocialMedia_list')


    def delete(self, request, *args, **kwargs):
        messages.warning(request, "🗑️ SocialMedia deleted successfully!")
        return super().delete(request, *args, **kwargs)


class BannerListView(LoginRequiredMixin, PaginatedListView):
   
    model = HomeBanner
    template_name = 'banner/banner_list.html'
    context_object_name = 'cities'

    def get_queryset(self):

        qs = HomeBanner.objects.all().order_by("-id")

        name = self.request.GET.get("name", "").strip()
        

        if name:
            qs = qs.filter(name__icontains=name)

        return qs
  
from django.contrib import messages
from django.urls import reverse_lazy
from django.views.generic import CreateView
from django.contrib.auth.mixins import LoginRequiredMixin

from .models import City , SocialMedia
from .forms import CityForm , SocialMediaForm ,HolidayForm,PackageItineraryImageFormSet# 👈 import form


class BannerCreateView(LoginRequiredMixin, CreateView):
    model = HomeBanner
    form_class = BannerForm
    template_name = 'banner/banner_form.html'
    success_url = reverse_lazy('master:banner_list')

    def form_valid(self, form):
        messages.success(self.request, "✅ Banner submitted successfully!")
        return super().form_valid(form)


class BannerUpdateView(LoginRequiredMixin, UpdateView):
    model = HomeBanner
    form_class = BannerForm
    template_name = 'banner/banner_form.html'
    success_url = reverse_lazy('master:banner_list')

    def form_valid(self, form):
        messages.success(self.request, "✏️ Banner updated successfully!")
        return super().form_valid(form)

class BannerDeleteView(LoginRequiredMixin, DeleteView):
    model = HomeBanner
    template_name = 'banner/banner_confirm_delete.html'
    success_url = reverse_lazy('master:banner_list')


    def delete(self, request, *args, **kwargs):
        messages.warning(request, "🗑️ Banner deleted successfully!")
        return super().delete(request, *args, **kwargs)
    


from django.contrib.auth.mixins import LoginRequiredMixin
from .models import CruisePackage

class CruisePackageListView(LoginRequiredMixin, PaginatedListView):

    model = CruisePackage
    template_name = "cruise_package/cruise_package_list.html"
    context_object_name = "cruise_packages"

    def get_queryset(self):

        qs = CruisePackage.objects.all().order_by("-id")

        title = self.request.GET.get("title", "").strip()

        if title:
            qs = qs.filter(title__icontains=title)

        return qs
    
from django.contrib import messages
from django.urls import reverse_lazy
from django.views.generic import CreateView
from django.shortcuts import redirect
from .forms import CruisePackageForm, CruiseItineraryFormSet, CruisePackageImageFormSet

class CruisePackageCreateView(LoginRequiredMixin, CreateView):

    model = CruisePackage
    form_class = CruisePackageForm
    template_name = "cruise_package/cruise_package_form.html"
    success_url = reverse_lazy("master:cruise_package_list")

    def get_context_data(self, **kwargs):

        data = super().get_context_data(**kwargs)

        if self.request.POST:
            data["itinerary_formset"] = CruiseItineraryFormSet(
                self.request.POST,
                prefix="itineraries"
            )

            data["image_formset"] = CruisePackageImageFormSet(
                self.request.POST,
                self.request.FILES,
                prefix="images"
            )

        else:
            data["itinerary_formset"] = CruiseItineraryFormSet(prefix="itineraries")
            data["image_formset"] = CruisePackageImageFormSet(prefix="images")

        return data


    def form_valid(self, form):

        context = self.get_context_data()

        itinerary_formset = context["itinerary_formset"]
        image_formset = context["image_formset"]

        self.object = form.save()

        if itinerary_formset.is_valid() and image_formset.is_valid():

            itineraries = itinerary_formset.save(commit=False)

            for itinerary in itineraries:
                itinerary.cruise_package = self.object
                itinerary.save()

            images = image_formset.save(commit=False)

            for image in images:
                image.cruise_package = self.object
                image.save()

            messages.success(self.request, "✅ Cruise Package created successfully!")

            return redirect(self.success_url)

        return self.render_to_response(self.get_context_data(form=form))
    
from django.views.generic import UpdateView


class CruisePackageUpdateView(LoginRequiredMixin, UpdateView):

    model = CruisePackage
    form_class = CruisePackageForm
    template_name = "cruise_package/cruise_package_form.html"
    success_url = reverse_lazy("master:cruise_package_list")

    def get_context_data(self, **kwargs):

        data = super().get_context_data(**kwargs)

        if self.request.POST:

            data["itinerary_formset"] = CruiseItineraryFormSet(
                self.request.POST,
                instance=self.object,
                prefix="itineraries"
            )

            data["image_formset"] = CruisePackageImageFormSet(
                self.request.POST,
                self.request.FILES,
                instance=self.object,
                prefix="images"
            )

        else:

            data["itinerary_formset"] = CruiseItineraryFormSet(
                instance=self.object,
                prefix="itineraries"
            )

            data["image_formset"] = CruisePackageImageFormSet(
                instance=self.object,
                prefix="images"
            )

        return data


    def form_valid(self, form):

        context = self.get_context_data()

        itinerary_formset = context["itinerary_formset"]
        image_formset = context["image_formset"]

        self.object = form.save()

        if itinerary_formset.is_valid() and image_formset.is_valid():

            itineraries = itinerary_formset.save(commit=False)

            for itinerary in itineraries:
                itinerary.cruise_package = self.object
                itinerary.save()

            images = image_formset.save(commit=False)

            for image in images:
                image.cruise_package = self.object
                image.save()

            messages.success(self.request, "✏️ Cruise Package updated successfully!")

            return redirect(self.success_url)

        return self.render_to_response(self.get_context_data(form=form))
        
from django.views.generic import DeleteView


class CruisePackageDeleteView(LoginRequiredMixin, DeleteView):

    model = CruisePackage
    template_name = "cruise_package/cruise_package_confirm_delete.html"
    success_url = reverse_lazy("master:cruise_package_list")

    def delete(self, request, *args, **kwargs):
        messages.warning(request, "🗑️ Cruise Package deleted successfully!")
        return super().delete(request, *args, **kwargs)
    

class CruiseEnquiryListView(LoginRequiredMixin, PaginatedListView):
   
    model = CruisePackageInquiry
    template_name = 'cruise_enquiry/cruise_list.html'
    context_object_name = 'cities'

    def get_queryset(self):

        qs = CruisePackageInquiry.objects.all().order_by("-id")

        name = self.request.GET.get("name", "").strip()
        

        if name:
            qs = qs.filter(name__icontains=name)

        return qs
    
class CruiseEnquiryDeleteView(LoginRequiredMixin, DeleteView):
    model = CruisePackageInquiry
    template_name = 'cruise_enquiry/cruise_package_confirm_delete.html'
    success_url = reverse_lazy('master:cruise_list')


    def delete(self, request, *args, **kwargs):
        messages.warning(request, "🗑️ Cruise Enquiry deleted successfully!")
        return super().delete(request, *args, **kwargs)
    
class GalleryListView(LoginRequiredMixin, PaginatedListView):
   
    model = Gallery
    template_name = 'gallery/gallery_list.html'
    context_object_name = 'cities'

    def get_queryset(self):

        qs = Gallery.objects.all().order_by("-id")

        return qs
  
from django.contrib import messages
from django.urls import reverse_lazy
from django.views.generic import CreateView
from django.contrib.auth.mixins import LoginRequiredMixin

from .models import City , SocialMedia
from .forms import CityForm , ReviewForm,SocialMediaForm ,HolidayForm,PackageItineraryImageFormSet,GalleryForm   # 👈 import form


class GalleryCreateView(LoginRequiredMixin, CreateView):
    model = Gallery
    form_class = GalleryForm
    template_name = 'gallery/gallery_form.html'
    success_url = reverse_lazy('master:gallery_list')

    def form_valid(self, form):
        messages.success(self.request, "✅ gallery submitted successfully!")
        return super().form_valid(form)


class GalleryUpdateView(LoginRequiredMixin, UpdateView):
    model = Gallery
    form_class = GalleryForm
    template_name = 'gallery/gallery_form.html'
    success_url = reverse_lazy('master:gallery_list')

    def form_valid(self, form):
        messages.success(self.request, "✏️ gallery updated successfully!")
        return super().form_valid(form)

class GalleryDeleteView(LoginRequiredMixin, DeleteView):
    model = Gallery
    template_name = 'gallery/gallery_confirm_delete.html'
    success_url = reverse_lazy('master:gallery_list')


    def delete(self, request, *args, **kwargs):
        messages.warning(request, "🗑️ gallery deleted successfully!")
        return super().delete(request, *args, **kwargs)
    
class ReviewCreateView(LoginRequiredMixin, CreateView):
    model = Review
    form_class = ReviewForm
    template_name = 'review/review_form.html'
    success_url = reverse_lazy('master:review_list')

    def form_valid(self, form):
        messages.success(self.request, "✅ review submitted successfully!")
        return super().form_valid(form)


class ReviewUpdateView(LoginRequiredMixin, UpdateView):
    model = Review
    form_class = ReviewForm
    template_name = 'review/review_form.html'
    success_url = reverse_lazy('master:review_list')

    def form_valid(self, form):
        messages.success(self.request, "✏️ review updated successfully!")
        return super().form_valid(form)

class ReviewDeleteView(LoginRequiredMixin, DeleteView):
    model = Review
    template_name = 'review/review_confirm_delete.html'
    success_url = reverse_lazy('master:review_list')


    def delete(self, request, *args, **kwargs):
        messages.warning(request, "🗑️ review deleted successfully!")
        return super().delete(request, *args, **kwargs)
    

class ReviewListView(LoginRequiredMixin, PaginatedListView):
   
    model = Review
    template_name = 'review/review_list.html'
    context_object_name = 'cities'

    def get_queryset(self):

        qs = Review.objects.all().order_by("-id")

        name = self.request.GET.get("name", "").strip()
        

        if name:
            qs = qs.filter(name__icontains=name)

        return qs