-- Wechsel zur Datenbank 'engomo'
USE engomo;

-- Deklariere alle benötigten Variablen und Tabellen zu Beginn

-- Deklariere eine Variable für das Tabellenpräfix
DECLARE @TablePrefix NVARCHAR(128) = 'begehung_';

-- Deklariere eine Tabellenvariable mit den Endungen der Tabellennamen
DECLARE @TableSuffixes TABLE (
    Suffix NVARCHAR(128)
);

-- Deklariere eine Tabellenvariable mit den Spalteninformationen
DECLARE @ColumnsToAdd TABLE (
    TableName NVARCHAR(128),
    ColumnName NVARCHAR(128)
);

-- Deklariere Variablen für die Spalten-Schleife
DECLARE @TargetTable NVARCHAR(128);
DECLARE @CurrentColumn NVARCHAR(128);
DECLARE @AddColumnSQL NVARCHAR(MAX);

-- Füge die gewünschten Tabellennamen-Endungen hinzu
INSERT INTO @TableSuffixes (Suffix) VALUES
    ('extras'),
    ('raeume'),
    ('badewanne'),
    ('toilette'),
    ('dusche'),
    ('waschbecken'),
    ('allgemein'),
    ('usersettings');

-- Füge die gewünschten Spalten hinzu, einschließlich begehung_stammdaten ohne engomoid
INSERT INTO @ColumnsToAdd (TableName, ColumnName) VALUES
    -- begehung_extras
    (@TablePrefix + 'extras', 'engomoid'),
    (@TablePrefix + 'extras', 'raum_bezeichnung'),
    (@TablePrefix + 'extras', 'handtuchheizkoerper'),
    (@TablePrefix + 'extras', 'badetuchhalter'),
    (@TablePrefix + 'extras', 'waschmaschinenanschluss'),
    (@TablePrefix + 'extras', 'notizen'),

    -- begehung_raeume
    (@TablePrefix + 'raeume', 'engomoid'),
    (@TablePrefix + 'raeume', 'raumid'),
    (@TablePrefix + 'raeume', 'raum_bezeichnung'),
    (@TablePrefix + 'raeume', 'tapezieren'),
    (@TablePrefix + 'raeume', 'anstrich_tuerblatt'),
    (@TablePrefix + 'raeume', 'anstrich_tuerrahmen'),
    (@TablePrefix + 'raeume', 'anstrich_tuerblatt_notizen'),
    (@TablePrefix + 'raeume', 'anstrich_heizkoerper'),
    (@TablePrefix + 'raeume', 'anstrich_heizkoerper_notizen'),
    (@TablePrefix + 'raeume', 'anstrich_decke'),
    (@TablePrefix + 'raeume', 'anstrich_decke_notizen'),
    (@TablePrefix + 'raeume', 'anstrich_waende'),
    (@TablePrefix + 'raeume', 'anstrich_waende_notizen'),
    (@TablePrefix + 'raeume', 'anstrich_fenster'),
    (@TablePrefix + 'raeume', 'anstrich_fenster_notizen'),
    (@TablePrefix + 'raeume', 'anstrich_fenstersims'),
    (@TablePrefix + 'raeume', 'anstrich_fenstersims_notizen'),
    (@TablePrefix + 'raeume', 'material_fenster'),
    (@TablePrefix + 'raeume', 'material_fenstersims'),
    (@TablePrefix + 'raeume', 'material_bodenbelag'),
    (@TablePrefix + 'raeume', 'sonstiges_einbauschrank'),
    (@TablePrefix + 'raeume', 'sonstiges_einbauschrank_notizen'),
    (@TablePrefix + 'raeume', 'sonstiges_luefter'),
    (@TablePrefix + 'raeume', 'sonstiges_luefter_notizen'),
    (@TablePrefix + 'raeume', 'notizen_verursachung_mieter'),
    (@TablePrefix + 'raeume', 'notizen_instandsetzung_mieter'),
    (@TablePrefix + 'raeume', 'notizen_instandsetzung_vermieter'),

    -- begehung_badewanne
    (@TablePrefix + 'badewanne', 'engomoid'),
    (@TablePrefix + 'badewanne', 'raum_bezeichnung'),
    (@TablePrefix + 'badewanne', 'ablauf_mit_stoepsel'),
    (@TablePrefix + 'badewanne', 'excenter_garnitur'),
    (@TablePrefix + 'badewanne', 'griff'),
    (@TablePrefix + 'badewanne', 'handbrause_mit_schlauch'),

    -- begehung_dusche
    (@TablePrefix + 'dusche', 'engomoid'),
    (@TablePrefix + 'dusche', 'raum_bezeichnung'),
    (@TablePrefix + 'dusche', 'ablagekorb'),
    (@TablePrefix + 'dusche', 'duschabtrennung'),
    (@TablePrefix + 'dusche', 'duschkabine'),
    (@TablePrefix + 'dusche', 'duschstange'),
    (@TablePrefix + 'dusche', 'duschstange_mit_seifenschale'),
    (@TablePrefix + 'dusche', 'dusche_bodengleich'),
    (@TablePrefix + 'dusche', 'duschtasse'),
    (@TablePrefix + 'dusche', 'handbrause_mit_schlauch'),

    -- begehung_waschbecken
    (@TablePrefix + 'waschbecken', 'engomoid'),
    (@TablePrefix + 'waschbecken', 'raum_bezeichnung'),
    (@TablePrefix + 'waschbecken', 'ablauf_mit_stoepsel'),
    (@TablePrefix + 'waschbecken', 'doppelhandtuchhalter'),
    (@TablePrefix + 'waschbecken', 'doppelwaschbecken'),
    (@TablePrefix + 'waschbecken', 'doppelwaschtisch'),
    (@TablePrefix + 'waschbecken', 'excenter_garnitur'),
    (@TablePrefix + 'waschbecken', 'handtuchhalter'),
    (@TablePrefix + 'waschbecken', 'handtuchhaken'),
    (@TablePrefix + 'waschbecken', 'konsole'),
    (@TablePrefix + 'waschbecken', 'seifenschale'),
    (@TablePrefix + 'waschbecken', 'spiegelleuchte'),
    (@TablePrefix + 'waschbecken', 'waschbecken'),

    -- begehung_toilette
    (@TablePrefix + 'toilette', 'engomoid'),
    (@TablePrefix + 'toilette', 'raum_bezeichnung'),
    (@TablePrefix + 'toilette', 'sitz_mit_deckel'),
    (@TablePrefix + 'toilette', 'sitz_mit_deckel_softclose'),
    (@TablePrefix + 'toilette', 'toilettenpapierhalter'),

    -- begehung_usersettings
    (@TablePrefix + 'usersettings', 'user_mail'),
    (@TablePrefix + 'usersettings', 'user_theme');

