#!/usr/bin/env bash
# 手元（Mac）から VM の `thth` を呼ぶ薄いラッパ（masaru 指摘 2026-09-10）。
#
# **なぜ要るか。** 各プロジェクトのセッションは `ssh wt 'PATH=...; thth ...'` と
# 打っていた。安全で特定の作業をするために、いちばん鈍器な道具（生の ssh）を
# 持たせていたことになる。実際、権限判定に何度も弾かれ、ループの形では止められた。
# **道具を特定にすれば、許可も特定にできる**（`Bash(thth:*)` の 1 行で済む）。
#
# 引数はそのまま VM の `thth` に渡す。手元のシェルに展開させない
# （VM 側のパスは手元に存在しないので、glob は使わずディレクトリを渡すこと）。
# 秘密を対話で入れるもの（`token set`・`auth`・`admin secret set`（旧名 `admin approver set`））と、招待 URL を tty に 1 回だけ出す
# `admin invite`（3.10.0）だけ tty を割り当てる——tty が
# 無いと getpass がエコーを止められず、**手元の画面にトークンが出る**。
set -euo pipefail

# thth-remote-wrapper（この印で、PATH 上の `thth` がこのラッパ自身か pip の `thth` かを見分ける）
#
# 3.14.2: `login`・`logout` だけは手元の `thth`（pip）に渡す。ブラウザ式の `thth login` は
# 手元の `~/.config/thth/remote.json` に鍵を置く命令で、VM で打つと VM に置かれてしまう。
# それ以外は今までどおり VM。遠くの道（remote.json）を手元で確かめるときは `python3 -m thth …` か
# pip の `thth` の絶対パスで打つ（このラッパは VM 行き）。
case "${1:-}" in
  login|logout)
    if [ -n "${THTH_LOCAL:-}" ]; then
      exec "$THTH_LOCAL" "$@"
    fi
    # 配列を使わない（macOS 既定の bash 3.2 は `set -u` の下で空配列の展開に落ちる）。
    set -f; OLD_IFS="$IFS"; IFS=:
    for dir in ${PATH:-}; do
      candidate="${dir:-.}/thth"
      if [ -f "$candidate" ] && [ -x "$candidate" ] && ! grep -q 'thth-remote-wrapper' "$candidate" 2>/dev/null; then
        IFS="$OLD_IFS"; set +f
        exec "$candidate" "$@"
      fi
    done
    IFS="$OLD_IFS"; set +f
    exec python3 -m thth "$@"
    ;;
esac

HOST="${THTH_SSH_HOST:-wt}"
REMOTE='PATH="$HOME/.local/bin:$PATH"; exec thth'
for arg in "$@"; do
  REMOTE+=" $(printf '%q' "$arg")"
done

# `set -u` の下で空配列を展開すると古い bash（macOS 既定の 3.2）で落ちるので、
# 文字列で持つ（引数は 1 つだけなので分割の心配が無い）。
TTY_FLAG=""
case "${1:-} ${2:-} ${3:-}" in
  "token set "*|"auth "*|"admin invite create"|"admin secret set"|"admin approver set"|"approver set "*) TTY_FLAG="-t" ;;
esac

if [ -n "$TTY_FLAG" ]; then
  exec ssh -t "$HOST" "$REMOTE"
fi

# 4.5.3: 標準入力は、読むと分かっているときだけ VM へ渡す（こぴちゃ 第3 の 3）。
# `while read f; do thth revoke "$f"; done < list` が 1 本で止まった——VM の thth は標準入力を
# 読まないのに、**ssh が手元の標準入力を先に吸い上げて VM へ送っていた**（ループの残りの行が消える）。
# 渡すのは: 引数に `-`（`--confirm-file -`・`bookmark batch <口座> -`・`revoke -` など）か `…=-` か
# `--…stdin`（`--stdin`・`--json-stdin`・`--secret-stdin` など）があるとき、と、`send` で本文の引数
# （`--text`・`--text-file`・`--media`）が無いとき（4.4.2 で案内した `thth send <口座> … < <ファイル>`
# の互換）。それ以外は `ssh -n`（標準入力を /dev/null に）。
STDIN_WANTED=""
SEND_BODY_GIVEN=""
for arg in "$@"; do
  case "$arg" in
    -|*=-|--*stdin) STDIN_WANTED=1 ;;
    --text|--text=*|--text-file|--text-file=*|--media|--media=*) SEND_BODY_GIVEN=1 ;;
  esac
done
if [ "${1:-}" = "send" ] && [ -z "$SEND_BODY_GIVEN" ]; then
  STDIN_WANTED=1
fi
if [ -n "$STDIN_WANTED" ]; then
  exec ssh "$HOST" "$REMOTE"
fi
exec ssh -n "$HOST" "$REMOTE"
