IF OBJECT_ID('dbo.begehung_errorlog', 'U') IS NOT NULL
BEGIN
    DROP TABLE [dbo].[begehung_errorlog];
END

CREATE TABLE [dbo].[begehung_errorlog] (
    [ErrorID] INT IDENTITY(1,1) PRIMARY KEY,
    [ErrorMessage] NVARCHAR(MAX) NOT NULL,
    [ErrorTime] DATETIME NOT NULL
);

-- Wechsel zur Datenbank 'engomo'
USE engomo;

-- 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 Tabellen-Schleife
DECLARE @CurrentSuffix NVARCHAR(128);
DECLARE @FullTableName NVARCHAR(256);
DECLARE @CreateTableColumns NVARCHAR(MAX);
DECLARE @SQL_CREATE NVARCHAR(MAX);

-- Deklariere Variablen für die PRIMARY KEY Schleife
DECLARE @CurrentTable NVARCHAR(128);
DECLARE @PKName NVARCHAR(128);
DECLARE @AddPKSQL NVARCHAR(MAX);

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

-- Deklariere Variablen für die Lösch-Schleife
DECLARE @ExistingColumnLoop NVARCHAR(128);
DECLARE @DeleteColumnSQL 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
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');



/*
=== BEGIN TABLE CREATION LOOP ===
*/

-- Deklariere und öffne einen Cursor, um durch die Tabellennamen-Endungen zu iterieren
DECLARE table_cursor CURSOR FOR
    SELECT Suffix FROM @TableSuffixes;

OPEN table_cursor;

FETCH NEXT FROM table_cursor INTO @CurrentSuffix;

WHILE @@FETCH_STATUS = 0
BEGIN
    BEGIN TRY
        -- Erstelle den vollständigen Tabellennamen mit dem Präfix
        SET @FullTableName = @TablePrefix + @CurrentSuffix;

        -- Überprüfe, ob die Tabelle bereits existiert in der Datenbank 'engomo'
        IF NOT EXISTS (
            SELECT * 
            FROM INFORMATION_SCHEMA.TABLES 
            WHERE TABLE_NAME = @FullTableName
              AND TABLE_SCHEMA = 'dbo'
        )
        BEGIN
            -- Definiere das CREATE TABLE Statement basierend auf den erlaubten Spalten
            SET @CreateTableColumns = (
                SELECT STRING_AGG('[' + ColumnName + '] NVARCHAR(255)', ', ')
                FROM @ColumnsToAdd
                WHERE TableName = @FullTableName
            );

            IF @CreateTableColumns IS NULL OR LEN(@CreateTableColumns) = 0
            BEGIN
                PRINT 'Keine Spalten definiert für Tabelle ' + @FullTableName + '. Tabelle wird nicht erstellt.';
            END
            ELSE
            BEGIN
                SET @SQL_CREATE = N'CREATE TABLE dbo.[' + @FullTableName + N'] (' + @CreateTableColumns + N');';

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

                PRINT 'Tabelle ' + @FullTableName + ' wurde erstellt.';
            END
        END
        ELSE
        BEGIN
            PRINT 'Tabelle ' + @FullTableName + ' existiert bereits.';
        END
    END TRY
    BEGIN CATCH
        INSERT INTO dbo.begehung_errorlog (ErrorMessage, ErrorTime)
        VALUES ('Fehler beim Erstellen der Tabelle ' + @FullTableName + ': ' + ERROR_MESSAGE(), GETDATE());
    END CATCH

    -- Hole den nächsten Suffix
    FETCH NEXT FROM table_cursor INTO @CurrentSuffix;
END

-- Schließe und deallokiere den Cursor
CLOSE table_cursor;
DEALLOCATE table_cursor;

/*
=== END TABLE CREATION LOOP ===
*/



/*
=== BEGIN PRIMARY KEY ADDITION LOOP ===
*/

-- Füge den PRIMARY KEY für jede Tabelle hinzu, die engomoid hat
DECLARE pk_cursor CURSOR FOR
    SELECT DISTINCT TableName 
    FROM @ColumnsToAdd 
    WHERE ColumnName = 'engomoid';

OPEN pk_cursor;

FETCH NEXT FROM pk_cursor INTO @CurrentTable;

WHILE @@FETCH_STATUS = 0
BEGIN
    BEGIN TRY
        -- Überprüfe, ob der PRIMARY KEY bereits existiert
        IF NOT EXISTS (
            SELECT * 
            FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
            WHERE TABLE_NAME = @CurrentTable
              AND CONSTRAINT_TYPE = 'PRIMARY KEY'
              AND TABLE_SCHEMA = 'dbo'
        )
        BEGIN
            -- Definiere den Constraint-Namen
            SET @PKName = 'PK_' + @CurrentTable;

            -- Definiere das ALTER TABLE Statement zum Hinzufügen des PRIMARY KEY
            SET @AddPKSQL = N'ALTER TABLE dbo.[' + @CurrentTable + N'] ADD CONSTRAINT [' + @PKName + N'] PRIMARY KEY (engomoid);';

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

            PRINT 'Primary Key auf engomoid in ' + @CurrentTable + ' wurde hinzugefügt.';
        END
        ELSE
        BEGIN
            PRINT 'Primary Key auf engomoid in ' + @CurrentTable + ' existiert bereits.';
        END
    END TRY
    BEGIN CATCH
        INSERT INTO dbo.begehung_errorlog (ErrorMessage, ErrorTime)
        VALUES ('Fehler beim Hinzufügen des Primary Keys zu ' + @CurrentTable + ': ' + ERROR_MESSAGE(), GETDATE());
    END CATCH

    -- Hole den nächsten TableName
    FETCH NEXT FROM pk_cursor INTO @CurrentTable;
