#!/usr/bin/env bash
set -euo pipefail

ROOT="${1:-}"
ERRORS=0
WARNINGS=0

usage() {
  echo "Usage: ./module5d-validate-delivery.sh /chemin/projet-reseau-soria" >&2
}

fail() {
  echo "[ERREUR] $*" >&2
  ERRORS=$((ERRORS + 1))
}

warn() {
  echo "[AVERTISSEMENT] $*" >&2
  WARNINGS=$((WARNINGS + 1))
}

ok() {
  echo "[OK] $*"
}

[[ -n "$ROOT" ]] || { usage; exit 2; }
[[ -d "$ROOT" ]] || { echo "Répertoire absent : $ROOT" >&2; exit 2; }
ROOT="$(cd "$ROOT" && pwd)"

required=(
  "00-readme.md"
  "01-synthese-executive.md"
  "02-exigences-hypotheses.md"
  "03-architecture/decisions.md"
  "04-adressage/plan-ip.csv"
  "04-adressage/vlan.csv"
  "05-flux/matrice-flux.csv"
  "06-dimensionnement/ports-poe.md"
  "09-recette/plan-recette.csv"
  "10-exploitation/supervision.md"
  "10-exploitation/sauvegarde.md"
  "11-risques-limites.md"
  "12-rollback.md"
  "13-soutenance/plan-soutenance.md"
)

for item in "${required[@]}"; do
  if [[ -s "$ROOT/$item" ]]; then
    ok "$item"
  else
    fail "Livrable absent ou vide : $item"
  fi
done

if find "$ROOT" -type f \( -iname '*.key' -o -iname '*private*key*' -o -iname 'id_rsa' -o -iname 'id_ed25519' \) -print -quit | grep -q .; then
  fail "Fichier ressemblant à une clé privée détecté."
fi

secret_regex='(BEGIN (RSA |OPENSSH |EC )?PRIVATE KEY|PrivateKey[[:space:]]*=|PresharedKey[[:space:]]*=|api[_-]?key[[:space:]]*[=:]|token[[:space:]]*[=:]|password[[:space:]]*[=:])'
if command -v grep >/dev/null 2>&1; then
  matches="$(find "$ROOT" -type f \
    ! -name '*.pkt' ! -name '*.png' ! -name '*.jpg' ! -name '*.jpeg' ! -name '*.pdf' \
    -size -5M -print0 \
    | xargs -0 grep -nEI "$secret_regex" 2>/dev/null || true)"
  if [[ -n "$matches" ]]; then
    warn "Motifs sensibles potentiels détectés ; revue manuelle obligatoire :"
    printf '%s\n' "$matches" | head -n 20 >&2
  else
    ok "Aucun motif sensible évident dans les fichiers texte"
  fi
fi

if [[ -f "$ROOT/09-recette/plan-recette.csv" ]]; then
  header="$(head -n 1 "$ROOT/09-recette/plan-recette.csv")"
  for column in id scenario expected_result evidence status; do
    if [[ ",$header," != *",$column,"* ]]; then
      fail "Colonne requise absente du plan de recette : $column"
    fi
  done
fi

if [[ -f "$ROOT/grille-evaluation.csv" ]]; then
  total="$(awk -F, 'NR>1 && $1!="TOTAL" {sum+=$2} END {print sum+0}' "$ROOT/grille-evaluation.csv")"
  if [[ "$total" == "100" ]]; then
    ok "Poids de la grille = 100"
  else
    fail "Poids de la grille = $total au lieu de 100"
  fi
else
  warn "grille-evaluation.csv non copiée à la racine du dossier"
fi

if [[ -d "$ROOT/09-recette/preuves" ]]; then
  proof_count="$(find "$ROOT/09-recette/preuves" -type f | wc -l | tr -d ' ')"
  if [[ "$proof_count" -gt 0 ]]; then
    ok "$proof_count preuve(s) de recette présente(s)"
  else
    warn "Le dossier de preuves est vide"
  fi
else
  warn "Dossier 09-recette/preuves absent"
fi

if find "$ROOT" -type f -size +50M -print -quit | grep -q .; then
  warn "Au moins un fichier dépasse 50 Mo ; documente son utilité et son mode de transfert."
fi

printf '\nRésumé : %d erreur(s), %d avertissement(s).\n' "$ERRORS" "$WARNINGS"
[[ "$ERRORS" -eq 0 ]]
