"""tbl_v_i_sys_ver_rahmen.MietVID nullable machen.

Das Modell deklariert MietVID als IntegerField(null=True, blank=True), die
Tabelle ist aber managed=False - in der DB steht die Spalte weiterhin auf
NOT NULL. Solange der Sync jeden Verbrauchsrahmen ueber den Mietvertrag
zuordnete, ist das nie aufgefallen.

Seit die Zuordnung ueber PersonenID + REUID laeuft, kommen Rahmen ohne
MietVID an. Der Serializer laesst sie durch - DRF leitet allow_null aus dem
Modell ab - und das INSERT scheitert an der DB:

    IntegrityError: 1048 (23000): Column 'MietVID' cannot be null

PUT /api/verbrrahmen antwortet daraufhin mit HTTP 500 und der VISys-Sync
bricht ab.

Idempotent: MODIFY laeuft nur, wenn die Spalte aktuell NOT NULL ist. Der
Spaltentyp wird unveraendert aus information_schema uebernommen, damit die
Migration keinen Typwechsel erzwingt.
"""

from django.db import migrations

TABLE = 'tbl_v_i_sys_ver_rahmen'
COLUMN = 'MietVID'

COLUMN_INFO_SQL = """
    SELECT COLUMN_TYPE, IS_NULLABLE, COLUMN_COMMENT
    FROM information_schema.COLUMNS
    WHERE TABLE_SCHEMA = DATABASE()
      AND TABLE_NAME = %s
      AND COLUMN_NAME = %s
"""


def make_mietvid_nullable(_apps, schema_editor):
    with schema_editor.connection.cursor() as cursor:
        cursor.execute(COLUMN_INFO_SQL, [TABLE, COLUMN])
        row = cursor.fetchone()

        if row is None:
            print(f'Migration: Spalte {TABLE}.{COLUMN} nicht gefunden - uebersprungen')
            return

        column_type, is_nullable, comment = row
        if is_nullable == 'YES':
            print(f'Migration: {TABLE}.{COLUMN} ist bereits nullable - nichts zu tun')
            return

        statement = (
            f'ALTER TABLE `{TABLE}` '
            f'MODIFY COLUMN `{COLUMN}` {column_type} NULL DEFAULT NULL'
        )
        params = []
        if comment:
            statement += ' COMMENT %s'
            params.append(comment)

        cursor.execute(statement, params)
        print(f'Migration: {TABLE}.{COLUMN} ({column_type}) auf NULL umgestellt')


def reverse_migration(_apps, _schema_editor):
    # Kein Rueckbau: nach dem Umstieg auf PersonenID/REUID enthaelt die Spalte
    # regulaer NULL-Werte, ein NOT NULL wuerde an genau diesen scheitern.
    pass


class Migration(migrations.Migration):

    dependencies = [
        ('app_verbrauch', '0005_verbrauchrahmen_fk_spalten'),
    ]

    operations = [
        migrations.RunPython(make_mietvid_nullable, reverse_migration),
    ]
