import string
from django.db import migrations, models
import django.db.models.deletion
from django.utils.crypto import get_random_string


def generate_short_id():
    return get_random_string(6, allowed_chars=string.ascii_uppercase + string.digits)


def populate_short_ids_sessions(apps, schema_editor):
    ClassSession = apps.get_model("scheduling", "ClassSession")
    used = set()
    for session in ClassSession.objects.all():
        sid = generate_short_id()
        while sid in used:
            sid = generate_short_id()
        used.add(sid)
        session.short_id = sid
        session.save(update_fields=["short_id"])


def populate_short_ids_bookings(apps, schema_editor):
    ClassBooking = apps.get_model("scheduling", "ClassBooking")
    used = set()
    for booking in ClassBooking.objects.all():
        sid = generate_short_id()
        while sid in used:
            sid = generate_short_id()
        used.add(sid)
        booking.short_id = sid
        booking.save(update_fields=["short_id"])


class Migration(migrations.Migration):

    dependencies = [
        ("scheduling", "0001_initial"),
        ("core", "0001_initial"),
    ]

    operations = [
        # ── ClassType: remove FK category first (before deleting ClassCategory) ──
        migrations.RemoveField(
            model_name="classtype",
            name="category",
        ),

        # ── Delete ClassCategory (no more references) ──
        migrations.DeleteModel(
            name="ClassCategory",
        ),

        # ── ClassType: add CharField category + new fields ──
        migrations.AddField(
            model_name="classtype",
            name="category",
            field=models.CharField(blank=True, default="", max_length=100),
        ),
        migrations.AddField(
            model_name="classtype",
            name="max_participants",
            field=models.PositiveIntegerField(default=30),
        ),
        migrations.AddField(
            model_name="classtype",
            name="required_equipment",
            field=models.TextField(blank=True, default=""),
        ),
        migrations.AddField(
            model_name="classtype",
            name="color_hex",
            field=models.CharField(default="#3B82F6", max_length=7),
        ),

        # ── Room: make location optional, add room_type, status, equipment_available, notes ──
        migrations.AlterField(
            model_name="room",
            name="location",
            field=models.ForeignKey(
                blank=True,
                null=True,
                on_delete=django.db.models.deletion.SET_NULL,
                related_name="rooms",
                to="core.location",
            ),
        ),
        migrations.AddField(
            model_name="room",
            name="room_type",
            field=models.CharField(
                choices=[
                    ("studio", "Studio"),
                    ("hall", "Hall"),
                    ("outdoor", "Outdoor"),
                    ("virtual", "Virtual"),
                ],
                default="studio",
                max_length=20,
            ),
        ),
        migrations.AddField(
            model_name="room",
            name="status",
            field=models.CharField(
                choices=[
                    ("available", "Available"),
                    ("under_maintenance", "Under Maintenance"),
                ],
                default="available",
                max_length=20,
            ),
        ),
        migrations.AddField(
            model_name="room",
            name="equipment_available",
            field=models.TextField(blank=True, default=""),
        ),
        migrations.AddField(
            model_name="room",
            name="notes",
            field=models.TextField(blank=True, default=""),
        ),

        # ── ClassSession: make location optional, add short_id, recurrence_type, allow_waitlist, notes, active status ──
        migrations.AlterField(
            model_name="classsession",
            name="location",
            field=models.ForeignKey(
                blank=True,
                null=True,
                on_delete=django.db.models.deletion.SET_NULL,
                related_name="class_sessions",
                to="core.location",
            ),
        ),
        migrations.AlterField(
            model_name="classsession",
            name="status",
            field=models.CharField(
                choices=[
                    ("active", "Active"),
                    ("scheduled", "Scheduled"),
                    ("in_progress", "In Progress"),
                    ("completed", "Completed"),
                    ("cancelled", "Cancelled"),
                ],
                default="scheduled",
                max_length=20,
            ),
        ),
        # Add short_id as nullable first
        migrations.AddField(
            model_name="classsession",
            name="short_id",
            field=models.CharField(default="", max_length=6),
            preserve_default=False,
        ),
        # Populate existing rows
        migrations.RunPython(populate_short_ids_sessions, migrations.RunPython.noop),
        # Make it unique
        migrations.AlterField(
            model_name="classsession",
            name="short_id",
            field=models.CharField(max_length=6, unique=True),
        ),
        migrations.AddField(
            model_name="classsession",
            name="recurrence_type",
            field=models.CharField(
                choices=[
                    ("one_time", "One Time"),
                    ("daily", "Daily"),
                    ("weekly", "Weekly"),
                ],
                default="one_time",
                max_length=10,
            ),
        ),
        migrations.AddField(
            model_name="classsession",
            name="allow_waitlist",
            field=models.BooleanField(default=True),
        ),
        migrations.AddField(
            model_name="classsession",
            name="notes",
            field=models.TextField(blank=True, default=""),
        ),

        # ── ClassBooking: add short_id ──
        migrations.AddField(
            model_name="classbooking",
            name="short_id",
            field=models.CharField(default="", max_length=6),
            preserve_default=False,
        ),
        migrations.RunPython(populate_short_ids_bookings, migrations.RunPython.noop),
        migrations.AlterField(
            model_name="classbooking",
            name="short_id",
            field=models.CharField(max_length=6, unique=True),
        ),
    ]
