#!/usr/bin/env bash
# publish-github.sh — 產生過濾後的公開樹，維護 GitHub public mirror（乾淨歷史）
#
# 模型（D22 拍板）：Gitea = 私有真相源（全量，含內部 wiki/SDD）
#                  GitHub = 公開櫥窗（過濾樹 + 每次發版一個 release commit，不帶內部歷史）
# 流量紅線（D20）：push 前需 leo 親跑 github-arm.sh 解保險；低頻手動、單 repo、不掛 Actions。
#
# 用法：
#   scripts/publish-github.sh          # 只建/更新本機 mirror（.github-public/），不 push
#   scripts/publish-github.sh --push   # 另加 push（需 env GITHUB_REMOTE=https://github.com/<帳號>/<repo>.git）
#
# 排除清單：scripts/github-publish-exclude.txt（一行一個路徑，相對 repo 根；# 開頭為註解）
set -euo pipefail

REPO_ROOT="$(git rev-parse --show-toplevel)"
EXCLUDE_FILE="$REPO_ROOT/scripts/github-publish-exclude.txt"
MIRROR_DIR="${MIRROR_DIR:-$REPO_ROOT/.github-public}"
GITHUB_REMOTE="${GITHUB_REMOTE:-}"

TMP_EXPORT="$(mktemp -d)"
trap 'rm -rf "$TMP_EXPORT"' EXIT

# 1) 只匯出 HEAD 的 tracked 檔（.env / credentials 等 untracked 永不混入）
git -C "$REPO_ROOT" archive HEAD | tar -x -C "$TMP_EXPORT"

# 2) LFS 檔用實體內容取代 pointer（公開端不吃 LFS）
if command -v git-lfs >/dev/null 2>&1; then
  git -C "$REPO_ROOT" lfs ls-files --name-only 2>/dev/null | while IFS= read -r f; do
    if [ -n "$f" ] && [ -f "$REPO_ROOT/$f" ]; then
      mkdir -p "$TMP_EXPORT/$(dirname "$f")"
      cp "$REPO_ROOT/$f" "$TMP_EXPORT/$f"
    fi
  done
fi

# 2.5) 公開端不吃 LFS：刪掉 .gitattributes，否則 mirror commit 時 git-lfs 會把
#      實體檔又轉回 pointer 上傳（GitHub README 圖就破了——2026-07-18 實撞）
rm -f "$TMP_EXPORT/.gitattributes"

# 3) 套排除清單
while IFS= read -r p; do
  case "$p" in ''|\#*) continue ;; esac
  rm -rf "${TMP_EXPORT:?}/$p"
done < "$EXCLUDE_FILE"

# 3.5) repo 自備的遮蔽腳本（可選）：對匯出樹做內容級遮蔽（如指南去帳密）
if [ -f "$REPO_ROOT/scripts/github-publish-sanitize.py" ]; then
  python3 "$REPO_ROOT/scripts/github-publish-sanitize.py" "$TMP_EXPORT"
fi

# 4) 同步進常駐 mirror（mirror 自己的 .git = 公開端乾淨歷史）
mkdir -p "$MIRROR_DIR"
[ -d "$MIRROR_DIR/.git" ] || git -C "$MIRROR_DIR" init -q -b main
rsync -a --delete --exclude='.git' "$TMP_EXPORT/" "$MIRROR_DIR/"

cd "$MIRROR_DIR"
git add -A
if git diff --cached --quiet && git rev-parse -q --verify HEAD >/dev/null; then
  echo "ℹ️  無變更，mirror 已是最新"
else
  git -c user.name="Arcrun Release" -c user.email="release@arcrun.dev" \
    commit -q -m "release: snapshot $(git -C "$REPO_ROOT" rev-parse --short HEAD) ($(git -C "$REPO_ROOT" log -1 --format=%cd --date=short))"
  echo "✅ mirror 已更新：$(git log --oneline -1)"
fi
echo "📁 mirror：${MIRROR_DIR}（$(git rev-list --count HEAD) 個公開 commit）"

if [ "${1:-}" = "--push" ]; then
  if [ -z "$GITHUB_REMOTE" ]; then
    echo "❌ 缺 GITHUB_REMOTE（例：https://github.com/<帳號>/<repo>.git）" >&2
    exit 1
  fi
  git remote remove github 2>/dev/null || true
  git remote add github "$GITHUB_REMOTE"
  # 憑證不進 URL/指令行：有 GITHUB_MIRROR_TOKEN 就用 Basic header 注入（PAT）
  if [ -n "${GITHUB_MIRROR_TOKEN:-}" ]; then
    AUTH_B64="$(printf '%s:%s' "${GITHUB_ACCOUNT_NAME:-git}" "$GITHUB_MIRROR_TOKEN" | base64 | tr -d '\n')"
    git -c http."$GITHUB_REMOTE".extraheader="Authorization: Basic $AUTH_B64" push -u github main
  else
    git push -u github main
  fi
  echo "🚀 已 push → $GITHUB_REMOTE"
fi
