-- ===========================================
-- Migration 004 : Idempotency key sur events
-- ===========================================
-- Permet aux emetteurs de garantir l'unicite d'un event cote bus
-- via le header X-Idempotency-Key.
-- Cas d'usage principal : replay d'historique (ex: Ecole rejoue 589 Q WP
-- sans creer de doublons dans `events`).
--
-- Comportement : si un POST /events arrive avec un X-Idempotency-Key
-- deja present dans `events.idempotency_key`, le bus retourne le event_id
-- existant sans creer de nouvel event ni de nouvelles deliveries.
--
-- ⚠️  PERF PROD : cette migration ajoute une colonne + un index UNIQUE sur la
-- table `events`. Sur une table volumineuse (> 1M lignes), MySQL fait un
-- rebuild/copy qui peut prendre plusieurs minutes avec un lock ecriture.
-- Recommandations :
--   - Appliquer en fenetre de faible trafic (nuit, week-end)
--   - Verifier la taille avant : SELECT COUNT(*) FROM events
--   - Si > 100k lignes, envisager pt-online-schema-change ou gh-ost en prod
--   - En staging / dev : pas d'enjeu
-- ===========================================

ALTER TABLE events
  ADD COLUMN idempotency_key VARCHAR(128) NULL AFTER source_app_id,
  ADD UNIQUE INDEX uq_source_idempotency (source_app_id, idempotency_key);

-- L'index composite (source_app_id, idempotency_key) evite qu'une app A et une
-- app B collisionnent sur la meme cle (ex: "qresp_42" cote Ecole vs cote LMS).
-- Une app ne peut pas reutiliser une cle pour son propre compte, mais les cles
-- ne sont pas globalement uniques entre apps.
--
-- Note MySQL : les valeurs NULL ne sont pas considerees egales par un index
-- UNIQUE, donc on peut avoir N events avec idempotency_key=NULL (events emis
-- sans header X-Idempotency-Key).
--
-- -------------------------------------------
-- ROLLBACK (en cas de besoin, a executer manuellement) :
-- -------------------------------------------
-- ALTER TABLE events
--   DROP INDEX uq_source_idempotency,
--   DROP COLUMN idempotency_key;
-- DELETE FROM migrations WHERE filename = '004_events_idempotency_key.sql';
