#!/bin/sh
# QQQuestionAI pre-commit フック。任意の機能で、「コミット前に必ず問われる」
# 強制力が欲しい人だけが入れる。 https://github.com/Back370/QQQuestionAI
#
# 【このファイルについて】
# これは git の管理外 (.git/hooks/) に配置される実行体で、`git ls-files` に
# 出てこないのが正常。このリポジトリに QQQuestionAI のソースを置く必要は無い。
#
# 実行時に必要なのは curl / git / python3 (JSON 整形用) だけ。
# 出題を行うバックエンドは VSCode 拡張が別プロセスで起動する（拡張に同梱されて
# いる）。このリポジトリ内の backend/ や scripts/ を参照することはない。
#
# 発動するのは `QQQ_QUIZ=1 git commit -m "..."` と明示したときだけ。素の
# `git commit` や `git commit -q` には一切影響しない（-q は git 本来のフラグ）。
# ふだんの理解度チェックはコミットと無関係に `quiz` コマンドで行う。
#
# バックエンド未起動なら警告のみで素通しし、コミットを壊さない（fail-open）。

[ "$QQQ_QUIZ" = "1" ] || exit 0

PORT="${QQQ_PORT:-8756}"
BASE="http://127.0.0.1:${PORT}"

if ! curl -s -m 2 "${BASE}/health" >/dev/null 2>&1; then
    echo "QQQuestionAI: バックエンド未起動のため理解度チェックをスキップします" >&2
    echo "  (コミットはこのまま続行します。これは異常ではありません)" >&2
    echo "  出題するには、QQQuestionAI 拡張を入れた VSCode でこのリポジトリを" >&2
    echo "  開いてください。拡張がバックエンドを自動起動します。" >&2
    echo "  ※ このリポジトリに backend/ 等を置く必要はありません" >&2
    exit 0
fi

echo "QQQuestionAI: 理解度チェックを開始します（VSCodeにクイズパネルが開きます）" >&2

# origin=hook: このスクリプトは自前の UI を持たないので、VSCode 拡張に
# クイズパネルを開いてもらう必要がある（拡張が /quiz/pending で拾う）
START_RESPONSE=$(curl -s -m 120 -X POST "${BASE}/quiz/start" \
    -H "Content-Type: application/json" \
    -d "{\"repo_path\": \"$(pwd)\", \"origin\": \"hook\"}")

SESSION_ID=$(printf '%s' "$START_RESPONSE" | python3 -c \
    'import json,sys; print(json.load(sys.stdin).get("session_id",""))' 2>/dev/null)

if [ -z "$SESSION_ID" ]; then
    echo "QQQuestionAI: セッションを開始できませんでした: $START_RESPONSE" >&2
    echo "QQQuestionAI: チェックをスキップしてコミットを続行します" >&2
    exit 0
fi

# クイズ完走(completed)まで待機。中断(aborted)ならコミット中止
while :; do
    STATUS=$(curl -s -m 5 "${BASE}/quiz/${SESSION_ID}/status" | python3 -c \
        'import json,sys; print(json.load(sys.stdin).get("status",""))' 2>/dev/null)
    case "$STATUS" in
        completed)
            REPORT_JSON=$(curl -s -m 5 "${BASE}/quiz/${SESSION_ID}/report")
            printf '%s' "$REPORT_JSON" | python3 -c \
                'import json,sys; print(json.load(sys.stdin).get("rendered",""))' 2>/dev/null >&2
            ATTEMPTED=$(printf '%s' "$REPORT_JSON" | python3 -c \
                'import json,sys; print(json.load(sys.stdin).get("report",{}).get("attempted",0))' 2>/dev/null)
            # attempted=0 は出題できずに fail-open でスキップした状態（例: APIのレート制限）。
            # 「完走」と偽らず、開始レスポンスの error を理由として添える。
            if [ "$ATTEMPTED" = "0" ]; then
                REASON=$(printf '%s' "$START_RESPONSE" | python3 -c \
                    'import json,sys; print(json.load(sys.stdin).get("error") or "")' 2>/dev/null)
                echo "QQQuestionAI: 出題できなかったため理解度チェックをスキップしてコミットを続行します" >&2
                [ -n "$REASON" ] && echo "  理由: $REASON" >&2
            else
                echo "QQQuestionAI: 理解度チェック完走。コミットを続行します" >&2
            fi
            exit 0
            ;;
        aborted)
            echo "QQQuestionAI: 理解度チェックが中断されました。コミットを中止します" >&2
            echo "  (記録は保存済み。quiz コマンドで再挑戦するか、もう一度" >&2
            echo "   QQQ_QUIZ=1 git commit でやり直せます)" >&2
            exit 1
            ;;
        "")
            echo "QQQuestionAI: バックエンドとの接続が切れました。コミットを中止します" >&2
            exit 1
            ;;
    esac
    sleep 1
done
