-- MSIN-4482 — Réparer liste inscriptions pour imports hors transaction
-- Contexte : données en BD mais liste / « rapport » trop bas
-- Liste = p.pec_id = e.pec_id_original AND pec_actif = 1
-- Notes : exécution UNIQUEMENT sur dev préprod ; autres env = Navicat structure + sync_static_db
--
-- AVANT : remplacer 1284 par l'eve_id concerné.
-- IMPORTANT : ne PAS forcer pec_id_original = pec_id en masse (UNIQUE pec_id_original → 1062).

SET @eve := 1284;

-- ========== DIAGNOSTIC ==========

SELECT COUNT(*) AS n_participants_import
FROM resultats_participants
WHERE eve_id = @eve AND par_origine = 'import_fichier';

SELECT COUNT(*) AS n_join_ok
FROM resultats_epreuves_commandees e, resultats_participants p
WHERE e.eve_id = @eve
  AND p.pec_id = e.pec_id_original
  AND p.par_origine = 'import_fichier'
  AND p.rol_id NOT IN (3, 4)
  AND e.is_cancelled = 0;

SELECT COUNT(*) AS n_visibles_liste
FROM resultats_epreuves_commandees e, resultats_participants p
WHERE e.eve_id = @eve
  AND p.pec_id = e.pec_id_original
  AND p.par_origine = 'import_fichier'
  AND p.rol_id NOT IN (3, 4)
  AND e.is_cancelled = 0
  AND e.pec_actif = 1;

-- Accroche technique import (p.pec_id = e.pec_id) avant réparation
SELECT COUNT(*) AS n_lie_via_pec_id
FROM resultats_epreuves_commandees e
INNER JOIN resultats_participants p
    ON p.eve_id = e.eve_id AND p.pec_id = e.pec_id
WHERE e.eve_id = @eve
  AND p.par_origine = 'import_fichier';

-- ========== FIX A — pec_actif = 1 (AVANT de bouger p.pec_id) ==========
UPDATE resultats_epreuves_commandees e
INNER JOIN resultats_participants p
    ON p.eve_id = e.eve_id
   AND p.pec_id = e.pec_id
   AND p.par_origine = 'import_fichier'
SET e.pec_actif = 1
WHERE e.eve_id = @eve
  AND e.is_cancelled = 0
  AND IFNULL(e.pec_actif, 0) <> 1;

UPDATE resultats_epreuves_commandees e
SET e.pec_actif = 1
WHERE e.eve_id = @eve
  AND e.no_panier LIKE CONCAT('I', @eve, 'X%')
  AND e.is_cancelled = 0
  AND IFNULL(e.pec_actif, 0) <> 1;

-- ========== FIX B — join sans toucher UNIQUE pec_id_original ==========
-- L'import a souvent p.pec_id = e.pec_id alors que la liste veut p.pec_id = e.pec_id_original.
-- On aligne le participant sur pec_id_original (valeur déjà unique).
UPDATE resultats_participants p
INNER JOIN resultats_epreuves_commandees e
    ON e.eve_id = p.eve_id
   AND e.pec_id = p.pec_id
SET p.pec_id = e.pec_id_original
WHERE p.eve_id = @eve
  AND p.par_origine = 'import_fichier'
  AND e.pec_id_original > 0
  AND p.pec_id <> e.pec_id_original;

-- Optionnel / sûr : pec_id_original := pec_id SEULEMENT s'il n'y a PAS de collision UNIQUE
UPDATE resultats_epreuves_commandees e
INNER JOIN resultats_participants p
    ON p.eve_id = e.eve_id
   AND (p.pec_id = e.pec_id OR p.pec_id = e.pec_id_original)
   AND p.par_origine = 'import_fichier'
LEFT JOIN resultats_epreuves_commandees conflict
    ON conflict.pec_id_original = e.pec_id
   AND conflict.pec_id <> e.pec_id
SET e.pec_id_original = e.pec_id
WHERE e.eve_id = @eve
  AND e.pec_id_original <> e.pec_id
  AND conflict.pec_id IS NULL;

-- Si l'optionnel a bougé pec_id_original, ré-aligner p.pec_id
UPDATE resultats_participants p
INNER JOIN resultats_epreuves_commandees e
    ON e.eve_id = p.eve_id
   AND e.no_panier LIKE CONCAT('I', @eve, 'X%')
   AND e.no_panier = p.no_panier
SET p.pec_id = e.pec_id_original
WHERE p.eve_id = @eve
  AND p.par_origine = 'import_fichier'
  AND e.pec_id_original > 0
  AND p.pec_id <> e.pec_id_original;

-- ========== CONTRÔLE ==========
SELECT COUNT(*) AS n_visibles_liste_apres
FROM resultats_epreuves_commandees e, resultats_participants p
WHERE e.eve_id = @eve
  AND p.pec_id = e.pec_id_original
  AND p.par_origine = 'import_fichier'
  AND p.rol_id NOT IN (3, 4)
  AND e.is_cancelled = 0
  AND e.pec_actif = 1;
-- Attendu : proche de n_participants_import.
