-- Migration: Ajouter le support des conventions spécifiques à convention_comites
-- Date: 2025-11-11
-- Description: Ajoute convention_specifique_id et entity_type pour supporter les conventions spécifiques

-- Étape 1: Supprimer temporairement la contrainte de clé étrangère existante (si elle existe)
SET @constraint_name = NULL;
SELECT CONSTRAINT_NAME INTO @constraint_name
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = DATABASE()
  AND TABLE_NAME = 'convention_comites'
  AND COLUMN_NAME = 'convention_id'
  AND REFERENCED_TABLE_NAME = 'conventions'
LIMIT 1;

SET @drop_constraint = IF(@constraint_name IS NOT NULL,
    CONCAT('ALTER TABLE `convention_comites` DROP FOREIGN KEY `', @constraint_name, '`;'),
    'SELECT "Contrainte non trouvée ou déjà supprimée." AS message;');

PREPARE stmt FROM @drop_constraint;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

-- Étape 2: Rendre convention_id nullable (car il peut être null si convention_specifique_id est utilisé)
ALTER TABLE `convention_comites` 
MODIFY COLUMN `convention_id` INT NULL DEFAULT NULL COMMENT "ID de la convention (peut être null si convention_specifique_id est utilisé)";

-- Étape 3: Ajouter les colonnes convention_specifique_id et entity_type
ALTER TABLE `convention_comites` 
ADD COLUMN `convention_specifique_id` INT NULL DEFAULT NULL COMMENT "ID de la convention spécifique" AFTER `convention_id`,
ADD COLUMN `entity_type` ENUM('Convention', 'Convention_Specifique') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT 'Convention' COMMENT "Type d'entité" AFTER `convention_specifique_id`;

-- Étape 4: Recréer la contrainte de clé étrangère pour convention_id (maintenant nullable)
ALTER TABLE `convention_comites`
ADD CONSTRAINT `convention_comites_ibfk_1` FOREIGN KEY (`convention_id`) REFERENCES `conventions` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT;

-- Étape 5: Ajouter les index
ALTER TABLE `convention_comites`
ADD INDEX `idx_convention_specifique` (`convention_specifique_id` ASC) USING BTREE,
ADD INDEX `idx_entity_type` (`entity_type` ASC) USING BTREE;

-- Étape 6: Ajouter la contrainte de clé étrangère pour convention_specifique_id
ALTER TABLE `convention_comites`
ADD CONSTRAINT `convention_comites_ibfk_2` FOREIGN KEY (`convention_specifique_id`) REFERENCES `convention_specifique` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT;

-- Étape 7: Mettre à jour les données existantes pour avoir entity_type = 'Convention'
UPDATE `convention_comites` SET `entity_type` = 'Convention' WHERE `entity_type` IS NULL AND `convention_id` IS NOT NULL;

-- Étape 8: Mettre à jour l'index unique pour prendre en compte convention_specifique_id
-- Supprimer l'ancien index unique (s'il existe)
SET @index_name = NULL;
SELECT INDEX_NAME INTO @index_name
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
  AND TABLE_NAME = 'convention_comites'
  AND INDEX_NAME = 'unique_convention_comite'
LIMIT 1;

SET @drop_index = IF(@index_name IS NOT NULL,
    'ALTER TABLE `convention_comites` DROP INDEX `unique_convention_comite`;',
    'SELECT "Index unique_convention_comite non trouvé ou déjà supprimé." AS message;');

PREPARE stmt2 FROM @drop_index;
EXECUTE stmt2;
DEALLOCATE PREPARE stmt2;

-- Recréer l'index unique pour gérer convention_id (peut être null)
ALTER TABLE `convention_comites`
ADD UNIQUE INDEX `unique_convention_comite` (`convention_id` ASC, `type_comite` ASC) USING BTREE;

-- Ajouter l'index unique pour convention_specifique_id (peut être null)
ALTER TABLE `convention_comites`
ADD UNIQUE INDEX `unique_convention_specifique_comite` (`convention_specifique_id` ASC, `type_comite` ASC) USING BTREE;

