#!/usr/bin/env bash
# Stop hook — ヘルプ／更新履歴の更新もれを知らせる（警告のみ・非ブロック）。
#
# フィーチャーブランチに「ユーザー向けのコード変更」が commit 済みなのに、
# ヘルプ (ui/src/content/help/) と更新履歴 (00-changelog.md) が未更新のとき、
# 目に見える警告を 1 つ出すだけ。作業はブロックしない（更新するかは開発者が判断）。
#
# 設計メモ:
# - main/master では何もしない（トランク自体には enforce しない）
# - 判定は base ブランチとの "commit 済み差分" のみ。編集途中（未コミット）では黙る
# - ヒューリスティックなので、内部リファクタ等で誤検知したら無視してよい

# `set -e` は使わない（[ ... ] && exit の評価で意図せず抜けるのを避けるため）。

ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." 2>/dev/null && pwd)"
[ -n "$ROOT" ] || exit 0
cd "$ROOT" 2>/dev/null || exit 0

git rev-parse --is-inside-work-tree >/dev/null 2>&1 || exit 0

BRANCH="$(git rev-parse --abbrev-ref HEAD 2>/dev/null)"
case "$BRANCH" in
  main|master|HEAD|"") exit 0 ;;
esac

# 差分の基準ブランチを決める。
BASE=""
for ref in origin/main main origin/master master; do
  if git rev-parse --verify --quiet "$ref" >/dev/null 2>&1; then
    BASE="$ref"
    break
  fi
done
[ -n "$BASE" ] || exit 0

# このブランチが base に対して触ったファイル（commit 済みのみ）。
CHANGED="$(git diff --name-only "$BASE"...HEAD 2>/dev/null)"
[ -n "$CHANGED" ] || exit 0

CHANGELOG="ui/src/content/help/00-changelog.md"

changelog_touched=0
user_facing=0
while IFS= read -r f; do
  [ -n "$f" ] || continue
  case "$f" in
    "$CHANGELOG") changelog_touched=1 ;;
  esac
  case "$f" in
    *.test.ts|*.test.tsx|*.spec.ts) ;;            # テストは対象外
    ui/src/content/help/*) ;;                      # ヘルプ本文そのものは対象外
    ui/src/i18n/*) ;;                              # 文言だけの変更は対象外
    ui/src/*|src/*|pieces/*) user_facing=1 ;;      # ユーザーに影響しうるコード
  esac
done <<< "$CHANGED"

# ユーザー向け変更が無い、または更新履歴を既に更新済みなら何も言わない。
[ "$user_facing" -eq 1 ] || exit 0
[ "$changelog_touched" -eq 0 ] || exit 0

MSG="📝 ヘルプ未更新のお知らせ: ブランチ '${BRANCH}' に機能コードの変更がありますが、更新履歴 (${CHANGELOG}) は未更新です。ユーザー向けの変更なら、該当するヘルプ (ui/src/content/help/*.md) と更新履歴に追記してください。内部リファクタ等で不要なら無視して構いません。"

# 可視の警告として出すだけ（decision を設定しないので stop はブロックしない）。
# Stop フックは stdout の JSON `systemMessage` のみを画面に出す（stderr は出ない）ため、
# 必ず stdout に JSON を書く。
if command -v python3 >/dev/null 2>&1; then
  printf '{"systemMessage": %s}\n' "$(MSG="$MSG" python3 -c 'import json,os; print(json.dumps(os.environ["MSG"]))')"
else
  # python3 が無い環境向けフォールバック。" と \ を手でエスケープして stdout に出す。
  esc="$(printf '%s' "$MSG" | sed 's/\\/\\\\/g; s/"/\\"/g')"
  printf '{"systemMessage": "%s"}\n' "$esc"
fi
exit 0
