# Generated for FTG Season & Competition Orchestration Engine.
import django.db.models.deletion
import uuid
from django.db import migrations, models


class Migration(migrations.Migration):
    dependencies = [
        ("seasons", "0002_strengthen_season_integrity"),
        ("leagues", "0005_leaguemembership_youth_team_and_more"),
        ("federations", "0007_competition_qualification_engine"),
    ]

    operations = [
        migrations.CreateModel(
            name="SeasonOrchestrationRun",
            fields=[
                ("id", models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ("policy_key", models.CharField(max_length=100)),
                ("policy_version", models.CharField(max_length=30)),
                ("schema_version", models.PositiveSmallIntegerField(default=1)),
                ("status", models.CharField(choices=[("PENDING", "Pending"), ("RUNNING", "Running"), ("SUCCEEDED", "Succeeded"), ("FAILED", "Failed")], default="PENDING", max_length=12)),
                ("current_step", models.CharField(blank=True, choices=[("PRECHECK", "Preflight checks"), ("FINALIZE_SOURCE", "Finalize source competitions"), ("COMPLETE_SOURCE", "Complete source season"), ("APPLY_MOVEMENT", "Apply promotion/relegation"), ("GENERATE_LEAGUES", "Generate target league schedules"), ("CREATE_COMPETITIONS", "Create target federation competitions"), ("QUALIFY_COMPETITIONS", "Apply continental qualification"), ("DRAW_COMPETITIONS", "Draw target competitions"), ("BUILD_CALENDAR", "Build season calendar windows"), ("MARK_UPCOMING", "Mark target season upcoming")], default="", max_length=32)),
                ("attempt_count", models.PositiveIntegerField(default=0)),
                ("request_payload", models.JSONField(default=dict)),
                ("request_hash", models.CharField(max_length=64)),
                ("result_payload", models.JSONField(default=dict)),
                ("result_hash", models.CharField(blank=True, default="", max_length=64)),
                ("error_code", models.CharField(blank=True, default="", max_length=120)),
                ("error_message", models.CharField(blank=True, default="", max_length=1000)),
                ("started_at", models.DateTimeField(blank=True, null=True)),
                ("completed_at", models.DateTimeField(blank=True, null=True)),
                ("failed_at", models.DateTimeField(blank=True, null=True)),
                ("created_at", models.DateTimeField(auto_now_add=True)),
                ("updated_at", models.DateTimeField(auto_now=True)),
                ("source_season", models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name="orchestration_runs_out", to="seasons.season")),
                ("target_season", models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name="orchestration_runs_in", to="seasons.season")),
            ],
            options={"ordering": ["-created_at", "id"]},
        ),
        migrations.CreateModel(
            name="SeasonOrchestrationStep",
            fields=[
                ("id", models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ("step_key", models.CharField(choices=[("PRECHECK", "Preflight checks"), ("FINALIZE_SOURCE", "Finalize source competitions"), ("COMPLETE_SOURCE", "Complete source season"), ("APPLY_MOVEMENT", "Apply promotion/relegation"), ("GENERATE_LEAGUES", "Generate target league schedules"), ("CREATE_COMPETITIONS", "Create target federation competitions"), ("QUALIFY_COMPETITIONS", "Apply continental qualification"), ("DRAW_COMPETITIONS", "Draw target competitions"), ("BUILD_CALENDAR", "Build season calendar windows"), ("MARK_UPCOMING", "Mark target season upcoming")], max_length=32)),
                ("ordinal", models.PositiveSmallIntegerField()),
                ("status", models.CharField(choices=[("PENDING", "Pending"), ("RUNNING", "Running"), ("SUCCEEDED", "Succeeded"), ("FAILED", "Failed")], default="PENDING", max_length=12)),
                ("attempt_count", models.PositiveIntegerField(default=0)),
                ("input_payload", models.JSONField(default=dict)),
                ("input_hash", models.CharField(max_length=64)),
                ("result_payload", models.JSONField(default=dict)),
                ("result_hash", models.CharField(blank=True, default="", max_length=64)),
                ("error_code", models.CharField(blank=True, default="", max_length=120)),
                ("error_message", models.CharField(blank=True, default="", max_length=1000)),
                ("started_at", models.DateTimeField(blank=True, null=True)),
                ("completed_at", models.DateTimeField(blank=True, null=True)),
                ("failed_at", models.DateTimeField(blank=True, null=True)),
                ("created_at", models.DateTimeField(auto_now_add=True)),
                ("updated_at", models.DateTimeField(auto_now=True)),
                ("run", models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name="steps", to="seasons.seasonorchestrationrun")),
            ],
            options={"ordering": ["run_id", "ordinal"]},
        ),
        migrations.CreateModel(
            name="SeasonCompetitionCalendarSlot",
            fields=[
                ("id", models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ("source_type", models.CharField(choices=[("LEAGUE", "League competition"), ("FEDERATION", "Federation competition")], max_length=12)),
                ("phase", models.CharField(choices=[("LEAGUE_ROUND", "League round"), ("GROUP_MATCHDAY", "Group matchday"), ("KNOCKOUT_ROUND", "Knockout round")], max_length=24)),
                ("sequence", models.PositiveSmallIntegerField()),
                ("scheduled_date", models.DateField()),
                ("metadata", models.JSONField(default=dict)),
                ("evidence_hash", models.CharField(max_length=64)),
                ("created_at", models.DateTimeField(auto_now_add=True)),
                ("federation_competition", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name="season_calendar_slots", to="federations.federationcompetition")),
                ("league_competition", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name="season_calendar_slots", to="leagues.leaguecompetition")),
                ("run", models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name="calendar_slots", to="seasons.seasonorchestrationrun")),
                ("season", models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name="competition_calendar_slots", to="seasons.season")),
            ],
            options={"ordering": ["scheduled_date", "source_type", "sequence", "id"]},
        ),
        migrations.AddConstraint(
            model_name="seasonorchestrationrun",
            constraint=models.UniqueConstraint(fields=("source_season", "target_season"), name="uq_season_orch_source_target"),
        ),
        migrations.AddConstraint(
            model_name="seasonorchestrationrun",
            constraint=models.CheckConstraint(condition=~models.Q(("source_season", models.F("target_season"))), name="season_orch_source_target_diff"),
        ),
        migrations.AddConstraint(
            model_name="seasonorchestrationrun",
            constraint=models.CheckConstraint(condition=models.Q(("status__in", ["PENDING", "RUNNING", "SUCCEEDED", "FAILED"])), name="season_orch_valid_status"),
        ),
        migrations.AddConstraint(
            model_name="seasonorchestrationrun",
            constraint=models.CheckConstraint(condition=models.Q(("schema_version__gte", 1)), name="season_orch_schema_gte_1"),
        ),
        migrations.AddConstraint(
            model_name="seasonorchestrationrun",
            constraint=models.CheckConstraint(condition=~models.Q(("request_hash", "")), name="season_orch_req_hash_nonempty"),
        ),
        migrations.AddIndex(model_name="seasonorchestrationrun", index=models.Index(fields=["status", "updated_at"], name="season_orch_status_idx")),
        migrations.AddIndex(model_name="seasonorchestrationrun", index=models.Index(fields=["source_season", "target_season"], name="season_orch_pair_idx")),
        migrations.AddConstraint(
            model_name="seasonorchestrationstep",
            constraint=models.UniqueConstraint(fields=("run", "step_key"), name="uq_season_orch_step_key"),
        ),
        migrations.AddConstraint(
            model_name="seasonorchestrationstep",
            constraint=models.UniqueConstraint(fields=("run", "ordinal"), name="uq_season_orch_step_ord"),
        ),
        migrations.AddConstraint(
            model_name="seasonorchestrationstep",
            constraint=models.CheckConstraint(condition=models.Q(("ordinal__gte", 1)), name="season_orch_step_ord_gte_1"),
        ),
        migrations.AddConstraint(
            model_name="seasonorchestrationstep",
            constraint=models.CheckConstraint(condition=models.Q(("status__in", ["PENDING", "RUNNING", "SUCCEEDED", "FAILED"])), name="season_orch_step_valid_status"),
        ),
        migrations.AddConstraint(
            model_name="seasonorchestrationstep",
            constraint=models.CheckConstraint(condition=~models.Q(("input_hash", "")), name="season_orch_step_input_hash"),
        ),
        migrations.AddIndex(model_name="seasonorchestrationstep", index=models.Index(fields=["run", "status"], name="season_orch_step_status_idx")),
        migrations.AddConstraint(
            model_name="seasoncompetitioncalendarslot",
            constraint=models.CheckConstraint(condition=models.Q(("sequence__gte", 1)), name="season_cal_seq_gte_1"),
        ),
        migrations.AddConstraint(
            model_name="seasoncompetitioncalendarslot",
            constraint=models.CheckConstraint(condition=models.Q(("source_type__in", ["LEAGUE", "FEDERATION"])), name="season_cal_valid_source_type"),
        ),
        migrations.AddConstraint(
            model_name="seasoncompetitioncalendarslot",
            constraint=models.CheckConstraint(condition=models.Q(("phase__in", ["LEAGUE_ROUND", "GROUP_MATCHDAY", "KNOCKOUT_ROUND"])), name="season_cal_valid_phase"),
        ),
        migrations.AddConstraint(
            model_name="seasoncompetitioncalendarslot",
            constraint=models.CheckConstraint(
                condition=(
                    models.Q(("source_type", "LEAGUE"), ("league_competition__isnull", False), ("federation_competition__isnull", True))
                    | models.Q(("source_type", "FEDERATION"), ("league_competition__isnull", True), ("federation_competition__isnull", False))
                ),
                name="season_cal_source_shape",
            ),
        ),
        migrations.AddConstraint(
            model_name="seasoncompetitioncalendarslot",
            constraint=models.UniqueConstraint(condition=models.Q(("league_competition__isnull", False)), fields=("run", "league_competition", "phase", "sequence"), name="uq_season_cal_league_slot"),
        ),
        migrations.AddConstraint(
            model_name="seasoncompetitioncalendarslot",
            constraint=models.UniqueConstraint(condition=models.Q(("federation_competition__isnull", False)), fields=("run", "federation_competition", "phase", "sequence"), name="uq_season_cal_fed_slot"),
        ),
        migrations.AddConstraint(
            model_name="seasoncompetitioncalendarslot",
            constraint=models.CheckConstraint(condition=~models.Q(("evidence_hash", "")), name="season_cal_hash_nonempty"),
        ),
        migrations.AddIndex(model_name="seasoncompetitioncalendarslot", index=models.Index(fields=["season", "scheduled_date"], name="season_cal_date_idx")),
    ]