END

-- Schließe und deallokiere den Cursor
CLOSE pk_cursor;
DEALLOCATE pk_cursor;

/*
=== END PRIMARY KEY ADDITION LOOP ===
*/



/*
=== BEGIN COLUMN ADDITION LOOP ===
*/

-- Deklariere und öffne einen Cursor, um durch die Spalten zu iterieren
DECLARE column_cursor CURSOR FOR
    SELECT TableName, ColumnName FROM @ColumnsToAdd;

OPEN column_cursor;

FETCH NEXT FROM column_cursor INTO @TargetTable, @CurrentColumn;

WHILE @@FETCH_STATUS = 0
BEGIN
    BEGIN TRY
        -- Ü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
            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
        INSERT INTO dbo.begehung_errorlog (ErrorMessage, ErrorTime)
        VALUES ('Fehler beim Hinzufügen der Spalte ' + @CurrentColumn + ' zu ' + @TargetTable + ': ' + ERROR_MESSAGE(), GETDATE());
    END CATCH

    -- Hole die nächste Spalte
    FETCH NEXT FROM column_cursor INTO @TargetTable, @CurrentColumn;
END

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

/*
=== END COLUMN ADDITION LOOP ===
*/



/*
=== BEGIN COLUMN DELETION LOOP ===
*/

-- Deklariere und öffne einen Cursor, um durch die Tabellen zu iterieren
DECLARE delete_cursor CURSOR FOR
    SELECT DISTINCT TableName FROM @ColumnsToAdd;

OPEN delete_cursor;

FETCH NEXT FROM delete_cursor INTO @TargetTable;

WHILE @@FETCH_STATUS = 0
BEGIN
    BEGIN TRY
        -- Hole alle existierenden Spalten in der Tabelle
        DECLARE @ExistingColumns TABLE (ColumnName NVARCHAR(128));

        INSERT INTO @ExistingColumns (ColumnName)
        SELECT COLUMN_NAME
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_NAME = @TargetTable
          AND TABLE_SCHEMA = 'dbo';

        -- Iteriere durch jede existierende Spalte
        DECLARE ExistingColumnCursor CURSOR LOCAL FAST_FORWARD FOR
            SELECT ColumnName FROM @ExistingColumns;

        OPEN ExistingColumnCursor;

        FETCH NEXT FROM ExistingColumnCursor INTO @ExistingColumnLoop;

        WHILE @@FETCH_STATUS = 0
        BEGIN
            -- Überprüfe, ob die Spalte in den erlaubten Spalten ist
            IF NOT EXISTS (
                SELECT 1 
                FROM @ColumnsToAdd 
                WHERE TableName = @TargetTable
                  AND ColumnName = @ExistingColumnLoop
            )
            BEGIN
                BEGIN TRY
                    -- Definiere das ALTER TABLE Statement zum Löschen der Spalte
                    SET @DeleteColumnSQL = N'ALTER TABLE dbo.[' + @TargetTable + N'] DROP COLUMN [' + @ExistingColumnLoop + N'];';

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

                    PRINT 'Spalte ' + @ExistingColumnLoop + ' wurde aus ' + @TargetTable + ' gelöscht.';
                END TRY
                BEGIN CATCH
                    -- Ignoriere den Fehler und fahre fort
                    INSERT INTO dbo.begehung_errorlog (ErrorMessage, ErrorTime)
                    VALUES ('Fehler beim Löschen der Spalte ' + @ExistingColumnLoop + ' aus ' + @TargetTable + ': ' + ERROR_MESSAGE(), GETDATE());
                END CATCH
            END
            ELSE
            BEGIN
                PRINT 'Spalte ' + @ExistingColumnLoop + ' ist erlaubt in ' + @TargetTable + '.';
            END

            FETCH NEXT FROM ExistingColumnCursor INTO @ExistingColumnLoop;
        END

        -- Schließe und deallokiere den existierenden Spalten-Cursor
        CLOSE ExistingColumnCursor;
        DEALLOCATE ExistingColumnCursor;
    END TRY
    BEGIN CATCH
        INSERT INTO dbo.begehung_errorlog (ErrorMessage, ErrorTime)
        VALUES ('Fehler beim Überprüfen/Löschen von Spalten in ' + @TargetTable + ': ' + ERROR_MESSAGE(), GETDATE());
    END CATCH

    -- Hole den nächsten TableName
    FETCH NEXT FROM delete_cursor INTO @TargetTable;
END

-- Schließe und deallokiere den Lösch-Cursor
CLOSE delete_cursor;
DEALLOCATE delete_cursor;

/*
=== END COLUMN DELETION LOOP ===
*/