#!/usr/bin/env bash
# Vérifie l'artefact de déploiement déballé dans dist/ (contre-test des garde-fous du
# .cpanel.yml, story BE-46).
#
# Usage : bash scripts/verifier-artefact.sh [DIST]   (défaut : dist/)
# Sortie : 0 si l'artefact est complet, sans secret et sans dépendance de développement ;
#          1 sinon.

set -uo pipefail

DIST="${1:-dist}"

if [[ ! -d "$DIST" ]]; then
  echo "ERREUR : dossier d'artefact '$DIST' introuvable." >&2
  exit 1
fi

ERREURS=0

exiger_presence() {
  local description="$1" chemin="$2"
  if [[ ! -e "$DIST/$chemin" ]]; then
    echo "MANQUANT : $description ($chemin)" >&2
    ERREURS=1
  fi
}

exiger_absence() {
  local description="$1" chemin="$2"
  if [[ -e "$DIST/$chemin" ]]; then
    echo "INTERDIT : $description ($chemin)" >&2
    ERREURS=1
  fi
}

# Ce que le .cpanel.yml exige pour accepter de déployer.
exiger_presence "console artisan" artisan
exiger_presence "manifeste composer" composer.json
exiger_presence "verrou composer" composer.lock
exiger_presence "amorçage de l'application" bootstrap/app.php
exiger_presence "point d'entrée web" public/index.php
exiger_presence "autochargeur des dépendances" vendor/autoload.php
exiger_presence "configuration" config/app.php
exiger_presence "routes" routes
exiger_presence "catalogues de traduction" lang
exiger_presence "marqueur de version" VERSION

# Ce qui ne doit jamais partir en production.
exiger_absence "configuration d'environnement — les secrets restent hors dépôt (DEP-16)" .env
exiger_absence "suite de tests" tests
exiger_absence "dépôt git" .git

if [[ -f "$DIST/VERSION" ]] && [[ -z "$(tr -cd 'A-Za-z0-9._-' < "$DIST/VERSION")" ]]; then
  echo "ERREUR : VERSION vide ou sans caractère exploitable." >&2
  ERREURS=1
fi

# `--no-dev` : une dépendance de développement dans vendor/ signe un artefact mal produit.
if [[ -f "$DIST/vendor/composer/installed.json" ]] &&
   grep -q '"name": *"phpunit/phpunit"' "$DIST/vendor/composer/installed.json"; then
  echo "ERREUR : dépendances de développement présentes dans vendor/ (artefact non --no-dev)." >&2
  ERREURS=1
fi

# Contre-fuite : aucun secret dans l'artefact. `exiger_absence .env` ne couvre que la
# racine, or `publier-artefact.sh` fait `git add --force -- dist` : ce qui traîne dans
# l'arborescence part dans l'historique du dépôt, definitivement. Le service signe ses
# jetons RS256 avec `storage/oauth/*.key` (Passport::loadKeysFrom, BE-08) — une clé privée
# publiée, c'est la capacité de forger un jeton pour n'importe quel compte de n'importe
# quelle entreprise. Même passe que le vérificateur du front (FE-02).
# `vendor/` est écarté : les fixtures de clés des dépendances ne sont pas nos secrets.
for motif in ".env" ".env.*" "*.pem" "*.key" "*.p12" "id_rsa" "credentials" "credentials.json"; do
  if find "$DIST" -name "$motif" -not -path "*/vendor/*" -not -name '.env.example' | grep -q .; then
    echo "ERREUR : secret détecté dans l'artefact ($motif) — publication refusée." >&2
    ERREURS=1
  fi
done
if grep -rlE "(ghp_[A-Za-z0-9]{36}|github_pat_[A-Za-z0-9_]{22,}|AKIA[0-9A-Z]{16}|BEGIN (RSA |EC |OPENSSH |DSA )?PRIVATE KEY)" "$DIST" --exclude-dir=vendor >/dev/null 2>&1; then
  echo "ERREUR : clé privée ou jeton détecté dans l'artefact — publication refusée." >&2
  ERREURS=1
fi

if [[ "$ERREURS" -ne 0 ]]; then
  echo "Artefact non conforme." >&2
  exit 1
fi

echo "Artefact complet et conforme (version $(tr -d '\n' < "$DIST/VERSION"))."
