#!/usr/bin/env bash
# appliquer_typologie.sh — applique la typologie arbitrée le 25/08 (GO Enguerran,
# §9 de docs/context/STRUCTURATION_GITHUB_2026-08-24.md, PR #663).
#
# ⚠️ RÉSERVE ACTÉE : préparation OUI, application à une FRONTIÈRE annoncée —
#   jamais pendant que la recette vit. Ce script existe pour que la frontière
#   soit UN geste rejouable, pas une matinée de clics. Par défaut il ne fait
#   RIEN (répétition à sec) ; l'application réelle exige --appliquer.
#
# CE QU'IL FAIT (les deux dépôts) :
#   1. renomme type:feat → type:dev et type:fix → type:bug — un renommage
#      GitHub SUIT les issues : les rattachements sont conservés ;
#   2. crée type:doc et type:run ;
#   3. fusionne type:sec dans `securite` (drapeau transversal ≠ nature) :
#      ajoute `securite` à chaque issue porteuse, puis SUPPRIME type:sec ;
#   4. ventile type:infra selon la table lue issue par issue le 25/08
#      (consignée au §9) : dev = construire, run = exploiter ; puis SUPPRIME
#      type:infra. Une issue infra hors table = REFUS (liste à compléter,
#      jamais un choix silencieux) ;
#   5. FRONT : crée la famille complète (aucun type:* n'y existe).
#
# Convention de nommage : sans espace (type:dev), comme la famille existante.

set -euo pipefail
MODE="${1:---dry-run}"
[ "$MODE" = "--dry-run" ] || [ "$MODE" = "--appliquer" ] || { echo "usage : $0 [--dry-run|--appliquer]" >&2; exit 2; }
SEC=$([ "$MODE" = "--dry-run" ] && echo "echo   [à-sec]" || echo "")

# La ventilation de type:infra — lue issue par issue le 25/08 (BACK).
INFRA_DEV="658 644 622 439 393 304 27"
INFRA_RUN="649 646 307 305 303 302 301 181 157 156 137 136 12"

for DEPOT in AAZTEKDEV/EFEKTIVACADEMIE-BACK AAZTEKDEV/EFEKTIVACADEMIE-FRONT; do
  echo "═══ $DEPOT ═══"
  existe() { gh label list --repo "$DEPOT" --limit 200 --json name --jq '.[].name' | grep -qxF "$1"; }

  # 1-2. renommages (rattachements conservés)
  for R in "type:feat type:dev" "type:fix type:bug"; do
    set -- $R
    if existe "$1"; then $SEC gh label edit "$1" --repo "$DEPOT" --name "$2"
    elif existe "$2"; then echo "   $2 déjà en place"
    else $SEC gh label create "$2" --repo "$DEPOT" --color 1d76db --description "Typologie 25/08"
    fi
  done
  # 2 bis. créations
  for L in "type:doc" "type:run"; do
    existe "$L" && echo "   $L déjà en place" || $SEC gh label create "$L" --repo "$DEPOT" --color 5319e7 --description "Typologie 25/08"
  done
  # 3. fusion type:sec → securite
  if existe "type:sec"; then
    existe "securite" || $SEC gh label create "securite" --repo "$DEPOT" --color d93f0b
    for N in $(gh issue list --repo "$DEPOT" --label "type:sec" --state all --limit 100 --json number --jq '.[].number'); do
      $SEC gh issue edit "$N" --repo "$DEPOT" --add-label "securite"
    done
    $SEC gh label delete "type:sec" --repo "$DEPOT" --yes
  fi
  # 4. ventilation type:infra (BACK seul en pratique)
  if existe "type:infra"; then
    for N in $(gh issue list --repo "$DEPOT" --label "type:infra" --state all --limit 100 --json number --jq '.[].number'); do
      if   echo " $INFRA_DEV " | grep -q " $N ";  then $SEC gh issue edit "$N" --repo "$DEPOT" --add-label "type:dev"
      elif echo " $INFRA_RUN " | grep -q " $N ";  then $SEC gh issue edit "$N" --repo "$DEPOT" --add-label "type:run"
      else echo "   ⛔ REFUS : #$N porte type:infra et n'est PAS dans la table de ventilation — compléter la table (§9), jamais choisir en silence." >&2; exit 1
      fi
    done
    $SEC gh label delete "type:infra" --repo "$DEPOT" --yes
  fi
  echo "   bilan familles type:* : $(gh label list --repo "$DEPOT" --limit 200 --json name --jq '[.[].name|select(startswith("type:"))]|join(" · ")')"
done
echo
[ "$MODE" = "--dry-run" ] && echo "RÉPÉTITION À SEC terminée — rien n'a été modifié. Application réelle : $0 --appliquer (à la FRONTIÈRE annoncée uniquement)." || echo "APPLIQUÉ."
