# Generated by Django 1.11.23 on 2019-12-10 15:24

from django.db import migrations


def forwards_func(apps, schema_editor):
    NetworkIXLan = apps.get_model("peeringdb_server", "NetworkIXLan")
    Network = apps.get_model("peeringdb_server", "Network")

    asn_missing = 0
    migrated = 0

    print("\nmigrating netixlans")

    for netixlan in NetworkIXLan.handleref.all():
        if netixlan.asn != netixlan.network.asn:
            # asn differs from related network asn

            net = Network.handleref.filter(asn=netixlan.asn).first()

            if net and netixlan.status == "ok":
                # set network object from asn

                if net.status != netixlan.status:
                    # network status doesnt match netixlan status
                    # we update netixlan status to match as that is the least
                    # destructive behaviour while allowing us to still
                    # resolve the unique constraint conflict

                    netixlan.status = net.status

                    print(
                        "AS{}: netixlan{} {} {} at exchange {} has been moved to network AS{}, however status"
                        " between the two was mismatching "
                        " and has been corrected, but should be reviewed".format(
                            netixlan.network.asn,
                            netixlan.id,
                            netixlan.ipaddr4,
                            netixlan.ipaddr6,
                            netixlan.ixlan.ix.id,
                            net.asn,
                        )
                    )

                netixlan.network = net
                netixlan.save()
                migrated += 1

            else:
                # could not find network with asn matching asn
                # in this case we should drop the netixlan and log it

                notes = "AS{}: Could not correct non-existant local_asn AS{} @ ixlan{} ".format(
                    netixlan.network.asn, netixlan.asn, netixlan.ixlan.id
                )
                if netixlan.status == "ok":
                    print(notes)
                    asn_missing += 1

    print(f"Changed related network for {migrated} netixlans")
    print(
        "Found {} netixlans where network matching local_asn did not exist".format(
            asn_missing
        )
    )


class Migration(migrations.Migration):
    dependencies = [
        ("peeringdb_server", "0023_netfac_local_asn"),
    ]

    operations = [
        migrations.RunPython(forwards_func, migrations.RunPython.noop),
    ]
