"""Legt die FK-Spalten von tbl_v_i_sys_ver_rahmen an und fuellt sie nach.

PersonenID_id und REUID_id wurden nie per AddField angelegt (die Tabelle ist
managed=False) – 0003 fuellt sie nur. Auf einer Umgebung, in der die Spalten
nicht von Hand nachgezogen wurden, scheitert deshalb jeder ORM-Zugriff auf
VISysVerbrauchRahmen mit
OperationalError (1054, "Unknown column 'PersonenID_id' in 'field list'"),
und der Sync sieht nur eine leere HTTP-500-Seite (PUT /api/verbrrahmen).

Idempotent: MySQL kennt kein ADD COLUMN IF NOT EXISTS, daher per Introspection.
"""

from django.db import migrations

TABLE = 'tbl_v_i_sys_ver_rahmen'

# Spaltentypen passend zu den Ziel-PKs:
#   users.PersonenID        = PositiveIntegerField -> int unsigned
#   real_estate_units.REUID = IntegerField         -> int
COLUMNS = (
    ('PersonenID_id', 'int unsigned DEFAULT NULL'),
    ('REUID_id', 'int DEFAULT NULL'),
)

FILL_SQL = """
    UPDATE tbl_v_i_sys_ver_rahmen AS r
    INNER JOIN reu_miet_v_s AS m ON r.MietVID = m.MietVID
    SET r.PersonenID_id = m.MieterID,
        r.REUID_id = m.REUID
    WHERE r.MietVID IS NOT NULL
      AND (r.PersonenID_id IS NULL OR r.REUID_id IS NULL)
"""


def _existing_columns(schema_editor):
    connection = schema_editor.connection
    with connection.cursor() as cursor:
        return {
            column.name
            for column in connection.introspection.get_table_description(cursor, TABLE)
        }


def add_fk_columns(_apps, schema_editor):
    existing = _existing_columns(schema_editor)
    added = []
    with schema_editor.connection.cursor() as cursor:
        for name, definition in COLUMNS:
            if name in existing:
                continue
            cursor.execute(f'ALTER TABLE `{TABLE}` ADD COLUMN `{name}` {definition}')
            added.append(name)

        if added:
            print(f'Migration: Spalten ergaenzt: {", ".join(added)}')
            cursor.execute(FILL_SQL)
            print(f'Migration: {cursor.rowcount} Datensaetze nachgefuellt')
        else:
            print('Migration: Spalten waren bereits vorhanden – nichts zu tun')


def reverse_migration(_apps, _schema_editor):
    # Spalten werden nicht entfernt: sie enthalten die einzige Zuordnung
    # Verbrauchsrahmen -> Nutzer/Einheit. 0003 setzt sie bei Bedarf auf NULL.
    pass


class Migration(migrations.Migration):

    dependencies = [
        ('app_verbrauch', '0004_visysverbrauchart_lastupload2misys_and_more'),
    ]

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