-- =====================================================
-- Script d'ajout de contraintes pour éviter les doublons
-- et ajout du champ ical_uid pour l'intégration iCalendar
-- =====================================================

-- Ajout du champ ical_uid si non existant
ALTER TABLE appointments 
ADD COLUMN IF NOT EXISTS ical_uid VARCHAR(255) COMMENT 'identifiant iCalendar (iCalUId Graph API)';

-- Ajout d'un index sur ical_uid pour optimiser les recherches
ALTER TABLE appointments
ADD INDEX IF NOT EXISTS idx_ical_uid (ical_uid);

-- Ajout contrainte d'unicité sur ical_uid (pour éviter doublons M365)
ALTER TABLE appointments
ADD UNIQUE KEY IF NOT EXISTS unique_ical_uid (ical_uid);

-- 1. Supprimer les doublons existants avant d'ajouter les contraintes
-- Garder seulement le premier appointment pour chaque créneau
UPDATE appointments a1
INNER JOIN (
    SELECT MIN(id) as keep_id, customer_id, start_datetime
    FROM appointments
    WHERE status IN ('CONFIRMED', 'PENDING')
    GROUP BY customer_id, start_datetime
    HAVING COUNT(*) > 1
) dups ON a1.customer_id = dups.customer_id 
       AND a1.start_datetime = dups.start_datetime
       AND a1.id != dups.keep_id
SET a1.status = 'CANCELLED'
WHERE a1.status IN ('CONFIRMED', 'PENDING');

-- 2. Ajouter index unique pour empêcher un client d'avoir plusieurs RDV au même moment
-- Note: MySQL ne supporte pas WHERE dans UNIQUE KEY, on doit utiliser une approche différente
ALTER TABLE appointments 
ADD UNIQUE KEY unique_customer_active_slot (customer_id, start_datetime, status);

-- 3. Ajouter index unique pour empêcher plusieurs RDV actifs sur le même créneau
-- (si on veut UN SEUL RDV par créneau, peu importe le consultant)
ALTER TABLE appointments 
ADD UNIQUE KEY unique_timeslot_active (start_datetime, end_datetime);

-- 4. Index pour améliorer les performances des requêtes de vérification
ALTER TABLE appointments 
ADD INDEX idx_datetime_status (start_datetime, end_datetime, status);

-- 5. Index pour la table availability_cache
ALTER TABLE availability_cache
ADD INDEX idx_slot_datetime (slot_start, slot_end);

-- 6. Si on veut être encore plus strict : trigger pour vérifier les chevauchements
DELIMITER $$

CREATE TRIGGER prevent_overlapping_appointments
BEFORE INSERT ON appointments
FOR EACH ROW
BEGIN
    DECLARE overlap_count INT;
    
    IF NEW.status IN ('CONFIRMED', 'PENDING') THEN
        SELECT COUNT(*) INTO overlap_count
        FROM appointments
        WHERE status IN ('CONFIRMED', 'PENDING')
        AND NEW.start_datetime < end_datetime
        AND NEW.end_datetime > start_datetime
        AND id != NEW.id;
        
        IF overlap_count > 0 THEN
            SIGNAL SQLSTATE '45000'
            SET MESSAGE_TEXT = 'Cannot create overlapping appointments';
        END IF;
    END IF;
END$$

DELIMITER ;

-- 7. Afficher les contraintes créées
SHOW INDEX FROM appointments;
SHOW TRIGGERS;