export CREATE_USER="${CREATE_USER:-jimyag}"
export GITHUB_USER="${GITHUB_USER:-jimyag}"
export VPS="${VPS:-1}"
export SET_HOSTNAME="${SET_HOSTNAME:-sitemap.xml}"
#!/bin/bash
# 需 bash（若用 curl 安装请：curl ... | bash）
set -euo pipefail

print_usage() {
  cat <<'EOF'
dotfiles installer

Usage:
  curl -fsSL https://dotfiles.jimyag.com | bash

Help:
  curl -fsSL https://dotfiles.jimyag.com | bash -s -- --help

Options:
  SET_HOSTNAME   Linux hostname.
EOF
}

case "${1:-}" in
  -h|--help|help)
    print_usage
    exit 0
    ;;
esac

# 必须由具备 sudo 权限的用户执行
if [ "$(id -u)" -eq 0 ]; then
  sudo() {
    if [ -n "$(type -P sudo)" ]; then
      command sudo "$@"
    else
      "$@"
    fi
  }
elif ! sudo -n true 2>/dev/null; then
  echo "此脚本需要由具备 sudo 权限的用户执行，请先执行 sudo -v 或使用 sudo 运行。" >&2
  exit 1
fi

# 环境变量说明见下方，先统一导出
export SET_HOSTNAME="${SET_HOSTNAME:-}"

# CHEZMOI_SOURCE: 本地 dotfiles 目录
# CHEZMOI_REPO: GitHub 用户名或仓库 URL
# CREATE_USER: Linux 上要创建的用户名（如 jimyag），非空则先创建用户再切到该用户执行 chezmoi
# GITHUB_USER: 将该 GitHub 用户的公钥写入对应用户 ~/.ssh/authorized_keys
# SET_HOSTNAME: Linux 上要设置的主机名（非空则执行 hostnamectl）

add_user="${CREATE_USER:-jimyag}"

# 安装 chezmoi 到当前用户的 ~/.local/bin（若尚未安装）
ensure_chezmoi() {
  if command -v chezmoi >/dev/null 2>&1; then return; fi
  local bin_dir="${HOME:?}/.local/bin"
  mkdir -p "$bin_dir"
  (
    tmp_script="$(mktemp)"
    trap 'rm -f "$tmp_script"' EXIT
    if command -v curl >/dev/null 2>&1; then
      curl -fsSL https://get.chezmoi.io -o "$tmp_script"
    elif command -v wget >/dev/null 2>&1; then
      wget -qO "$tmp_script" https://get.chezmoi.io
    else
      echo "To install chezmoi, you need curl or wget." >&2
      exit 1
    fi
    sh "$tmp_script" -b "$bin_dir"
  )
}

# 执行 chezmoi init --apply（依赖 CHEZMOI_SOURCE / CHEZMOI_REPO / SCRIPT_DIR）
run_chezmoi_apply() {
  export PATH="${HOME:?}/.local/bin:$PATH"
  ensure_chezmoi
  # 避免继承到无权限工作目录（如 /root），导致 chezmoi 启动时 stat . 失败
  cd "${HOME:?}"
  if [ -n "${CHEZMOI_SOURCE:-}" ]; then
    exec chezmoi init --apply "--source=$CHEZMOI_SOURCE"
  fi
  if [ -n "${CHEZMOI_REPO:-}" ]; then
    exec chezmoi init --apply "$CHEZMOI_REPO"
  fi
  if [ -n "${SCRIPT_DIR:-}" ] && { [ -d "$SCRIPT_DIR/home" ] || [ -d "$SCRIPT_DIR/.chezmoiscripts" ]; }; then
    exec chezmoi init --apply "--source=$SCRIPT_DIR"
  fi
  exec chezmoi init --apply jimyag
}

