#!/usr/bin/env bash
# Mon fournil : l'environnement de production (ou de déploiement) a-t-il ce qu'il faut pour
# « bash scripts/fournil.sh controler » ? Aucun Node requis : la production déploie le dist commité.
#   bash scripts/fournil/environnement.sh
# Autonome (ne charge pas fournil.sh), une ligne par contrôle, code de retour 1 au premier manquement.
# Vérifie la présence des outils et leur comportement : empreinte connue par sha256sum, tri par octets de
# sort (LC_ALL=C), chaîne find | sort | xargs sha256sum | sha256sum | cut, puis « controler » si le dist est là.

echecs=0

ligne() {
    if [ "$1" -eq 0 ]; then
        echo "OK     $2"
    else
        echo "ÉCHEC  $2"
        echecs=$((echecs + 1))
    fi
}

# 1. bash : 3.2 au moins (set -o pipefail, ${BASH_SOURCE[0]}, [[ ]]).
if [ -n "${BASH_VERSINFO[0]:-}" ] && { [ "${BASH_VERSINFO[0]}" -gt 3 ] || { [ "${BASH_VERSINFO[0]}" -eq 3 ] && [ "${BASH_VERSINFO[1]}" -ge 2 ]; }; }; then
    ligne 0 "bash ${BASH_VERSION} (3.2 ou plus)"
else
    ligne 1 "bash ${BASH_VERSION:-absent} : 3.2 ou plus requis"
fi
if (set -o pipefail) 2> /dev/null; then
    ligne 0 "bash : set -o pipefail accepté"
else
    ligne 1 "bash : set -o pipefail refusé"
fi

# 2. Outils présents.
for outil in find sort xargs sha256sum cut head wc dirname; do
    if command -v "$outil" > /dev/null 2>&1; then
        ligne 0 "$outil présent ($(command -v "$outil"))"
    else
        ligne 1 "$outil absent"
    fi
done

# 3. Comportements.
attendue="78492677f434e348077716cf98a827644617037b6afa10742b04d1321d658284"
obtenue="$(printf 'coop-pains\n' | sha256sum 2> /dev/null | cut -d' ' -f1)"
if [ "$obtenue" = "$attendue" ]; then
    ligne 0 "sha256sum : empreinte de référence exacte"
else
    ligne 1 "sha256sum : empreinte ${obtenue:-vide} au lieu de $attendue"
fi

tri="$(printf 'b\nB\na\n' | LC_ALL=C sort 2> /dev/null | tr '\n' ' ')"
if [ "$tri" = "B a b " ]; then
    ligne 0 "sort : tri par octets avec LC_ALL=C (majuscules avant minuscules)"
else
    ligne 1 "sort : « $tri » au lieu de « B a b » (LC_ALL=C non respecté ?)"
fi

dossier="$(mktemp -d 2> /dev/null || echo "/tmp/fournil-env-$$")"
mkdir -p "$dossier/b/c" "$dossier/a"
printf 'un\n' > "$dossier/a/x.txt"
printf 'deux\n' > "$dossier/b/c/y.txt"
chaine="$(cd "$dossier" && find a b -type f 2> /dev/null | LC_ALL=C sort | xargs sha256sum 2> /dev/null | sha256sum | cut -d' ' -f1)"
rm -rf "$dossier"
if [ "${#chaine}" -eq 64 ] && [ "$chaine" = "$(printf '%s' "$chaine" | tr -cd '0-9a-f')" ]; then
    ligne 0 "chaîne find | sort | xargs sha256sum | sha256sum | cut : empreinte de 64 caractères hexadécimaux"
else
    ligne 1 "chaîne find | sort | xargs sha256sum | sha256sum | cut : résultat « $chaine »"
fi

# 4. Le dépôt et son dist, si ce script est lancé depuis scripts/fournil/ d'une copie déployée.
racine="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." 2> /dev/null && pwd)"
if [ -f "$racine/scripts/fournil.sh" ]; then
    if [ -f "$racine/wp-content/plugins/coop-fournil/app/dist/empreinte-sources.txt" ]; then
        if sortie="$(bash "$racine/scripts/fournil.sh" controler 2>&1)"; then
            ligne 0 "fournil.sh controler : $sortie"
        else
            ligne 1 "fournil.sh controler : $sortie"
        fi
    else
        ligne 1 "dist absent (wp-content/plugins/coop-fournil/app/dist/empreinte-sources.txt) : rien à déployer pour Mon fournil"
    fi
else
    echo "       (dépôt non trouvé autour de ce script : contrôle « controler » sauté)"
fi

if [ "$echecs" -eq 0 ]; then
    echo "Environnement prêt pour Mon fournil (aucun Node requis)."
    exit 0
fi
echo "Environnement : $echecs manquement(s)."
exit 1
