#!/bin/sh
# -----------------------------------------------------------------------------
# ObsiGate — incrément automatique de la version livrée (SemVer) à chaque commit.
#
# Source unique de vérité : ./VERSION  (MAJEUR.MINEUR.CORRECTIF)
#
#   `!:` / `BREAKING CHANGE:`   -> MAJEUR     (x.0.0)
#   `feat:`                     -> MINEUR     (x.y.0)
#   tout le reste (fix, perf…)  -> CORRECTIF  (x.y.z)
#
# Aucun incrément pour : merge, squash, revert, `chore(release)`, amend.
# Commit rédigé dans un éditeur (message pas encore saisi) : l'incrément est
# différé à `post-commit`, qui dispose du message final.
#
# `scripts/bump_version.py` incrémente VERSION et resynchronise les fichiers
# dérivés (package.json, desktop, READMEs, ROADMAP, CHANGELOG) ; le `git add` est
# fait ici, par le hook lui-même. La liste des fichiers est laissée à
# `.githooks/post-commit`, qui rattache l'incrément au commit (git fige l'arbre
# avant `prepare-commit-msg` : un `git add` à cet instant ne serait pris en
# compte qu'au commit suivant).
#
# Neutraliser ponctuellement :  SKIP_VERSION_BUMP=1 git commit ...
# -----------------------------------------------------------------------------
set -eu

[ "${SKIP_VERSION_BUMP:-}" = "" ] || exit 0

msg_file="${1:-}"
source_kind="${2:-message}"

case "$source_kind" in
  merge|squash|commit) exit 0 ;;   # merge / squash / amend (-c, -C, --amend)
esac

[ -n "$msg_file" ] && [ -f "$msg_file" ] || exit 0

root="$(git rev-parse --show-toplevel)"
tool="$root/scripts/bump_version.py"
[ -f "$tool" ] || exit 0

py=""
for cand in python3 python; do
  if command -v "$cand" >/dev/null 2>&1; then py="$cand"; break; fi
done
if [ -z "$py" ]; then
  echo "⚠ version : aucun interpréteur Python trouvé — version non incrémentée." >&2
  exit 0
fi

list="$(git rev-parse --git-path obsigate-version-files)"
defer="$(git rev-parse --git-path obsigate-version-defer)"

# Message pas encore rédigé (ouverture d'un éditeur) : on diffère l'incrément.
if ! grep -qvE '^[[:space:]]*(#|$)' "$msg_file"; then
  : > "$defer"
  exit 0
fi

rm -f "$defer"   # marqueur d'un commit précédent avorté

out=""
if out="$("$py" "$tool" --from-message-file "$msg_file" --files-out "$list" 2>&1)"; then
  printf '%s\n' "$out"
else
  status=$?
  if [ "$status" = "3" ]; then
    rm -f "$list"
    exit 0   # 3 = version inchangée (revert, release…) : pas une erreur
  fi
  echo "✗ version : échec de l'incrément automatique de ./VERSION" >&2
  printf '%s\n' "$out" >&2
  echo "  → corriger, ou passer outre avec : SKIP_VERSION_BUMP=1 git commit ..." >&2
  exit 1
fi

# Ajout des fichiers synchronisés (chemins explicites).
if [ -s "$list" ]; then
  # shellcheck disable=SC2046
  git add -- $(tr -d '\r' < "$list")
fi
