#!/usr/bin/env bash
#
# Répétition générale — critère d'acceptation de l'issue #156 (runbook §3 ter) :
#
#   « la séquence complète passe DEUX FOIS D'AFFILÉE, la seconde en no-op,
#     sans intervention manuelle, vérifications au vert. »
#
# Ce script joue exactement cela, et le PROUVE au lieu de l'affirmer :
#
#   passe 1 — dump restauré, base convertie, migrée, clés étrangères posées ;
#   passe 2 — même commande, sans rien changer : rien à restaurer, 0 table à convertir,
#             0 colonne à réaligner, « Nothing to migrate », 0 orphelin, 0 clé à créer ;
#   contrôle final — l'empreinte du schéma est IDENTIQUE entre les deux passes, et les
#             comptages métier n'ont pas bougé.
#
# L'empreinte est le juge : deux journaux qui se ressemblent ne prouvent rien, deux
# empreintes SHA-256 identiques prouvent que la seconde passe n'a rien modifié.
#
set -u -o pipefail

ICI="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BASE="${BASE:-efektiv_testing_156}"
DUMP="${DUMP:-}"
JOURNAL="${JOURNAL:-$(mktemp -d "${TMPDIR:-/tmp}/repetition156.XXXXXX")}"
ARGS=("$@")

[ -n "$DUMP" ] || { echo "Usage : DUMP=<dump.sql> [BASE=…] [JOURNAL=…] repetition.sh [options de bascule_base.sh]" >&2; exit 2; }

mkdir -p "$JOURNAL/passe1" "$JOURNAL/passe2"
echec() { printf '\n!! ÉCHEC — %s\n' "$1" >&2; exit 1; }

printf '########## PASSE 1 — dump frais, séquence complète ##########\n'
bash "$ICI/bascule_base.sh" --base "$BASE" --dump "$DUMP" --forcer-restauration \
    --journal "$JOURNAL/passe1" "${ARGS[@]}" 2>&1 | tee "$JOURNAL/passe1.log"
[ "${PIPESTATUS[0]}" -eq 0 ] || echec "la passe 1 n'est pas allée au bout"

printf '\n########## PASSE 2 — même commande, sans intervention ##########\n'
bash "$ICI/bascule_base.sh" --base "$BASE" --dump "$DUMP" \
    --journal "$JOURNAL/passe2" "${ARGS[@]}" 2>&1 | tee "$JOURNAL/passe2.log"
[ "${PIPESTATUS[0]}" -eq 0 ] || echec "la passe 2 n'est pas allée au bout"

printf '\n########## CONTRÔLE DU NO-OP ##########\n'
E1="$(cat "$JOURNAL/passe1/empreinte-schema.txt")"
E2="$(cat "$JOURNAL/passe2/empreinte-schema.txt")"
printf '   empreinte passe 1 : %s\n   empreinte passe 2 : %s\n' "$E1" "$E2"
[ "$E1" = "$E2" ] || echec "le schéma a changé entre les deux passes"
printf '   ✓ schéma identique\n'

verifier_noop() {  # $1 = libellé, puis un ou plusieurs motifs acceptables
    local libelle="$1"; shift
    local motif
    for motif in "$@"; do
        if grep -qF "$motif" "$JOURNAL/passe2.log"; then
            printf '   ✓ %-34s « %s »\n' "$libelle" "$motif"; return
        fi
    done
    printf '   ✗ %-34s aucun des motifs attendus dans la passe 2\n' "$libelle"; NOOP=1
}
NOOP=0
verifier_noop "restauration"  "restauration ignorée (no-op)"
verifier_noop "conversion InnoDB"  "0 table à convertir — no-op."
verifier_noop "alignement des types"  "0 colonne à réaligner — no-op."
verifier_noop "migrations"  "aucune migration en attente : no-op."
# Plus aucune FK ne manquant, le contrôle d'orphelins n'a plus rien à interroger : c'est
# la même absence d'effet, dite par l'autre bout. Les deux formulations sont acceptées.
verifier_noop "contrôle des orphelins"  "aucune clé étrangère manquante — no-op." \
                                        "0 orphelin sur l'ensemble des relations à poser."
verifier_noop "clés étrangères"  "0 clé étrangère à créer — no-op."
[ "$NOOP" -eq 0 ] || echec "la passe 2 n'est pas un no-op complet"

printf '\n   Les comptages métier des deux passes :\n'
diff <(sed -n '/comptages métier/,/empreinte/p' "$JOURNAL/passe1.log") \
     <(sed -n '/comptages métier/,/empreinte/p' "$JOURNAL/passe2.log") \
    && printf '   ✓ comptages métier inchangés\n' \
    || echec "les comptages métier ont bougé entre les deux passes"

printf '\n=== RÉPÉTITION VALIDÉE — critère #156 atteint. Journal : %s ===\n' "$JOURNAL"
