from django import forms
from .models import PackageInquiry,Holiday,PackageItineraryImage,HomeBanner,CruisePackage,CruisePackageImage,Gallery,Review
from tinymce.widgets import TinyMCE
from helpers import apply_form_styling_and_validations

class PackageInquiryForm(forms.ModelForm):

    class Meta:
        model = PackageInquiry
        fields = [

            "full_name",
            "email",
            "phone",
            "destination",
            "travel_date",
            "message"
        ]
        widgets = {
            "travel_date": forms.DateInput(attrs={"type": "date"})
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        apply_form_styling_and_validations(self)

from django import forms
from django.forms import inlineformset_factory

from .models import Package, PackageImage, PackageItinerary


class PackageForm(forms.ModelForm):

    class Meta:
        model = Package
        fields = "__all__"

        widgets = {
            'description': TinyMCE(attrs={
                'cols': 80,
                'rows': 10,
            }),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        # Apply your common styling
        apply_form_styling_and_validations(self)

       
# Gallery Formset
PackageImageFormSet = inlineformset_factory(
    Package,
    PackageImage,
    fields=['image'],
    extra=1,
    can_delete=True,
    validate_min=False
)

# Itinerary Formset
PackageItineraryFormSet = inlineformset_factory(
    Package,
    PackageItinerary,
    fields=[
        'to',
        'day',
        'title',
        'hotel',
        'check_in',
        'check_out',
        'ship_from',
        'description',
        'transfer_type',
        'flight_details',
        'is_private_transfer'
    ],
    extra=1,
    can_delete=True,
    validate_min=False
)

PackageItineraryImageFormSet = inlineformset_factory(
    PackageItinerary,
    PackageItineraryImage,
    fields=['image'],
    extra=1,
    can_delete=True
)

# city/forms.py

from django import forms
from .models import City,SocialMedia,Packagetype

from helpers import apply_form_styling_and_validations


class CityForm(forms.ModelForm):

    class Meta:
        model = City
        fields = ["name", "image"]

    def clean_name(self):
        name = self.cleaned_data["name"].strip()
        qs = City.objects.filter(name__iexact=name)

        if self.instance.pk:
            qs = qs.exclude(pk=self.instance.pk)

        if qs.exists():
            raise forms.ValidationError("This city already exists.")

        return name

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        apply_form_styling_and_validations(self)

class PackagetypeForm(forms.ModelForm):

    class Meta:
        model = Packagetype
        fields = ["name",'image']

    def clean_name(self):
        name = self.cleaned_data["name"].strip()
        qs = Packagetype.objects.filter(name__iexact=name)

        if self.instance.pk:
            qs = qs.exclude(pk=self.instance.pk)

        if qs.exists():
            raise forms.ValidationError("This Packagetype already exists.")

        return name

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        apply_form_styling_and_validations(self)

        

class HolidayForm(forms.ModelForm):

    class Meta:
        model = Holiday
        fields = ["name", "image"]

    def clean_name(self):
        name = self.cleaned_data["name"].strip()
        qs = Holiday.objects.filter(name__iexact=name)

        if self.instance.pk:
            qs = qs.exclude(pk=self.instance.pk)

        if qs.exists():
            raise forms.ValidationError("This Holiday already exists.")

        return name

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        apply_form_styling_and_validations(self)



class SocialMediaForm(forms.ModelForm):

    class Meta:
        model = SocialMedia
        fields = ["name"]

    def clean_name(self):
        name = self.cleaned_data["name"].strip()
        qs = SocialMedia.objects.filter(name__iexact=name)

        if self.instance.pk:
            qs = qs.exclude(pk=self.instance.pk)

        if qs.exists():
            raise forms.ValidationError("This Social Media already exists.")

        return name

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        apply_form_styling_and_validations(self)

class BannerForm(forms.ModelForm):

    class Meta:
        model = HomeBanner
        fields = ["name", "image","tagline"]

    def clean_name(self):
        city = self.cleaned_data.get("name")

        qs = HomeBanner.objects.filter(name=city)

        if self.instance.pk:
            qs = qs.exclude(pk=self.instance.pk)

        if qs.exists():
            raise forms.ValidationError("Banner for this city already exists.")

        return city

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        apply_form_styling_and_validations(self)

class CruisePackageForm(forms.ModelForm):
    class Meta:
        model = CruisePackage
        fields = "__all__"

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        for field_name, field in self.fields.items():
            if isinstance(field.widget, forms.Textarea):
                field.widget = TinyMCE(attrs={
                    'cols': 80,
                    'rows': 6,
                })

from django.forms import inlineformset_factory
from .models import CruisePackage, CruiseItinerary

CruisePackageImageFormSet = inlineformset_factory(
    CruisePackage,
    CruisePackageImage,
    fields=("image",),
    extra=1,
    can_delete=True
)

class CruiseItineraryForm(forms.ModelForm):
    class Meta:
        model = CruiseItinerary
        fields = "__all__"

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        for field_name, field in self.fields.items():
            if isinstance(field.widget, forms.Textarea):
                field.widget = TinyMCE(attrs={
                    'cols': 80,
                    'rows': 4,
                })


CruiseItineraryFormSet = inlineformset_factory(
    CruisePackage,
    CruiseItinerary,
    form=CruiseItineraryForm,   # 🔥 THIS IS IMPORTANT
    fields=("title","day","place","time_from","time_to","ship_from","to","description","transfer_type"),
    extra=1,
    can_delete=True
)

class GalleryForm(forms.ModelForm):

    class Meta:
        model = Gallery
        fields = [ "image"]

    def clean_name(self):
        name = self.cleaned_data["name"].strip()
        qs = Gallery.objects.filter()

        if self.instance.pk:
            qs = qs.exclude(pk=self.instance.pk)

        if qs.exists():
            raise forms.ValidationError("This city already exists.")

        return name

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        apply_form_styling_and_validations(self) 


class ReviewForm(forms.ModelForm):

    class Meta:
        model = Review
        fields = [ "image"]

    def clean_name(self):
        name = self.cleaned_data["name"].strip()
        qs = Review.objects.filter()

        if self.instance.pk:
            qs = qs.exclude(pk=self.instance.pk)

        if qs.exists():
            raise forms.ValidationError("This city already exists.")

        return name

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        apply_form_styling_and_validations(self) 


class ReviewForm(forms.ModelForm):
    class Meta:
        model = Review
        fields = ['name', 'city', 'review', 'image']