-- Migration: Ajouter le support des programmations et avenants à convention_achevement
-- Date: 2025-01-XX
-- Description: Ajoute programmation_id et avenant_id, et met à jour entity_type pour supporter Programmation et Avenant

SET @dbname = DATABASE();
SET @tablename = 'convention_achevement';

-- Étape 1: Ajouter les colonnes programmation_id et avenant_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;',
  'ALTER TABLE `convention_achevement` 
   ADD COLUMN `programmation_id` INT NULL DEFAULT NULL COMMENT "ID de la programmation" AFTER `convention_specifique_id`;'
));
PREPARE alterIfNotExists1 FROM @preparedStatement1;
EXECUTE alterIfNotExists1;
DEALLOCATE PREPARE alterIfNotExists1;

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;',
  'ALTER TABLE `convention_achevement` 
   ADD COLUMN `avenant_id` INT NULL DEFAULT NULL COMMENT "ID de l\'avenant" AFTER `programmation_id`;'
));
PREPARE alterIfNotExists2 FROM @preparedStatement2;
EXECUTE alterIfNotExists2;
DEALLOCATE PREPARE alterIfNotExists2;

-- Étape 2: Mettre à jour l'ENUM entity_type pour inclure Programmation et Avenant
SET @preparedStatement3 = (SELECT IF(
  (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
    WHERE
      (TABLE_SCHEMA = @dbname)
      AND (TABLE_NAME = @tablename)
      AND (COLUMN_NAME = 'entity_type')
  ) > 0,
  'ALTER TABLE `convention_achevement` 
   MODIFY COLUMN `entity_type` ENUM(\'Convention\', \'Convention_Specifique\', \'Programmation\', \'Avenant\') 
   CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT \'Convention\' COMMENT "Type d\'entité";',
  'SELECT "La colonne entity_type n\'existe pas." AS message;'
));
PREPARE alterIfNotExists3 FROM @preparedStatement3;
EXECUTE alterIfNotExists3;
DEALLOCATE PREPARE alterIfNotExists3;

-- Étape 3: Ajouter les contraintes de clé étrangère pour programmation_id
SET @preparedStatement4 = (SELECT IF(
  (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
    WHERE
      (TABLE_SCHEMA = @dbname)
      AND (TABLE_NAME = @tablename)
      AND (COLUMN_NAME = 'programmation_id')
      AND (REFERENCED_TABLE_NAME = 'programmations')
  ) > 0,
  'SELECT "La contrainte de clé étrangère pour programmation_id existe déjà." AS message;',
  'ALTER TABLE `convention_achevement`
   ADD CONSTRAINT `convention_achevement_ibfk_4` FOREIGN KEY (`programmation_id`) REFERENCES `programmations` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT;'
));
PREPARE alterIfNotExists4 FROM @preparedStatement4;
EXECUTE alterIfNotExists4;
DEALLOCATE PREPARE alterIfNotExists4;

-- Étape 4: Ajouter les contraintes de clé étrangère pour avenant_id
SET @preparedStatement5 = (SELECT IF(
  (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
    WHERE
      (TABLE_SCHEMA = @dbname)
      AND (TABLE_NAME = @tablename)
      AND (COLUMN_NAME = 'avenant_id')
      AND (REFERENCED_TABLE_NAME = 'avenants')
  ) > 0,
  'SELECT "La contrainte de clé étrangère pour avenant_id existe déjà." AS message;',
  'ALTER TABLE `convention_achevement`
   ADD CONSTRAINT `convention_achevement_ibfk_5` FOREIGN KEY (`avenant_id`) REFERENCES `avenants` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT;'
));
PREPARE alterIfNotExists5 FROM @preparedStatement5;
EXECUTE alterIfNotExists5;
DEALLOCATE PREPARE alterIfNotExists5;

-- Étape 5: Ajouter les index pour programmation_id et avenant_id
SET @preparedStatement6 = (SELECT IF(
  (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS
    WHERE
      (TABLE_SCHEMA = @dbname)
      AND (TABLE_NAME = @tablename)
      AND (INDEX_NAME = 'idx_programmation')
  ) > 0,
  'SELECT "L\'index idx_programmation existe déjà." AS message;',
  'ALTER TABLE `convention_achevement`
   ADD INDEX `idx_programmation` (`programmation_id` ASC) USING BTREE;'
));
PREPARE alterIfNotExists6 FROM @preparedStatement6;
EXECUTE alterIfNotExists6;
DEALLOCATE PREPARE alterIfNotExists6;

SET @preparedStatement7 = (SELECT IF(
  (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS
    WHERE
      (TABLE_SCHEMA = @dbname)
      AND (TABLE_NAME = @tablename)
      AND (INDEX_NAME = 'idx_avenant')
  ) > 0,
  'SELECT "L\'index idx_avenant existe déjà." AS message;',
  'ALTER TABLE `convention_achevement`
   ADD INDEX `idx_avenant` (`avenant_id` ASC) USING BTREE;'
));
PREPARE alterIfNotExists7 FROM @preparedStatement7;
EXECUTE alterIfNotExists7;
DEALLOCATE PREPARE alterIfNotExists7;

-- Étape 6: Supprimer les anciens index uniques et créer de nouveaux pour chaque type
-- Supprimer idx_convention_unique
SET @preparedStatement8 = (SELECT IF(
  (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS
    WHERE
      (TABLE_SCHEMA = @dbname)
      AND (TABLE_NAME = @tablename)
      AND (INDEX_NAME = 'idx_convention_unique')
  ) > 0,
  'ALTER TABLE `convention_achevement`
   DROP INDEX `idx_convention_unique`;',
  'SELECT "L\'index idx_convention_unique n\'existe pas." AS message;'
));
PREPARE alterIfNotExists8 FROM @preparedStatement8;
EXECUTE alterIfNotExists8;
DEALLOCATE PREPARE alterIfNotExists8;

-- Supprimer idx_convention_specifique_unique
SET @preparedStatement9 = (SELECT IF(
  (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS
    WHERE
      (TABLE_SCHEMA = @dbname)
      AND (TABLE_NAME = @tablename)
      AND (INDEX_NAME = 'idx_convention_specifique_unique')
  ) > 0,
  'ALTER TABLE `convention_achevement`
   DROP INDEX `idx_convention_specifique_unique`;',
  'SELECT "L\'index idx_convention_specifique_unique n\'existe pas." AS message;'
));
PREPARE alterIfNotExists9 FROM @preparedStatement9;
EXECUTE alterIfNotExists9;
DEALLOCATE PREPARE alterIfNotExists9;

-- Créer les nouveaux index uniques pour chaque type
SET @preparedStatement10 = (SELECT IF(
  (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS
    WHERE
      (TABLE_SCHEMA = @dbname)
      AND (TABLE_NAME = @tablename)
      AND (INDEX_NAME = 'idx_convention_unique')
  ) > 0,
  'SELECT "L\'index idx_convention_unique existe déjà." AS message;',
  'ALTER TABLE `convention_achevement`
   ADD UNIQUE INDEX `idx_convention_unique` (`convention_id` ASC) USING BTREE;'
));
PREPARE alterIfNotExists10 FROM @preparedStatement10;
EXECUTE alterIfNotExists10;
DEALLOCATE PREPARE alterIfNotExists10;

SET @preparedStatement11 = (SELECT IF(
  (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS
    WHERE
      (TABLE_SCHEMA = @dbname)
      AND (TABLE_NAME = @tablename)
      AND (INDEX_NAME = 'idx_convention_specifique_unique')
  ) > 0,
  'SELECT "L\'index idx_convention_specifique_unique existe déjà." AS message;',
  'ALTER TABLE `convention_achevement`
   ADD UNIQUE INDEX `idx_convention_specifique_unique` (`convention_specifique_id` ASC) USING BTREE;'
));
PREPARE alterIfNotExists11 FROM @preparedStatement11;
EXECUTE alterIfNotExists11;
DEALLOCATE PREPARE alterIfNotExists11;

SET @preparedStatement12 = (SELECT IF(
  (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS
    WHERE
      (TABLE_SCHEMA = @dbname)
      AND (TABLE_NAME = @tablename)
      AND (INDEX_NAME = 'idx_programmation_unique')
  ) > 0,
  'SELECT "L\'index idx_programmation_unique existe déjà." AS message;',
  'ALTER TABLE `convention_achevement`
   ADD UNIQUE INDEX `idx_programmation_unique` (`programmation_id` ASC) USING BTREE;'
));
PREPARE alterIfNotExists12 FROM @preparedStatement12;
EXECUTE alterIfNotExists12;
DEALLOCATE PREPARE alterIfNotExists12;

SET @preparedStatement13 = (SELECT IF(
  (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS
    WHERE
      (TABLE_SCHEMA = @dbname)
      AND (TABLE_NAME = @tablename)
      AND (INDEX_NAME = 'idx_avenant_unique')
  ) > 0,
  'SELECT "L\'index idx_avenant_unique existe déjà." AS message;',
  'ALTER TABLE `convention_achevement`
   ADD UNIQUE INDEX `idx_avenant_unique` (`avenant_id` ASC) USING BTREE;'
));
PREPARE alterIfNotExists13 FROM @preparedStatement13;
EXECUTE alterIfNotExists13;
DEALLOCATE PREPARE alterIfNotExists13;

-- Message de confirmation
SELECT "Migration 062: Ajout du support des programmations et avenants à convention_achevement terminée avec succès." AS message;

