#!/usr/bin/env bash
# ============================================================================
# check_docs.sh · OTO Enterprise OS DTP
# ----------------------------------------------------------------------------
# Contrôle qualité documentaire (gate 4Big, roadmap Sprint 1) :
#   [HARD] Liens Markdown relatifs internes → la cible doit exister.
#   [SOFT] Livrables 05_deliverables_mvp/*.md → auto-score 4Big attendu.
# Dépendances : bash, git, grep, sed. Aucun réseau requis.
# ============================================================================
set -uo pipefail
# shellcheck source=ci/lib.sh
source "$(dirname "${BASH_SOURCE[0]}")/lib.sh" || exit 3
cd_repo_root  # racine du dépôt, ou ROUGE honnête si hors arbre git (cf. lib.sh)

FAIL=0
report() { printf '  \033[31m✗\033[0m %s\n' "$1"; FAIL=1; }
warn()   { printf '  \033[33m⚠\033[0m %s\n' "$1"; }
ok()     { printf '  \033[32m✓\033[0m %s\n' "$1"; }

echo "== 1. Liens Markdown relatifs internes (cible existe ?) =="
broken=0
while read -r md; do
  dir="$(dirname "$md")"
  # Extrait les cibles [texte](cible) ; ignore http(s), mailto, ancres pures,
  # gabarits {{...}} et liens wiki [[...]]. Les code-spans `...` sont d'abord
  # neutralisés : un lien entre backticks n'est PAS cliquable au rendu (c'est un
  # exemple de syntaxe), il ne doit donc jamais être validé comme lien réel.
  sed -E 's/`[^`]*`//g' "$md" 2>/dev/null \
    | grep -oE '\]\([^)]+\)' \
    | sed -E 's/^\]\(//; s/\)$//' \
    | while read -r link; do
        link="${link%% *}"                 # retire un éventuel "titre"
        link="${link%%#*}"                  # retire l'ancre
        [[ -z "$link" ]] && continue
        case "$link" in
          http://*|https://*|mailto:*|tel:*|\#*|\{\{*|data:*) continue ;;
        esac
        target="$dir/$link"
        if [[ ! -e "$target" ]]; then
          printf '  \033[31m✗\033[0m %s → lien cassé : %s\n' "$md" "$link"
          echo "BROKEN" >> /tmp/brokenlinks
        fi
      done
done < <(git ls-files '*.md')
if [[ -s /tmp/brokenlinks ]]; then FAIL=1; rm -f /tmp/brokenlinks; else ok "Aucun lien interne cassé"; fi

echo "== 2. Auto-score 4Big sur les livrables (SOFT · CLAUDE.md #5 · ≥95/100) =="
while read -r md; do
  case "$md" in
    05_deliverables_mvp/daily_reports/*) continue ;;   # rapports : hors gate score
    05_deliverables_mvp/*/fixtures/data_room/*) continue ;;  # fixtures : INPUTS de test synthétiques (cf. publiciste/fixtures/README.md), pas des livrables scorés
  esac
  if grep -qiE 'score|/100' "$md"; then
    ok "$md — mention de score présente"
  else
    warn "$md — pas de mention d'auto-score 4Big (recommandé ≥95/100)"
  fi
done < <(git ls-files '05_deliverables_mvp/*.md')

echo
if [[ "$FAIL" -eq 0 ]]; then
  echo -e "\033[32m✅ Documentation conforme (liens internes OK).\033[0m"
else
  echo -e "\033[31m❌ Lien(s) interne(s) cassé(s) — corriger avant merge.\033[0m"
fi
exit "$FAIL"
