-- ============================================
-- Migration 0017: Elimination de la table Reparations
-- Date: 2026-01-28
-- ============================================
-- Prerequis: Migration 0013 appliquee (id_equipement sur Interventions)
-- Ajoute les colonnes logistiques sur EQUIPEMENTS
-- Ajoute id_equipement sur PiecesManquantes
-- Migre les donnees depuis Reparations
-- ============================================

-- Verifier que la migration 0013 a ete appliquee
IF EXISTS (
    SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = 'Interventions' AND COLUMN_NAME = 'id_equipement'
)
BEGIN
    PRINT 'Migration 0013 detectee - Demarrage migration 0017...';

    -- ============================================
    -- 1. Ajouter les colonnes logistiques a EQUIPEMENTS
    -- ============================================

    IF NOT EXISTS (
        SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_NAME = 'EQUIPEMENTS' AND COLUMN_NAME = 'validation_logistique'
    )
    BEGIN
        ALTER TABLE EQUIPEMENTS ADD validation_logistique BIT DEFAULT 0;
        PRINT 'Colonne validation_logistique ajoutee a EQUIPEMENTS';
    END
    ELSE
        PRINT 'Colonne validation_logistique existe deja dans EQUIPEMENTS';

    IF NOT EXISTS (
        SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_NAME = 'EQUIPEMENTS' AND COLUMN_NAME = 'date_validation_logistique'
    )
    BEGIN
        ALTER TABLE EQUIPEMENTS ADD date_validation_logistique DATETIME2 NULL;
        PRINT 'Colonne date_validation_logistique ajoutee a EQUIPEMENTS';
    END
    ELSE
        PRINT 'Colonne date_validation_logistique existe deja dans EQUIPEMENTS';

    IF NOT EXISTS (
        SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_NAME = 'EQUIPEMENTS' AND COLUMN_NAME = 'id_validateur_logistique'
    )
    BEGIN
        ALTER TABLE EQUIPEMENTS ADD id_validateur_logistique INT NULL;
        PRINT 'Colonne id_validateur_logistique ajoutee a EQUIPEMENTS';
    END
    ELSE
        PRINT 'Colonne id_validateur_logistique existe deja dans EQUIPEMENTS';

    IF NOT EXISTS (
        SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_NAME = 'EQUIPEMENTS' AND COLUMN_NAME = 'commentaire_logistique'
    )
    BEGIN
        ALTER TABLE EQUIPEMENTS ADD commentaire_logistique NVARCHAR(500) NULL;
        PRINT 'Colonne commentaire_logistique ajoutee a EQUIPEMENTS';
    END
    ELSE
        PRINT 'Colonne commentaire_logistique existe deja dans EQUIPEMENTS';

    -- ============================================
    -- 2. Ajouter id_equipement a PiecesManquantes
    -- ============================================

    IF NOT EXISTS (
        SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_NAME = 'PiecesManquantes' AND COLUMN_NAME = 'id_equipement'
    )
    BEGIN
        ALTER TABLE PiecesManquantes ADD id_equipement VARCHAR(50) NULL;
        PRINT 'Colonne id_equipement ajoutee a PiecesManquantes';
    END
    ELSE
        PRINT 'Colonne id_equipement existe deja dans PiecesManquantes';

    -- ============================================
    -- 3. Migrer id_equipement sur PiecesManquantes depuis Reparations
    -- ============================================

    -- Utilisation de SQL dynamique car les colonnes viennent d'etre ajoutees
    -- et SQL Server compile tout le bloc BEGIN/END avant execution

    IF OBJECT_ID('Reparations', 'U') IS NOT NULL
    BEGIN
        EXEC('
            UPDATE pm
            SET pm.id_equipement = r.id_equipement
            FROM PiecesManquantes pm
            INNER JOIN Reparations r ON pm.id_reparation = r.id_reparation
            WHERE pm.id_equipement IS NULL
              AND r.id_equipement IS NOT NULL
        ');

        PRINT 'Migration id_equipement sur PiecesManquantes terminee';
    END

    -- ============================================
    -- 4. Migrer les donnees logistiques depuis Reparations vers EQUIPEMENTS
    -- ============================================

    IF OBJECT_ID('Reparations', 'U') IS NOT NULL
    BEGIN
        EXEC('
            UPDATE e
            SET e.validation_logistique = ISNULL(r.validation_logistique, 0),
                e.date_validation_logistique = r.date_validation_logistique,
                e.id_validateur_logistique = r.id_validateur_logistique,
                e.commentaire_logistique = r.commentaire_logistique
            FROM EQUIPEMENTS e
            INNER JOIN Reparations r ON e.id_equipement = r.id_equipement
            WHERE r.validation_logistique IS NOT NULL
        ');

        PRINT 'Migration donnees logistiques vers EQUIPEMENTS terminee';
    END

    -- ============================================
    -- 5. Re-peupler id_equipement sur les Interventions restantes (securite)
    -- ============================================

    IF OBJECT_ID('Reparations', 'U') IS NOT NULL
    BEGIN
        UPDATE i
        SET i.id_equipement = r.id_equipement
        FROM Interventions i
        INNER JOIN Reparations r ON i.id_reparation = r.id_reparation
        WHERE i.id_equipement IS NULL
          AND r.id_equipement IS NOT NULL;

        PRINT 'Re-peuplement id_equipement sur Interventions: ' + CAST(@@ROWCOUNT AS VARCHAR) + ' lignes';
    END

    -- ============================================
    -- 6. Index pour performance
    -- ============================================

    IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_PiecesManquantes_id_equipement' AND object_id = OBJECT_ID('PiecesManquantes'))
    BEGIN
        EXEC('CREATE INDEX IX_PiecesManquantes_id_equipement ON PiecesManquantes(id_equipement)');
        PRINT 'Index IX_PiecesManquantes_id_equipement cree';
    END

    IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_EQUIPEMENTS_validation_logistique' AND object_id = OBJECT_ID('EQUIPEMENTS'))
    BEGIN
        EXEC('CREATE INDEX IX_EQUIPEMENTS_validation_logistique ON EQUIPEMENTS(validation_logistique) WHERE validation_logistique = 0');
        PRINT 'Index IX_EQUIPEMENTS_validation_logistique cree';
    END

    PRINT 'Migration 0017 terminee avec succes';
END
ELSE
BEGIN
    PRINT 'Migration 0013 non detectee - Executer 0013 d''abord';
END