-- Verwende eine set-basierte Methode, um durch die Spalten zu iterieren
DECLARE column_cursor CURSOR FOR
    SELECT TableName, ColumnName FROM @ColumnsToAdd;

OPEN column_cursor;

BEGIN TRY
    FETCH NEXT FROM column_cursor INTO @TargetTable, @CurrentColumn;

    WHILE @@FETCH_STATUS = 0
    BEGIN
        BEGIN TRY
            -- Überprüfe, ob die Tabelle existiert, andernfalls erstelle die Tabelle
            IF NOT EXISTS (
                SELECT * 
                FROM INFORMATION_SCHEMA.TABLES
                WHERE TABLE_NAME = @TargetTable
                  AND TABLE_SCHEMA = 'dbo'
            )
            BEGIN
                -- Erstelle die Tabelle, wenn sie nicht existiert
                DECLARE @CreateTableSQL NVARCHAR(MAX);
                SET @CreateTableSQL = N'CREATE TABLE dbo.[' + @TargetTable + N'] (' + @CurrentColumn + N' NVARCHAR(255));';
                EXEC sp_executesql @CreateTableSQL;
                PRINT 'Tabelle ' + @TargetTable + ' wurde erstellt.';
            END

            -- Überprüfe, ob die Spalte bereits existiert
            IF NOT EXISTS (
                SELECT * 
                FROM INFORMATION_SCHEMA.COLUMNS 
                WHERE TABLE_NAME = @TargetTable
                  AND COLUMN_NAME = @CurrentColumn
                  AND TABLE_SCHEMA = 'dbo'
            )
            BEGIN
                -- Definiere das ALTER TABLE Statement zum Hinzufügen der Spalte mit NVARCHAR(255) Typ
                SET @AddColumnSQL = N'ALTER TABLE dbo.[' + @TargetTable + N'] ADD [' + @CurrentColumn + N'] NVARCHAR(255);';

                -- Führe das dynamische SQL aus
                EXEC sp_executesql @AddColumnSQL;

                PRINT 'Spalte ' + @CurrentColumn + ' wurde zu ' + @TargetTable + ' hinzugefügt.';
            END
            ELSE
            BEGIN
                PRINT 'Spalte ' + @CurrentColumn + ' existiert bereits in ' + @TargetTable + '.';
            END
        END TRY
        BEGIN CATCH
            PRINT 'Fehler beim Hinzufügen der Spalte ' + @CurrentColumn + ' zu ' + @TargetTable + ': ' + ERROR_MESSAGE();
        END CATCH

        -- Hole die nächste Spalte
        FETCH NEXT FROM column_cursor INTO @TargetTable, @CurrentColumn;
    END
END TRY
BEGIN CATCH
    PRINT 'Fehler während der Cursor-Iteration: ' + ERROR_MESSAGE();
END CATCH

-- Schließe und deallokiere den Spalten-Cursor
CLOSE column_cursor;
DEALLOCATE column_cursor;
