# Generated for FTG transfer-completion integration.

import django.db.models.deletion
from decimal import Decimal
from django.db import migrations, models
from django.db.models import Q


def validate_existing_data(apps, schema_editor):
    Transfer = apps.get_model("transfers", "Transfer")
    db = schema_editor.connection.alias

    if Transfer.objects.using(db).filter(
        source_club__isnull=True,
        transfer_fee__gt=0,
    ).exists():
        raise RuntimeError(
            "Cannot apply transfer completion migration: a free-agent transfer "
            "has a non-zero transfer fee. Resolve it explicitly first."
        )

    if Transfer.objects.using(db).filter(status="COMPLETED").exists():
        raise RuntimeError(
            "Cannot automatically link historical COMPLETED transfers to source "
            "and destination contracts. Populate those audit links explicitly "
            "before applying this migration."
        )


class Migration(migrations.Migration):
    dependencies = [
        ("clubs", "0003_club_squad_membership"),
        ("contracts", "0003_transfer_termination_reason"),
        ("transfers", "0003_strengthen_transfer_integrity"),
    ]

    operations = [
        migrations.AddField(
            model_name="transfer",
            name="source_contract",
            field=models.OneToOneField(
                blank=True,
                null=True,
                on_delete=django.db.models.deletion.PROTECT,
                related_name="outgoing_completed_transfer",
                to="contracts.contract",
            ),
        ),
        migrations.AddField(
            model_name="transfer",
            name="destination_contract",
            field=models.OneToOneField(
                blank=True,
                null=True,
                on_delete=django.db.models.deletion.PROTECT,
                related_name="incoming_completed_transfer",
                to="contracts.contract",
            ),
        ),
        migrations.RunPython(validate_existing_data, migrations.RunPython.noop),
        migrations.AddConstraint(
            model_name="transfer",
            constraint=models.CheckConstraint(
                condition=Q(source_club__isnull=False) | Q(transfer_fee=Decimal("0")),
                name="transfer_free_agent_fee_zero",
            ),
        ),
        migrations.AddConstraint(
            model_name="transfer",
            constraint=models.CheckConstraint(
                condition=(
                    Q(status="COMPLETED", destination_contract__isnull=False)
                    | (
                        ~Q(status="COMPLETED")
                        & Q(source_contract__isnull=True)
                        & Q(destination_contract__isnull=True)
                    )
                ),
                name="transfer_contract_links_lifecycle",
            ),
        ),
        migrations.AddConstraint(
            model_name="transfer",
            constraint=models.CheckConstraint(
                condition=(
                    ~Q(status="COMPLETED")
                    | Q(source_club__isnull=True, source_contract__isnull=True)
                    | Q(source_club__isnull=False, source_contract__isnull=False)
                ),
                name="transfer_source_contract_consistent",
            ),
        ),
    ]
