# Generated by Django 3.2.15 on 2022-09-21 18:29
# ruff: noqa: E501

from django.db import migrations, models


def migrate_existing_data(apps, schema_editor):
    """
    After creating the remaining_seconds column,
    populate it with the value of remaining_mintes*60.
    """
    if schema_editor.connection.vendor.startswith("postgres"):
        schema_editor.execute(
            'UPDATE "phones_relaynumber" SET remaining_seconds = remaining_minutes*60;'
        )
    elif schema_editor.connection.vendor.startswith("sqlite"):
        schema_editor.execute(
            'UPDATE "phones_relaynumber" SET remaining_seconds = remaining_minutes*60;'
        )
    else:
        raise Exception(f'Unknown database vendor "{schema_editor.connection.vendor}"')


def add_db_default_forward_func(apps, schema_editor):
    """
    Add a database default of 3000 for remaining_seconds, for PostgreSQL and SQLite3

    Using `./manage.py sqlmigrate` for the SQL, and the technique from:
    https://stackoverflow.com/a/45232678/10612
    """
    if schema_editor.connection.vendor.startswith("postgres"):
        schema_editor.execute(
            'ALTER TABLE "phones_relaynumber"'
            ' ALTER COLUMN "remaining_seconds" SET DEFAULT 3000;'
        )
    elif schema_editor.connection.vendor.startswith("sqlite"):
        schema_editor.execute(
            'CREATE TABLE "new__phones_relaynumber"'
            ' ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,'
            ' "remaining_minutes" integer NOT NULL DEFAULT 50,'
            ' "remaining_seconds" integer NOT NULL DEFAULT 3000,'
            ' "remaining_texts" integer NOT NULL DEFAULT 75,'
            ' "calls_forwarded" integer NOT NULL DEFAULT 0,'
            ' "calls_blocked" integer NOT NULL DEFAULT 0,'
            ' "texts_forwarded" integer NOT NULL DEFAULT 0,'
            ' "texts_blocked" integer NOT NULL DEFAULT 0,'
            ' "enabled" bool NOT NULL DEFAULT 1,'
            ' "number" varchar(15) NOT NULL,'
            ' "location" varchar(255) NOT NULL,'
            ' "user_id" integer NOT NULL REFERENCES "auth_user" ("id")'
            " DEFERRABLE INITIALLY DEFERRED,"
            ' "vcard_lookup_key" varchar(6) NOT NULL UNIQUE);'
        )
        schema_editor.execute(
            'INSERT INTO "new__phones_relaynumber"'
            ' ("id", "number", "location", "user_id", "vcard_lookup_key", "enabled",'
            ' "remaining_texts", "remaining_minutes", "calls_forwarded", "calls_blocked", '
            ' "texts_forwarded", "texts_blocked", "remaining_seconds") '
            ' SELECT "id", "number", "location", "user_id", "vcard_lookup_key", "enabled", '
            ' "remaining_texts", "remaining_minutes", "calls_forwarded", "calls_blocked", '
            ' "texts_forwarded", "texts_blocked", 3000 '
            ' FROM "phones_relaynumber";'
        )
        schema_editor.execute('DROP TABLE "phones_relaynumber";')
        schema_editor.execute(
            'ALTER TABLE "new__phones_relaynumber" RENAME TO "phones_relaynumber";'
        )
        schema_editor.execute(
            'CREATE INDEX "phones_relaynumber_number_742e5d6b" ON "phones_relaynumber"'
            ' ("number");'
        )
        schema_editor.execute(
            'CREATE INDEX "phones_relaynumber_user_id_62c65ede" ON "phones_relaynumber"'
            ' ("user_id");'
        )
    else:
        raise Exception(f'Unknown database vendor "{schema_editor.connection.vendor}"')


class Migration(migrations.Migration):
    dependencies = [
        ("phones", "0021_add_relaynumber_stats_20220913_1959"),
    ]

    operations = [
        migrations.AddField(
            model_name="relaynumber",
            name="remaining_seconds",
            field=models.IntegerField(default=3000),
        ),
        migrations.RunPython(
            code=migrate_existing_data,
            reverse_code=migrations.RunPython.noop,
            elidable=True,
        ),
        migrations.RemoveField(
            model_name="relaynumber",
            name="remaining_minutes",
        ),
        migrations.RunPython(
            code=add_db_default_forward_func,
            reverse_code=migrations.RunPython.noop,
            elidable=True,
        ),
    ]