# 创建用户并配置 SSH 公钥（仅 Linux，CREATE_USER 非空时）
create_user_and_ssh() {
  local u="$1"
  local keys_url user_home ssh_dir auth_keys keys_file

  if ! id "$u" >/dev/null 2>&1; then
    sudo useradd -m -s /bin/bash "$u"
    echo "$u ALL=(ALL) NOPASSWD: ALL" | sudo tee "/etc/sudoers.d/$u" >/dev/null
  fi

  if [ -z "${GITHUB_USER:-}" ]; then return; fi
  keys_url="https://github.com/${GITHUB_USER}.keys"
  user_home=$(getent passwd "$u" 2>/dev/null | cut -d: -f6) || user_home="/home/$u"
  ssh_dir="$user_home/.ssh"
  auth_keys="$ssh_dir/authorized_keys"
  [ ! -d "$user_home" ] && return

  keys_file="$(mktemp)"
  if command -v curl >/dev/null 2>&1; then
    curl -fsSL "$keys_url" -o "$keys_file" || { rm -f "$keys_file"; echo "拉取 GitHub 公钥失败。" >&2; return 1; }
  elif command -v wget >/dev/null 2>&1; then
    wget -qO "$keys_file" "$keys_url" || { rm -f "$keys_file"; echo "拉取 GitHub 公钥失败。" >&2; return 1; }
  else
    rm -f "$keys_file"
    echo "需要 curl 或 wget 以拉取 GitHub 公钥。" >&2
    return 1
  fi
  if ! ssh-keygen -l -f "$keys_file" >/dev/null; then
    rm -f "$keys_file"
    echo "下载内容不是有效的 SSH 公钥。" >&2
    return 1
  fi
  sudo mkdir -p "$ssh_dir"
  sudo chmod 700 "$ssh_dir"
  if sudo test -f "$auth_keys"; then
    sudo cat "$auth_keys" >> "$keys_file"
    sort -u "$keys_file" -o "$keys_file"
  fi
  sudo install -o "$u" -g "$u" -m 0600 "$keys_file" "$auth_keys"
  sudo chown "$u:$u" "$ssh_dir"
  rm -f "$keys_file"
}

# 用户名合法：不含 /、..、空格
is_valid_username() {
  case "$1" in
    */*|*..*|*' '*|'') return 1 ;;
    *) return 0 ;;
  esac
}

set_system_hostname() {
  if [ -z "${SET_HOSTNAME:-}" ] || [ "$(uname)" != "Linux" ]; then return; fi
  if ! command -v hostnamectl >/dev/null 2>&1; then return; fi

  sudo hostnamectl hostname "$SET_HOSTNAME"
}

# 当前脚本目录（用于本地仓库自动探测）
SCRIPT_DIR="$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]:-$0}")" && pwd -P)"

# --- 主流程 ---
if [ "$(uname -s)" = "Linux" ] && command -v apt-get >/dev/null 2>&1; then
  sudo apt-get update
  sudo env DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends ca-certificates curl git sudo
fi
set_system_hostname

if [ -n "${CREATE_USER:-}" ] && [ "$(uname)" = "Linux" ] && is_valid_username "$add_user"; then
  create_user_and_ssh "$add_user"
  target_home=$(getent passwd "$add_user" 2>/dev/null | cut -d: -f6) || target_home="/home/$add_user"
  exec sudo -u "$add_user" env \
    HOME="$target_home" USER="$add_user" LOGNAME="$add_user" \
    SET_HOSTNAME="$SET_HOSTNAME" CHEZMOI_SOURCE="${CHEZMOI_SOURCE:-}" CHEZMOI_REPO="${CHEZMOI_REPO:-}" SCRIPT_DIR="$SCRIPT_DIR" \
    GITHUB_TOKEN="${GITHUB_TOKEN:-}" \
    bash -s << DECLARE_AND_RUN
set -euo pipefail
$(declare -f ensure_chezmoi run_chezmoi_apply)
run_chezmoi_apply
DECLARE_AND_RUN
fi

if [ -n "${CREATE_USER:-}" ] && [ "$(uname)" = "Linux" ] && ! is_valid_username "$add_user"; then
  echo "CREATE_USER 含非法字符或为空，跳过创建用户。" >&2
fi

# 不创建用户：在当前用户下执行
run_chezmoi_apply
