#!/usr/bin/env bash
# 新机器一行引导脚本（挂在 Cloudflare Pages 上，自定义域名见 README）
#
#   curl -fsSL https://nixos-config.4t145.com/bootstrap.sh | bash -s -- alpha
#   curl -fsSL https://nixos-config.4t145.com/bootstrap.sh | bash -s -- alpha --deploy
#
# 代码来源：
#   默认从本域名下载仓库快照（nixos-config.tar.gz，由 scripts/make-pages-dist.sh 生成）
#   —— 不需要 git、不需要 GitHub 认证，国内也快。
#   想改用 git clone：显式置空，例如 `TARBALL_URL= bash bootstrap.sh alpha`
#   （私有仓库还需要 REPO_URL 里带 token）。
#
# 真正的流程都在仓库的 scripts/bootstrap.sh 里：改流程只需重新 push + 重新发布，
# 不用重新上传这个文件。
set -euo pipefail

# 站点地址（改域名只改这一处）
SITE=${SITE:-https://nixos-config.4t145.com}

REPO_URL=${REPO_URL:-https://github.com/4t145/nixos-config.git}
REPO_REF=${REPO_REF:-main}
DIR=${DIR:-$HOME/nixos-config}
# 用 ${VAR-default}：只有"未设置"才取默认值，显式置空可强制走 git
TARBALL_URL=${TARBALL_URL-$SITE/nixos-config.tar.gz}

# 解析自己关心的参数（--dir/--repo/--ref），同时把它们也原样透传给
# scripts/bootstrap.sh —— 两边必须用同一个 DIR，否则 stub 解压到这里、
# 子脚本却去别处部署。其余参数直接透传。
PASS=()
while [[ $# -gt 0 ]]; do
  case $1 in
    --dir)
      DIR=${2:?--dir 需要一个值}
      PASS+=("$1" "$2")
      shift 2
      ;;
    --repo)
      REPO_URL=${2:?--repo 需要一个值}
      PASS+=("$1" "$2")
      shift 2
      ;;
    --ref)
      REPO_REF=${2:?--ref 需要一个值}
      PASS+=("$1" "$2")
      shift 2
      ;;
    *)
      PASS+=("$1")
      shift
      ;;
  esac
done

command -v nix >/dev/null 2>&1 || {
  echo "找不到 nix：这台机器是 NixOS 吗？" >&2
  exit 1
}

# git 缺失时用 nix 临时取（新装的系统可能没装 git）
git_() { if command -v git >/dev/null 2>&1; then git "$@"; else nix shell nixpkgs#git -c git "$@"; fi; }

# 目标目录已经是 git 仓库时不要用快照覆盖（会冲掉本地改动/历史）
if [[ -n $TARBALL_URL && -d $DIR/.git ]]; then
  echo "==> $DIR 已是 git 仓库，改用 git 更新（不用快照覆盖）"
  TARBALL_URL=""
fi

if [[ -n $TARBALL_URL ]]; then
  # ---- 从静态资源下载仓库快照 ----
  echo "==> 下载仓库快照 $TARBALL_URL"
  command -v curl >/dev/null 2>&1 || {
    echo "找不到 curl" >&2
    exit 1
  }
  parent=$(dirname "$DIR")
  mkdir -p "$parent"
  tmp=$(mktemp -d)
  trap 'rm -rf "$tmp"' EXIT
  curl -fsSL "$TARBALL_URL" -o "$tmp/repo.tar.gz"
  if [[ -e $DIR && ! -d $DIR/.git ]]; then
    echo "==> 就地更新 $DIR（快照覆盖仓库文件，但保留本机生成的硬件配置）"
  fi
  # 快照里的 hosts/*/hardware-configuration.nix 是占位/旧版 —— 必须保住本机生成的那份，
  # 否则重新引导会把真机的磁盘 UUID 冲掉，部署后起不来
  hw=$(cd "$DIR" 2>/dev/null && find hosts -name hardware-configuration.nix 2>/dev/null | head -20) || hw=""
  if [[ -n $hw ]]; then
    # shellcheck disable=SC2086
    (cd "$DIR" && tar -czf "$tmp/hw.tgz" $hw) 2>/dev/null || true
  fi
  tar -xzf "$tmp/repo.tar.gz" -C "$parent"
  if [[ -f $tmp/hw.tgz ]]; then
    tar -xzf "$tmp/hw.tgz" -C "$DIR" && echo "==> 已恢复本机硬件配置：$(echo "$hw" | tr '\n' ' ')"
  fi
  if [[ ! -d $DIR && -d "$parent/nixos-config" ]]; then
    mv "$parent/nixos-config" "$DIR"
  fi
  [[ -d $DIR ]] || {
    echo "解压后没找到仓库目录 $DIR" >&2
    exit 1
  }
else
  # ---- git clone / 更新 ----
  if [[ -d $DIR/.git ]]; then
    git_ -C "$DIR" fetch --quiet origin "$REPO_REF" || true
    git_ -C "$DIR" checkout --quiet "$REPO_REF" 2>/dev/null || true
    git_ -C "$DIR" pull --quiet --ff-only origin "$REPO_REF" || true
  else
    git_ clone --quiet --branch "$REPO_REF" "$REPO_URL" "$DIR" || {
      echo "clone 失败：私有仓库需要认证（REPO_URL 里带 token），" >&2
      echo "或改用 TARBALL_URL 从静态资源下载快照。" >&2
      exit 1
    }
  fi
fi

exec bash "$DIR/scripts/bootstrap.sh" "${PASS[@]}"
