#!/bin/sh
# Installe la CLI fiscal-engine (moteurs fiscaux IFI / IR / futurs) dans ~/.local/bin.
# Usage :
#   curl -fsSL https://fiscal-engine.louisguthmann.com/install.sh | sh
# Source par defaut : https://fiscal-engine.louisguthmann.com, avec repli
# automatique sur https://ifiengine.louisguthmann.com si le domaine unifie
# ne repond pas encore (DNS en cours de publication).
# Variables : BASE_URL pour changer la source ; ENGINE_AUTH_USER (user ou user:mdp)
# si la source exige une authentification (les artefacts officiels sont publics).
# Ce script n'ecrit que dans ~/.local/bin et dans le repertoire temporaire,
# ne stocke ni n'affiche aucun secret, et ne lance jamais `fiscal-engine auth`.

set -eu

DEFAULT_BASE="https://fiscal-engine.louisguthmann.com"
FALLBACK_BASE="https://ifiengine.louisguthmann.com"

fail() {
    printf 'Erreur : %s\n' "$1" >&2
    exit 1
}

command -v curl >/dev/null 2>&1 || fail "curl est introuvable. Installez curl puis relancez ce script."
command -v node >/dev/null 2>&1 || fail "Node.js est introuvable. Installez Node.js >= 18 (https://nodejs.org) puis relancez ce script."

NODE_VERSION="$(node -v 2>/dev/null || true)"
NODE_MAJOR="$(printf '%s' "$NODE_VERSION" | sed -e 's/^v//' -e 's/[.].*$//')"
case "$NODE_MAJOR" in
    ''|*[!0-9]*) fail "version de Node.js illisible (node -v a renvoye : ${NODE_VERSION:-rien})." ;;
esac
[ "$NODE_MAJOR" -ge 18 ] || fail "Node.js >= 18 requis (version detectee : ${NODE_VERSION}). Mettez Node.js a jour puis relancez ce script."

# Teste silencieusement qu'une base de distribution repond (chemins publics).
probe_base() {
    curl -fsI --max-time 4 -o /dev/null -- "$1/install.sh" 2>/dev/null \
        || curl -fsI --max-time 4 -o /dev/null -- "$1/version.json" 2>/dev/null
}

if [ -n "${BASE_URL:-}" ]; then
    : # source imposee par l'utilisateur : aucune detection automatique
elif probe_base "$DEFAULT_BASE"; then
    BASE_URL="$DEFAULT_BASE"
else
    BASE_URL="$FALLBACK_BASE"
    printf 'Note : %s ne repond pas encore, repli sur %s\n' "$DEFAULT_BASE" "$FALLBACK_BASE"
fi

BIN_DIR="${HOME}/.local/bin"
TARGET="${BIN_DIR}/fiscal-engine"
SOURCE_URL="${BASE_URL}/bundles/fiscal-engine.js"

mkdir -p "$BIN_DIR"

# repertoire temporaire : node --check exige une extension .js
TMP_DIR="$(mktemp -d "${TMPDIR:-/tmp}/fiscal-engine.XXXXXX")"
TMP_FILE="${TMP_DIR}/fiscal-engine.js"
trap 'rm -rf "$TMP_DIR"' EXIT INT HUP TERM

printf 'Telechargement de %s\n' "$SOURCE_URL"
if [ -n "${ENGINE_AUTH_USER:-}" ]; then
    curl -u "$ENGINE_AUTH_USER" -fsSL -o "$TMP_FILE" -- "$SOURCE_URL" || fail "telechargement impossible depuis ${SOURCE_URL}."
else
    curl -fsSL -o "$TMP_FILE" -- "$SOURCE_URL" || fail "telechargement impossible depuis ${SOURCE_URL}."
fi
node --check "$TMP_FILE" || fail "le fichier telecharge n'est pas un script Node valide."

mv "$TMP_FILE" "$TARGET"
chmod 755 "$TARGET"
rm -rf "$TMP_DIR"
trap - EXIT INT HUP TERM

CLI_VERSION="$(node "$TARGET" --version 2>/dev/null || printf 'inconnue')"

printf '\nInstallation terminee.\n'
printf '  CLI     : %s\n' "$TARGET"
printf '  Version : %s\n' "$CLI_VERSION"

case ":${PATH}:" in
    *":${BIN_DIR}:"*) ;;
    *)
        printf "\nAttention : %s n'est pas dans votre PATH.\n" "$BIN_DIR"
        printf 'Ajoutez cette ligne a votre ~/.zshrc ou ~/.bashrc :\n'
        printf '  export PATH="$HOME/.local/bin:$PATH"\n'
        ;;
esac

printf '\nEtapes suivantes (a executer par un HUMAIN, dans un terminal) :\n'
printf '  1. fiscal-engine auth     # saisie masquee du mot de passe, jamais via un agent\n'
printf '     (variante : fiscal-engine auth --export-env  # stocke aussi dans l environnement du shell via ~/.zshenv)\n'
printf '  2. fiscal-engine status   # verifie l acces aux moteurs fiscaux\n'
