-- ===========================================
-- Migration 012 : le LMS consomme compte.fusionne
-- ===========================================
-- Ticket Manager #2039. Jusqu'ici seul QALIOPI recevait compte.fusionne (migration 009).
-- Le LMS gardait donc un compte par fiche d'origine : apres une fusion a l'Ecole, l'eleve
-- connecte avec l'adresse de la fiche conservee ne voyait pas les cours restes sur le compte
-- de la fiche absorbee (5 personnes sur les 12 fusions faites au 02/10/2026).
--
-- Flux : Ecole emet --> API Centrale (bus) --> QALIOPI (inchange) + LMS (nouveau)
--   - Emetteur     : Ecole, User::publishCompteFusionne, apres le commit d'une fusion.
--   - Consommateur : LMS, WebhookHandlerService::handleCompteFusionne
--                    (FusionCompteService) : rapatrie les inscriptions sur le compte du
--                    maitre, reunit les formations en double, pose l'adresse de reference.
--   - QALIOPI ne lit que email_principal / emails_fusionnes / user_id_principal : les cles
--     ajoutees pour le LMS ne changent rien pour lui.
--
-- SECRET HMAC : repris d'un abonnement LMS actif (meme secret pour toutes les livraisons
--   vers le LMS). Verifier la premiere livraison en HTTP 200.
--
-- payload_schema : documentaire (NON valide par le bus). Celui de 009 decrivait un payload
--   qui n'a jamais ete emis (master_user_id, merged_user_ids...) : corrige ici sur le payload
--   reel, relu sur User::publishCompteFusionne.
-- ===========================================

-- -------------------------------------------
-- 1. Schema documentaire : le payload reellement emis
-- -------------------------------------------
UPDATE event_types
   SET payload_schema = JSON_OBJECT(
         'email_principal',       'string  requis  adresse de reference posee sur le compte conserve',
         'emails_fusionnes',      'array<string>  requis  adresses qui ne sont plus la principale',
         'user_id_principal',     'number  requis  id Ecole du compte conserve',
         'user_ids_fusionnes',    'array<number>  optionnel  ids Ecole des comptes absorbes (#2039)',
         'dossiers_du_principal', 'array<{inscription_id, formation_id}>  optionnel  dossiers du compte conserve apres fusion (#2039)',
         'identite',              'object  optionnel  {prenom, nom}',
         'date_fusion',           'string  optionnel  horodatage ISO8601'
       )
 WHERE slug = 'compte.fusionne';

-- -------------------------------------------
-- 2. Subscription : le LMS consomme compte.fusionne
--    (secret repris d'un abonnement LMS actif — vrai secret en prod)
-- -------------------------------------------
SET @lms_secret := (
  SELECT s.secret
  FROM subscriptions s
  JOIN apps a ON a.id = s.app_id
  WHERE a.slug = 'lms' AND s.is_active = 1
  ORDER BY s.id
  LIMIT 1
);

INSERT IGNORE INTO subscriptions (app_id, event_type_id, callback_url, secret)
SELECT (SELECT id FROM apps WHERE slug = 'lms'),
       (SELECT id FROM event_types WHERE slug = 'compte.fusionne'),
       'https://formations.altheaprovence.com/api/webhooks/central',
       @lms_secret
FROM DUAL
WHERE @lms_secret IS NOT NULL
  -- Rejouable : pas de second abonnement si la migration repasse.
  AND NOT EXISTS (
    SELECT 1 FROM subscriptions s2
    WHERE s2.app_id = (SELECT id FROM apps WHERE slug = 'lms')
      AND s2.event_type_id = (SELECT id FROM event_types WHERE slug = 'compte.fusionne')
  );
