# Generated by Django 5.0.7 on 2026-08-04 17:52

import django.core.validators
import django.db.models.deletion
from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('testing_app', '0010_user_avatar'),
    ]

    operations = [
        migrations.AddField(
            model_name='booking',
            name='cancel_reason_code',
            field=models.CharField(blank=True, max_length=50, null=True),
        ),
        migrations.AddField(
            model_name='booking',
            name='cancellation_fee_amount',
            field=models.DecimalField(decimal_places=2, default=0, max_digits=10),
        ),
        migrations.AddField(
            model_name='booking',
            name='cancelled_by',
            field=models.CharField(blank=True, choices=[('PASSENGER', 'Passenger'), ('OPERATOR', 'Operator'), ('ADMIN', 'Admin'), ('SYSTEM', 'System (expiry)')], max_length=20, null=True),
        ),
        migrations.AddField(
            model_name='booking',
            name='payment_deadline',
            field=models.DateTimeField(blank=True, null=True),
        ),
        migrations.AddField(
            model_name='bus',
            name='amenities',
            field=models.CharField(blank=True, default='', max_length=500),
        ),
        migrations.AddField(
            model_name='bus',
            name='deck_count',
            field=models.IntegerField(default=1),
        ),
        migrations.AddField(
            model_name='bus',
            name='has_seat_map',
            field=models.BooleanField(default=False),
        ),
        migrations.AddField(
            model_name='bus',
            name='seat_cols',
            field=models.IntegerField(blank=True, null=True),
        ),
        migrations.AddField(
            model_name='bus',
            name='seat_rows',
            field=models.IntegerField(blank=True, null=True),
        ),
        migrations.AddField(
            model_name='schedule',
            name='delay_note',
            field=models.CharField(blank=True, max_length=255, null=True),
        ),
        migrations.AddField(
            model_name='schedule',
            name='original_departure_time',
            field=models.DateTimeField(blank=True, null=True),
        ),
        migrations.AddField(
            model_name='user',
            name='token_version',
            field=models.IntegerField(default=0),
        ),
        migrations.AlterField(
            model_name='booking',
            name='booking_status',
            field=models.CharField(choices=[('PENDING', 'Pending'), ('PENDING_PAYMENT', 'Pending Payment'), ('CONFIRMED', 'Confirmed'), ('EXPIRED', 'Expired'), ('CANCELLED', 'Cancelled'), ('REFUNDED', 'Refunded'), ('CHECKED_IN', 'Checked In'), ('COMPLETED', 'Completed')], default='PENDING', max_length=20),
        ),
        migrations.AlterField(
            model_name='schedule',
            name='status',
            field=models.CharField(choices=[('ACTIVE', 'Active'), ('CANCELLED', 'Cancelled'), ('COMPLETED', 'Completed'), ('DELAYED', 'Delayed')], default='ACTIVE', max_length=20),
        ),
        migrations.CreateModel(
            name='BusSeat',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('deck', models.IntegerField(default=1)),
                ('row_number', models.IntegerField()),
                ('col_number', models.IntegerField()),
                ('seat_number', models.CharField(max_length=10)),
                ('seat_type', models.CharField(choices=[('STANDARD', 'Standard'), ('VIP', 'VIP'), ('SLEEPER', 'Sleeper'), ('FEMALE_ONLY', 'Female Only'), ('BLOCKED', 'Blocked (not for sale)')], default='STANDARD', max_length=20)),
                ('is_active', models.BooleanField(default=True)),
                ('bus', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='seats', to='testing_app.bus')),
            ],
            options={
                'db_table': 'bus_seats',
                'ordering': ['deck', 'row_number', 'col_number'],
                'unique_together': {('bus', 'seat_number')},
            },
        ),
        migrations.CreateModel(
            name='BookingSeat',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('passenger_name', models.CharField(blank=True, default='', max_length=150)),
                ('passenger_age', models.IntegerField(blank=True, null=True)),
                ('passenger_gender', models.CharField(blank=True, choices=[('M', 'Male'), ('F', 'Female'), ('O', 'Other')], max_length=1, null=True)),
                ('boarding_point', models.CharField(blank=True, default='', max_length=150)),
                ('dropping_point', models.CharField(blank=True, default='', max_length=150)),
                ('checked_in', models.BooleanField(default=False)),
                ('checked_in_at', models.DateTimeField(blank=True, null=True)),
                ('booking', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='booking_seats', to='testing_app.booking')),
                ('schedule', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='booking_seats', to='testing_app.schedule')),
                ('seat', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='booking_seats', to='testing_app.busseat')),
            ],
            options={
                'db_table': 'booking_seats',
            },
        ),
        migrations.CreateModel(
            name='OperatorDocument',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('doc_type', models.CharField(choices=[('REGISTRATION', 'Business Registration'), ('OWNERSHIP', 'Ownership Document'), ('LICENSE', 'Operating License'), ('TAX', 'Tax Registration'), ('OTHER', 'Other')], default='OTHER', max_length=20)),
                ('file', models.FileField(upload_to='operator_docs/')),
                ('status', models.CharField(choices=[('PENDING', 'Pending Review'), ('VERIFIED', 'Verified'), ('REJECTED', 'Rejected')], default='PENDING', max_length=20)),
                ('review_note', models.CharField(blank=True, max_length=500, null=True)),
                ('reviewed_at', models.DateTimeField(blank=True, null=True)),
                ('uploaded_at', models.DateTimeField(auto_now_add=True)),
                ('operator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='documents', to='testing_app.operator')),
                ('reviewed_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='reviewed_documents', to='testing_app.user')),
            ],
            options={
                'db_table': 'operator_documents',
                'ordering': ['-uploaded_at'],
            },
        ),
        migrations.CreateModel(
            name='Payment',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('gateway', models.CharField(choices=[('ESEWA', 'eSewa')], default='ESEWA', max_length=20)),
                ('transaction_uuid', models.CharField(max_length=100, unique=True)),
                ('amount', models.DecimalField(decimal_places=2, max_digits=10)),
                ('status', models.CharField(choices=[('INITIATED', 'Initiated'), ('PENDING', 'Pending'), ('COMPLETE', 'Complete'), ('FAILED', 'Failed'), ('CANCELED', 'Canceled'), ('FULL_REFUND', 'Full Refund'), ('PARTIAL_REFUND', 'Partial Refund'), ('AMBIGUOUS', 'Ambiguous'), ('NOT_FOUND', 'Not Found')], default='INITIATED', max_length=20)),
                ('ref_id', models.CharField(blank=True, max_length=100, null=True)),
                ('raw_response', models.TextField(blank=True, null=True)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('booking', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='payments', to='testing_app.booking')),
            ],
            options={
                'db_table': 'payments',
                'ordering': ['-created_at'],
            },
        ),
        migrations.CreateModel(
            name='PaymentWebhookLog',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('transaction_uuid', models.CharField(blank=True, default='', max_length=100)),
                ('raw_payload', models.TextField()),
                ('signature_valid', models.BooleanField(default=False)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('payment', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='webhook_logs', to='testing_app.payment')),
            ],
            options={
                'db_table': 'payment_webhook_logs',
                'ordering': ['-created_at'],
            },
        ),
        migrations.CreateModel(
            name='Rating',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('stars', models.IntegerField(validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(5)])),
                ('review', models.TextField(blank=True, default='')),
                ('issue_flag', models.BooleanField(default=False)),
                ('issue_note', models.TextField(blank=True, default='')),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('booking', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='rating', to='testing_app.booking')),
                ('operator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ratings_received', to='testing_app.operator')),
                ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ratings_given', to='testing_app.user')),
            ],
            options={
                'db_table': 'ratings',
                'ordering': ['-created_at'],
            },
        ),
        migrations.CreateModel(
            name='SeatLock',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('expires_at', models.DateTimeField()),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('locked_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='seat_locks', to='testing_app.user')),
                ('schedule', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='seat_locks', to='testing_app.schedule')),
                ('seat', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='locks', to='testing_app.busseat')),
            ],
            options={
                'db_table': 'seat_locks',
            },
        ),
        migrations.CreateModel(
            name='DeviceTrust',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('device_id', models.CharField(max_length=100)),
                ('expires_at', models.DateTimeField()),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('last_used_at', models.DateTimeField(auto_now_add=True)),
                ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='trusted_devices', to='testing_app.user')),
            ],
            options={
                'db_table': 'device_trust',
                'unique_together': {('user', 'device_id')},
            },
        ),
    ]
