import uuid

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):
    dependencies = [
        ("training", "0003_player_progression_aging_rating_materialization"),
        ("careers", "0004_player_retirement_legacy_engine"),
        ("players", "0003_player_form_morale_match_experience_engine"),
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.CreateModel(
            name="PlayerLegacyAsset",
            fields=[
                ("id", models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ("asset_type", models.CharField(choices=[("TRAINING_FACILITY", "Dedicated training facility"), ("TRAINING_EQUIPMENT", "Special training equipment"), ("HIGH_QUALITY_CARD_OPTION", "High-quality new-card option")], max_length=40)),
                ("level", models.PositiveSmallIntegerField(default=1)),
                ("metadata", models.JSONField(blank=True, default=dict)),
                ("created_at", models.DateTimeField(auto_now_add=True)),
                ("updated_at", models.DateTimeField(auto_now=True)),
                ("assigned_player", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name="assigned_legacy_assets", to="players.player")),
                ("origin_player", models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name="originated_legacy_assets", to="players.player")),
                ("owner", models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name="player_legacy_assets", to=settings.AUTH_USER_MODEL)),
            ],
            options={"ordering": ["owner_id", "asset_type", "created_at", "id"]},
        ),
        migrations.CreateModel(
            name="PlayerLegacyAssetAssignment",
            fields=[
                ("id", models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
                ("event_type", models.CharField(choices=[("INITIAL_ASSIGNMENT", "Initial assignment"), ("RETIREMENT_RELEASE", "Released on retirement"), ("SUCCESSOR_INHERITANCE", "Inherited by successor")], max_length=32)),
                ("evidence_payload", models.JSONField()),
                ("evidence_hash", models.CharField(max_length=64)),
                ("created_at", models.DateTimeField(auto_now_add=True)),
                ("asset", models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name="assignment_events", to="training.playerlegacyasset")),
                ("from_player", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name="legacy_asset_assignments_from", to="players.player")),
                ("retirement_case", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name="asset_assignment_events", to="careers.playerretirementcase")),
                ("to_player", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name="legacy_asset_assignments_to", to="players.player")),
            ],
            options={"ordering": ["created_at", "id"]},
        ),
        migrations.AddConstraint(model_name="playerlegacyasset", constraint=models.CheckConstraint(condition=models.Q(asset_type__in=["TRAINING_FACILITY", "TRAINING_EQUIPMENT", "HIGH_QUALITY_CARD_OPTION"]), name="legacyasset_valid_type")),
        migrations.AddConstraint(model_name="playerlegacyasset", constraint=models.CheckConstraint(condition=models.Q(level__gte=1, level__lte=10), name="legacyasset_level_1_10")),
        migrations.AddConstraint(model_name="playerlegacyasset", constraint=models.UniqueConstraint(condition=models.Q(asset_type="TRAINING_FACILITY", assigned_player__isnull=False), fields=("assigned_player",), name="uq_player_one_training_facility")),
        migrations.AddIndex(model_name="playerlegacyasset", index=models.Index(fields=["owner", "asset_type"], name="legacyasset_owner_type_idx")),
        migrations.AddIndex(model_name="playerlegacyasset", index=models.Index(fields=["assigned_player", "asset_type"], name="legacyasset_player_type_idx")),
        migrations.AddConstraint(model_name="playerlegacyassetassignment", constraint=models.CheckConstraint(condition=models.Q(event_type__in=["INITIAL_ASSIGNMENT", "RETIREMENT_RELEASE", "SUCCESSOR_INHERITANCE"]), name="legacyassign_valid_type")),
        migrations.AddConstraint(model_name="playerlegacyassetassignment", constraint=models.CheckConstraint(condition=~models.Q(evidence_hash=""), name="legacyassign_hash_nonempty")),
        migrations.AddConstraint(
            model_name="playerlegacyassetassignment",
            constraint=models.CheckConstraint(
                condition=(
                    models.Q(event_type="INITIAL_ASSIGNMENT", from_player__isnull=True, to_player__isnull=False, retirement_case__isnull=True)
                    | models.Q(event_type="RETIREMENT_RELEASE", from_player__isnull=False, to_player__isnull=True, retirement_case__isnull=False)
                    | models.Q(event_type="SUCCESSOR_INHERITANCE", from_player__isnull=False, to_player__isnull=False, retirement_case__isnull=False)
                ),
                name="legacyassign_shape_consistent",
            ),
        ),
        migrations.AddIndex(model_name="playerlegacyassetassignment", index=models.Index(fields=["asset", "created_at"], name="legacyassign_asset_time_idx")),
        migrations.AddIndex(model_name="playerlegacyassetassignment", index=models.Index(fields=["retirement_case", "event_type"], name="legacyassign_case_type_idx")),
    ]
