#!/bin/bash
# 木立デスク Mac2 の入り口（指示 7c5061f2）。Mac2 の Claude（Claude Code）に curl の1行で実行してもらう。
#   curl -fsSL https://kodachi-mac2-setup.pages.dev/install.sh | bash -s -- <10文字コード>
# curl で取ったファイルには隔離属性が付かないので Gatekeeper に止められない（.command・署名は不要）。冪等。
# やること：zip を ~/Mac2-setup に展開 → node を用意 → コードで合言葉入り config.json を受け取る（1回だけ）→ mac2_setup.sh
set -u
B="https://kodachi-mac2-setup.pages.dev"; CODE="${1:-${MAC2_CODE:-}}"
H="$HOME"; D="$H/Mac2-setup"; BASE="$H/.kodachi-desk"
[ "$(uname)" = Darwin ] || { echo "Macではありません（Mac2の設定はMacでだけ実行します）"; exit 1; }
mkdir -p "$BASE"; T="$(mktemp -d)"; trap 'rm -rf "$T"' EXIT

echo "■ 入れ物を取り寄せます"
curl -fsSL "$B/Mac2-setup.zip" -o "$T/m.zip" && unzip -q -o "$T/m.zip" -d "$H" || { echo "失敗：Mac2-setup.zip を取れませんでした"; exit 1; }
chmod +x "$D/mac2_setup.sh" "$D/mac2_root.sh" 2>/dev/null

echo "■ node を確認します"
export PATH="$H/.local/bin:$BASE/node/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin"
if ! command -v node >/dev/null 2>&1; then
  ARCH=$([ "$(uname -m)" = arm64 ] && echo arm64 || echo x64); IDX="https://nodejs.org/dist/latest-v22.x"
  NAME=$(curl -fsSL "$IDX/SHASUMS256.txt" | grep "node-v.*-darwin-$ARCH.tar.gz" | head -1); SUM=${NAME%% *}; FILE=${NAME##* }
  if [ -n "$FILE" ] && curl -fsSL "$IDX/$FILE" -o "$T/n.tgz" && [ "$(shasum -a 256 "$T/n.tgz" | cut -d' ' -f1)" = "$SUM" ]; then
    mkdir -p "$BASE/node" && tar -xzf "$T/n.tgz" -C "$BASE/node" --strip-components 1 && echo "　node を入れました"
  else echo "失敗：node を入れられませんでした"; exit 1; fi
fi

echo "■ 合言葉ファイル（config.json）を用意します"
if [ -n "$CODE" ]; then
  B="$B" OUT="$D/config.json" node --input-type=module - "$CODE" <<'JS' || exit 1
const code = (process.argv[2] || "").toUpperCase().replace(/[^0-9A-Z]/g, ""), s = crypto.subtle, te = new TextEncoder();
const fail = m => { console.log("失敗：" + m); process.exit(1); };
if (code.length !== 10) fail("コードは10文字です");
const hex = b => Buffer.from(b).toString("hex"), unb64 = x => Buffer.from(x, "base64");
const h = hex(await s.digest("SHA-256", te.encode("lookup:" + code)));
const r = await fetch(process.env.B + "/api/get?h=" + h, { cache: "no-store" }); const j = await r.json();
if (!r.ok) fail(j.error === "used" ? "このコードはもう使われています（新しいコードを頼んでください）" : j.error === "too_many" ? "試した回数が多すぎます（1時間ほど待ってください）" : "コードが違うか、期限（24時間）が切れています");
const base = await s.importKey("raw", te.encode(code), "PBKDF2", false, ["deriveKey"]);
const key = await s.deriveKey({ name: "PBKDF2", salt: unb64(j.salt), iterations: 300000, hash: "SHA-256" }, base, { name: "AES-GCM", length: 256 }, false, ["decrypt"]);
let pt; try { pt = await s.decrypt({ name: "AES-GCM", iv: unb64(j.iv) }, key, unb64(j.ct)); } catch { fail("開けませんでした（コードを確かめてください）"); }
(await import("node:fs")).writeFileSync(process.env.OUT, Buffer.from(pt), { mode: 0o600 });
console.log("　config.json を受け取りました（このコードはもう使えません）");
JS
elif [ -f "$D/config.json" ]; then echo "　前回の config.json を使います"
elif [ -f "$BASE/config.json" ]; then cp "$BASE/config.json" "$D/config.json" && chmod 600 "$D/config.json" && echo "　入れ済みの config.json を使います"
elif [ -f "$H/Downloads/config.json" ]; then echo "　ダウンロードフォルダの config.json を使います"
else echo "失敗：コードがありません。三木さんに届いた10文字コードを付けて、もう一度実行してください"; exit 1; fi

echo "■ 初期設定を始めます（管理者パスワードの画面が1回出ます）"
bash "$D/mac2_setup.sh"
