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

CONFIG=".cliff.toml"
CHANGELOG="CHANGELOG.md"

if ! command -v git-cliff >/dev/null 2>&1; then
  cat >&2 <<'EOF'
git-cliff is required to update the changelog.
Install it via: cargo install git-cliff --locked
EOF
  exit 1
fi

mode="generate"
if [[ "${1:-}" == "--check" ]]; then
  mode="check"
elif [[ $# -gt 0 ]]; then
  cat >&2 <<'EOF'
Usage: scripts/update-changelog.sh [--check]

Without arguments the script regenerates CHANGELOG.md in-place.
With --check it verifies that the changelog is up-to-date.
EOF
  exit 2
fi

if [[ ! -f "$CONFIG" ]]; then
  echo "Missing $CONFIG configuration file." >&2
  exit 1
fi

if [[ "$mode" == "generate" ]]; then
  git-cliff --config "$CONFIG" --output "$CHANGELOG"
  echo "Changelog regenerated in $CHANGELOG."
else
  tmpfile=$(mktemp)
  trap 'rm -f "$tmpfile"' EXIT
  git-cliff --config "$CONFIG" --output "$tmpfile"
  if ! diff -u "$CHANGELOG" "$tmpfile" > /dev/null; then
    echo "CHANGELOG.md is out of date. Run scripts/update-changelog.sh to regenerate." >&2
    diff -u "$CHANGELOG" "$tmpfile" || true
    exit 1
  fi
fi
