-- ===========================================
-- Migration 011 : Enregistrement des event types session.updated et session.deleted
-- ===========================================
-- Sens unique Ecole --> LMS (calque sur 010 compte.email_modifie).
-- Tickets : Ecole #2018, LMS #2017 (plateforme « Teachizy » du Manager). 01/10/2026.
--
-- Flux : Ecole emet --> API Centrale (bus) --> LMS (consommateur)
--   - Emetteur     : Ecole, App\Sessions\PublicationLms (construireEtat = source unique du
--                    payload). Rattrapage par empreinte toutes les 5 minutes
--                    (scripts/publier-sessions-lms.php) + publication immediate apres une
--                    ecriture depuis les ecrans d administration des sessions.
--                    Seules les sessions des formations EN LIGNE sont publiees.
--   - Consommateur : LMS, WebhookHandlerService::handleSessionUpdated / handleSessionDeleted
--                    -> EcoleSessionService::synchroniser. Le LMS recopie l etat dans ses tables
--                    miroir et affiche les journees dans le calendrier du cours, pour les seuls
--                    participants de la session.
--   - QALIOPI et le Dashboard ne sont PAS abonnes.
--
-- session.updated porte un ETAT COMPLET (jamais un differentiel) : rejouable sans risque.
-- emitted_at (instant de lecture cote Ecole, avec decalage) rend la cle d idempotence unique
-- et sert au LMS a ignorer un etat plus ancien que celui deja applique.
--
-- DONNEES PERSONNELLES : le payload porte l adresse email des participants, rien d autre.
--
-- 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), relu sur PublicationLms.php.
-- ===========================================

-- -------------------------------------------
-- 1. Types d evenement (allowlist du bus)
-- -------------------------------------------
INSERT IGNORE INTO event_types (slug, description, source_app_id, payload_schema) VALUES
('session.updated',
 'Etat complet d une session de webinaires : champs, journees, participants confirmes (emis par Ecole)',
 (SELECT id FROM apps WHERE slug = 'ecole'),
 JSON_OBJECT(
   'session_id',   'number  requis  formation_sessions.id',
   'formation_id', 'number  requis  id Ecole de la formation',
   'name',         'string  requis  nom de la session',
   'status',       'string  requis  draft | open | in_progress | completed | closed | cancelled',
   'start_date',   'string|null  AAAA-MM-JJ',
   'end_date',     'string|null  AAAA-MM-JJ',
   'timezone',     'string  requis  Europe/Paris (les horaires des journees sont des heures de Paris)',
   'emitted_at',   'string  requis  ISO8601 avec decalage, instant de lecture en base',
   'days',         'array  requis  [{day_id, day_number, date, start_time, end_time, label, meeting_link}]',
   'participants', 'array  requis  [{invitation_id, inscription_id, user_id, email}] invitations confirmees'
 )
),
('session.deleted',
 'Session disparue cote Ecole, ou formation qui n est plus en ligne (emis par Ecole)',
 (SELECT id FROM apps WHERE slug = 'ecole'),
 JSON_OBJECT(
   'session_id', 'number  requis  formation_sessions.id',
   'emitted_at', 'string  requis  ISO8601 avec decalage'
 )
);

-- -------------------------------------------
-- 2. Subscriptions : le LMS consomme les deux types
--    (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'),
       et.id,
       'https://formations.altheaprovence.com/api/webhooks/central',
       @lms_secret
FROM event_types et
WHERE et.slug IN ('session.updated', 'session.deleted')
  AND @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 = et.id
  );
