-- Migration: Ajouter programmation_id et avenant_id à la table projets
-- Date: 2025-01-XX
-- Description: Ajoute programmation_id et avenant_id pour permettre de lier un projet à une programmation ou un avenant

SET @dbname = DATABASE();
SET @tablename = 'projets';

-- Étape 1: Ajouter la colonne programmation_id
SET @preparedStatement1 = (SELECT IF(
  (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
    WHERE
      (TABLE_SCHEMA = @dbname)
      AND (TABLE_NAME = @tablename)
      AND (COLUMN_NAME = 'programmation_id')
  ) > 0,
  'SELECT "La colonne programmation_id existe déjà." AS message;',
  CONCAT('ALTER TABLE `', @tablename, '` 
   ADD COLUMN `programmation_id` INT NULL DEFAULT NULL COMMENT "ID de la programmation" AFTER `convention_specifique_id`,
   ADD INDEX `idx_programmation` (`programmation_id` ASC) USING BTREE;')
));
PREPARE alterIfNotExists1 FROM @preparedStatement1;
EXECUTE alterIfNotExists1;
DEALLOCATE PREPARE alterIfNotExists1;

-- Étape 2: Ajouter la colonne avenant_id
SET @preparedStatement2 = (SELECT IF(
  (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
    WHERE
      (TABLE_SCHEMA = @dbname)
      AND (TABLE_NAME = @tablename)
      AND (COLUMN_NAME = 'avenant_id')
  ) > 0,
  'SELECT "La colonne avenant_id existe déjà." AS message;',
  CONCAT('ALTER TABLE `', @tablename, '` 
   ADD COLUMN `avenant_id` INT NULL DEFAULT NULL COMMENT "ID de l\'avenant" AFTER `programmation_id`,
   ADD INDEX `idx_avenant` (`avenant_id` ASC) USING BTREE;')
));
PREPARE alterIfNotExists2 FROM @preparedStatement2;
EXECUTE alterIfNotExists2;
DEALLOCATE PREPARE alterIfNotExists2;

-- Étape 3: Ajouter les contraintes de clé étrangère pour programmation_id
SET @fkName1 = 'projets_ibfk_programmation';
SET @preparedStatement3 = (SELECT IF(
  (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
    WHERE
      (TABLE_SCHEMA = @dbname)
      AND (TABLE_NAME = @tablename)
      AND (CONSTRAINT_NAME = @fkName1)
  ) > 0,
  'SELECT "La contrainte de clé étrangère pour programmation_id existe déjà." AS message;',
  CONCAT('ALTER TABLE `', @tablename, '` 
   ADD CONSTRAINT `', @fkName1, '` FOREIGN KEY (`programmation_id`) REFERENCES `programmations` (`id`) ON DELETE SET NULL ON UPDATE RESTRICT;')
));
PREPARE alterIfNotExists3 FROM @preparedStatement3;
EXECUTE alterIfNotExists3;
DEALLOCATE PREPARE alterIfNotExists3;

-- Étape 4: Ajouter les contraintes de clé étrangère pour avenant_id
SET @fkName2 = 'projets_ibfk_avenant';
SET @preparedStatement4 = (SELECT IF(
  (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
    WHERE
      (TABLE_SCHEMA = @dbname)
      AND (TABLE_NAME = @tablename)
      AND (CONSTRAINT_NAME = @fkName2)
  ) > 0,
  'SELECT "La contrainte de clé étrangère pour avenant_id existe déjà." AS message;',
  CONCAT('ALTER TABLE `', @tablename, '` 
   ADD CONSTRAINT `', @fkName2, '` FOREIGN KEY (`avenant_id`) REFERENCES `avenants` (`id`) ON DELETE SET NULL ON UPDATE RESTRICT;')
));
PREPARE alterIfNotExists4 FROM @preparedStatement4;
EXECUTE alterIfNotExists4;
DEALLOCATE PREPARE alterIfNotExists4;

-- Message de confirmation
SELECT "Migration 066: Ajout de programmation_id et avenant_id à la table projets terminée avec succès." AS message;

