# Generated by Django 5.2.11 on 2026-05-20 12:14

import django.core.validators
import django.db.models.deletion
import hosting_app.models
from decimal import Decimal
from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ('expat_life', '0039_alter_refundabledeposit_profile_type_and_more'),
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.CreateModel(
            name='HostAddOnService',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('title', models.CharField(max_length=255)),
                ('description', models.TextField()),
                ('add_on_image', models.ImageField(blank=True, help_text='Optional add-on image. Allowed: JPG, JPEG, PNG, WEBP. Max size: 4 MB.', null=True, upload_to='hosting_app/add_on_service_images/', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['jpg', 'jpeg', 'png', 'webp']), hosting_app.models.validate_add_on_service_image_size, hosting_app.models.validate_add_on_service_image_content])),
                ('pricing_type', models.CharField(choices=[('fixed', 'Fixed Price'), ('per_person', 'Per Person'), ('starting_from', 'Starting From')], default='fixed', max_length=30)),
                ('price_usd', models.DecimalField(decimal_places=2, max_digits=12)),
                ('is_active', models.BooleanField(default=True)),
                ('is_featured', models.BooleanField(default=False)),
                ('listing_status', models.CharField(choices=[('draft', 'Draft'), ('pending_review', 'Pending Review'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('hidden', 'Hidden')], default='draft', max_length=30)),
                ('admin_review_note', models.TextField(blank=True)),
                ('approved_at', models.DateTimeField(blank=True, null=True)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
            ],
            options={
                'ordering': ['-is_featured', 'title'],
            },
        ),
        migrations.CreateModel(
            name='HostEventPackage',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('title', models.CharField(max_length=255)),
                ('slug', models.SlugField(blank=True, max_length=240, unique=True)),
                ('event_type', models.CharField(choices=[('romantic_date', 'Romantic Date'), ('proposal_event', 'Proposal Event'), ('anniversary', 'Anniversary Celebration'), ('birthday', 'Birthday Celebration'), ('honeymoon', 'Honeymoon Experience'), ('private_dinner', 'Private Dinner'), ('engagement', 'Engagement Event'), ('small_wedding', 'Small Wedding'), ('custom_celebration', 'Custom Celebration')], max_length=50)),
                ('short_description', models.CharField(max_length=300)),
                ('full_description', models.TextField()),
                ('package_image', models.ImageField(blank=True, help_text='Optional package image. Allowed: JPG, JPEG, PNG, WEBP. Max size: 5 MB.', null=True, upload_to='hosting_app/package_images/', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['jpg', 'jpeg', 'png', 'webp']), hosting_app.models.validate_event_package_image_size, hosting_app.models.validate_event_package_image_content])),
                ('duration_hours', models.DecimalField(decimal_places=2, default=Decimal('2.00'), help_text='Example: 2.50 means two and a half hours.', max_digits=5)),
                ('base_price_usd', models.DecimalField(decimal_places=2, max_digits=12)),
                ('max_people_included', models.PositiveIntegerField(default=2)),
                ('extra_person_price_usd', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=12)),
                ('includes_meals', models.BooleanField(default=False)),
                ('includes_decoration', models.BooleanField(default=False)),
                ('includes_photography', models.BooleanField(default=False)),
                ('includes_music', models.BooleanField(default=False)),
                ('is_customizable', models.BooleanField(default=True)),
                ('inclusions_summary', models.TextField(blank=True, help_text='Short package inclusion summary. Detailed inclusions can be added below.')),
                ('exclusions_summary', models.TextField(blank=True, help_text='What is not included in the package.')),
                ('pricing_note', models.TextField(blank=True, help_text='Example: Meals priced separately, subject to availability, seasonal price variation, etc.')),
                ('listing_status', models.CharField(choices=[('draft', 'Draft'), ('pending_review', 'Pending Review'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('hidden', 'Hidden')], default='draft', max_length=30)),
                ('is_active', models.BooleanField(default=True)),
                ('is_featured', models.BooleanField(default=False)),
                ('admin_review_note', models.TextField(blank=True)),
                ('approved_at', models.DateTimeField(blank=True, null=True)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
            ],
            options={
                'ordering': ['-is_featured', '-created_at'],
            },
        ),
        migrations.CreateModel(
            name='HostMealPlan',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('title', models.CharField(max_length=255)),
                ('description', models.TextField()),
                ('meal_image', models.ImageField(blank=True, help_text='Optional meal plan image. Allowed: JPG, JPEG, PNG, WEBP. Max size: 5 MB.', null=True, upload_to='hosting_app/meal_plan_images/', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['jpg', 'jpeg', 'png', 'webp']), hosting_app.models.validate_meal_plan_image_size, hosting_app.models.validate_meal_plan_image_content])),
                ('price_per_person_usd', models.DecimalField(decimal_places=2, max_digits=12)),
                ('minimum_people', models.PositiveIntegerField(default=2)),
                ('is_active', models.BooleanField(default=True)),
                ('is_featured', models.BooleanField(default=False)),
                ('listing_status', models.CharField(choices=[('draft', 'Draft'), ('pending_review', 'Pending Review'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('hidden', 'Hidden')], default='draft', max_length=30)),
                ('admin_review_note', models.TextField(blank=True)),
                ('approved_at', models.DateTimeField(blank=True, null=True)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
            ],
            options={
                'ordering': ['-is_featured', 'title'],
            },
        ),
        migrations.CreateModel(
            name='HostBookingRequest',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('event_type', models.CharField(choices=[('romantic_date', 'Romantic Date'), ('proposal_event', 'Proposal Event'), ('anniversary', 'Anniversary Celebration'), ('birthday', 'Birthday Celebration'), ('honeymoon', 'Honeymoon Experience'), ('private_dinner', 'Private Dinner'), ('engagement', 'Engagement Event'), ('small_wedding', 'Small Wedding'), ('custom_celebration', 'Custom Celebration')], max_length=50)),
                ('preferred_event_date', models.DateField()),
                ('preferred_start_time', models.TimeField(blank=True, null=True)),
                ('expected_duration_hours', models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True)),
                ('number_of_guests', models.PositiveIntegerField(default=2)),
                ('occasion_title', models.CharField(blank=True, help_text='Example: Surprise proposal for my partner, anniversary dinner, birthday celebration.', max_length=255)),
                ('occasion_note', models.TextField(blank=True, help_text='Any personal details that help Ensolanka understand the intended experience.')),
                ('special_requests', models.TextField(blank=True)),
                ('status', models.CharField(choices=[('submitted', 'Submitted'), ('under_review', 'Under Review'), ('waiting_host_confirmation', 'Waiting for Host Confirmation'), ('quotation_ready', 'Quotation Ready'), ('guest_confirmed', 'Guest Confirmed'), ('payment_due', 'Payment Due'), ('paid', 'Paid'), ('arranging', 'Arranging'), ('completed', 'Completed'), ('cancelled', 'Cancelled'), ('rejected', 'Rejected')], default='submitted', max_length=40)),
                ('admin_review_note', models.TextField(blank=True)),
                ('host_coordination_note', models.TextField(blank=True)),
                ('submitted_at', models.DateTimeField(auto_now_add=True)),
                ('guest_confirmed_at', models.DateTimeField(blank=True, null=True)),
                ('paid_at', models.DateTimeField(blank=True, null=True)),
                ('completed_at', models.DateTimeField(blank=True, null=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('guest_profile', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='hosting_booking_requests', to='expat_life.foreignerprofile')),
                ('selected_package', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='booking_requests', to='hosting_app.hosteventpackage')),
                ('selected_meal_plan', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='booking_requests', to='hosting_app.hostmealplan')),
            ],
            options={
                'ordering': ['-submitted_at'],
            },
        ),
        migrations.CreateModel(
            name='HostBookingQuotation',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('package_amount_usd', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=12)),
                ('meal_amount_usd', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=12)),
                ('add_on_amount_usd', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=12)),
                ('manual_adjustment_usd', models.DecimalField(decimal_places=2, default=Decimal('0.00'), help_text='Use positive or negative adjustment where staff finalize a custom agreed amount.', max_digits=12)),
                ('final_guest_payable_amount_usd', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=12)),
                ('commission_rate_percent', models.DecimalField(decimal_places=2, default=Decimal('10.00'), max_digits=5)),
                ('ensolanka_commission_usd', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=12)),
                ('host_net_amount_usd', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=12)),
                ('payment_due_date', models.DateField(blank=True, null=True)),
                ('quotation_note_to_guest', models.TextField(blank=True)),
                ('internal_note', models.TextField(blank=True)),
                ('status', models.CharField(choices=[('draft', 'Draft'), ('sent_to_guest', 'Sent to Guest'), ('accepted', 'Accepted'), ('expired', 'Expired'), ('cancelled', 'Cancelled')], default='draft', max_length=30)),
                ('sent_to_guest_at', models.DateTimeField(blank=True, null=True)),
                ('accepted_at', models.DateTimeField(blank=True, null=True)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('prepared_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='prepared_hosting_quotations', to=settings.AUTH_USER_MODEL)),
                ('booking_request', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='quotations', to='hosting_app.hostbookingrequest')),
            ],
            options={
                'ordering': ['-created_at'],
            },
        ),
        migrations.CreateModel(
            name='HostBookingRequestAddOn',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('add_on_title_snapshot', models.CharField(max_length=255)),
                ('quantity', models.PositiveIntegerField(default=1)),
                ('unit_price_snapshot_usd', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=12)),
                ('subtotal_snapshot_usd', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=12)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('add_on_service', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='booking_request_items', to='hosting_app.hostaddonservice')),
                ('booking_request', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='selected_add_ons', to='hosting_app.hostbookingrequest')),
            ],
            options={
                'ordering': ['id'],
            },
        ),
        migrations.CreateModel(
            name='HostPackageInclusion',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('inclusion_text', models.CharField(max_length=255)),
                ('display_order', models.PositiveIntegerField(default=0)),
                ('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='detailed_inclusions', to='hosting_app.hosteventpackage')),
            ],
            options={
                'ordering': ['display_order', 'id'],
            },
        ),
        migrations.CreateModel(
            name='HostProfile',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('business_name', models.CharField(max_length=255)),
                ('contact_person_name', models.CharField(max_length=255)),
                ('email', models.EmailField(max_length=254)),
                ('phone_number', models.CharField(max_length=50)),
                ('whatsapp_number', models.CharField(blank=True, max_length=50)),
                ('profile_image', models.ImageField(blank=True, help_text='Optional profile image. Allowed: JPG, JPEG, PNG, WEBP. Max size: 3 MB.', null=True, upload_to='hosting_app/host_profiles/', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['jpg', 'jpeg', 'png', 'webp']), hosting_app.models.validate_profile_image_size, hosting_app.models.validate_profile_image_content])),
                ('short_introduction', models.TextField(blank=True, help_text='Brief introduction about the hosting partner or business.')),
                ('status', models.CharField(choices=[('pending', 'Pending'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('suspended', 'Suspended')], default='pending', max_length=30)),
                ('is_featured', models.BooleanField(default=False)),
                ('is_active', models.BooleanField(default=True)),
                ('admin_review_note', models.TextField(blank=True)),
                ('approved_at', models.DateTimeField(blank=True, null=True)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='host_profile', to=settings.AUTH_USER_MODEL)),
            ],
            options={
                'ordering': ['-created_at'],
            },
        ),
        migrations.CreateModel(
            name='HostVenue',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('venue_name', models.CharField(max_length=255)),
                ('slug', models.SlugField(blank=True, max_length=240, unique=True)),
                ('venue_category', models.CharField(choices=[('restaurant', 'Restaurant'), ('hotel', 'Hotel'), ('motel_budget_hotel', 'Motel / Budget Hotel'), ('resort', 'Resort'), ('villa_private_villa', 'Villa / Private Villa'), ('banquet_party_hall', 'Banquet Hall / Party Hall'), ('cabana_beach_cabana', 'Cabana / Beach Cabana'), ('bar_lounge_pub', 'Bar / Lounge / Pub'), ('rooftop_sky_venue', 'Rooftop / Sky Venue'), ('garden_outdoor_venue', 'Garden / Outdoor Venue'), ('beach_beachfront', 'Beach / Beachfront'), ('lakeside_riverfront', 'Lakeside / Riverfront'), ('spa_wellness_center', 'Spa / Wellness Center'), ('farmhouse_farm_stay', 'Farmhouse / Farm Stay'), ('event_hall_event_space', 'Event Hall / Event Space'), ('boat_river_cruise', 'Boat / River Cruise'), ('temple_heritage_venue', 'Temple / Heritage Venue'), ('botanical_garden_park', 'Botanical Garden / Park'), ('castle_manor', 'Castle / Manor'), ('honeymoon_resort', 'Honeymoon Resort'), ('other', 'Other')], max_length=50)),
                ('short_description', models.CharField(max_length=300)),
                ('full_description', models.TextField()),
                ('district', models.CharField(max_length=120)),
                ('city', models.CharField(max_length=120)),
                ('address', models.TextField(blank=True)),
                ('google_map_link', models.URLField(blank=True)),
                ('cover_image', models.ImageField(blank=True, null=True, upload_to='hosting_app/venue_covers/')),
                ('max_guest_capacity', models.PositiveIntegerField(blank=True, help_text='Maximum number of people the venue can usually host for relevant event arrangements.', null=True)),
                ('supports_romantic_dates', models.BooleanField(default=False)),
                ('supports_proposal_events', models.BooleanField(default=False)),
                ('supports_anniversaries', models.BooleanField(default=False)),
                ('supports_birthdays', models.BooleanField(default=False)),
                ('supports_honeymoon_experiences', models.BooleanField(default=False)),
                ('supports_private_dinners', models.BooleanField(default=False)),
                ('supports_engagement_events', models.BooleanField(default=False)),
                ('supports_small_weddings', models.BooleanField(default=False)),
                ('supports_custom_celebrations', models.BooleanField(default=False)),
                ('meal_service_available', models.BooleanField(default=False)),
                ('alcohol_available', models.BooleanField(default=False)),
                ('decoration_available', models.BooleanField(default=False)),
                ('photography_allowed', models.BooleanField(default=True)),
                ('music_allowed', models.BooleanField(default=True)),
                ('indoor_available', models.BooleanField(default=False)),
                ('outdoor_available', models.BooleanField(default=False)),
                ('private_area_available', models.BooleanField(default=False)),
                ('parking_available', models.BooleanField(default=False)),
                ('important_notes', models.TextField(blank=True, help_text='Any rules, restrictions, advance notice requirements, or practical notes.')),
                ('listing_status', models.CharField(choices=[('draft', 'Draft'), ('pending_review', 'Pending Review'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('hidden', 'Hidden')], default='draft', max_length=30)),
                ('is_public', models.BooleanField(default=False)),
                ('is_featured', models.BooleanField(default=False)),
                ('admin_review_note', models.TextField(blank=True)),
                ('approved_at', models.DateTimeField(blank=True, null=True)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('host_profile', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='venues', to='hosting_app.hostprofile')),
            ],
            options={
                'ordering': ['-is_featured', '-created_at'],
            },
        ),
        migrations.AddField(
            model_name='hostmealplan',
            name='venue',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='meal_plans', to='hosting_app.hostvenue'),
        ),
        migrations.AddField(
            model_name='hosteventpackage',
            name='venue',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='event_packages', to='hosting_app.hostvenue'),
        ),
        migrations.AddField(
            model_name='hostbookingrequest',
            name='venue',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='booking_requests', to='hosting_app.hostvenue'),
        ),
        migrations.AddField(
            model_name='hostaddonservice',
            name='venue',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='add_on_services', to='hosting_app.hostvenue'),
        ),
        migrations.CreateModel(
            name='HostVenueImage',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('image', models.ImageField(help_text='Allowed: JPG, JPEG, PNG, WEBP. Max size: 6 MB.', upload_to='hosting_app/venue_gallery/', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['jpg', 'jpeg', 'png', 'webp']), hosting_app.models.validate_venue_gallery_image_size, hosting_app.models.validate_venue_gallery_image_content])),
                ('caption', models.CharField(blank=True, max_length=255)),
                ('display_order', models.PositiveIntegerField(default=0)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('venue', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='gallery_images', to='hosting_app.hostvenue')),
            ],
            options={
                'ordering': ['display_order', 'id'],
            },
        ),
    ]
