#!/usr/bin/env bash
#
# UbuntuClash 发布版在线安装脚本 (支持 Bash / Zsh)
#
# 面向管道执行, 例如:
#   curl -fsSL <base>/ubuntu-clash/unix/install.sh | bash
#   curl -fsSL <base>/ubuntu-clash/unix/install.sh | bash -s -- --prefix "$HOME/.local"
#
# 自签/私有 CA 证书导致证书校验失败时, 引导下载与内部下载都可跳过校验:
#   curl -kfsSL <base>/ubuntu-clash/unix/install.sh | bash -s -- --insecure
#   (或设置 UCLASH_INSECURE=1)
#
# 本脚本只负责下载并解压发布归档 uclash-unix.tar.gz, 然后执行包内的 install.sh
# (即本地安装逻辑), 并把其余参数原样透传给它。下载根地址默认取编译期注入的
# 占位符, 运行时可用环境变量 UCLASH_BASE_URL 或 --base-url 覆盖。
set -euo pipefail

APP=uclash
# 基地址占位符由 scripts/package.sh 替换; 下载根为其后的 ubuntu-clash/unix。
RELEASE_PATH="ubuntu-clash/unix"
BASE_URL="${UCLASH_BASE_URL:-https://files.tymler.work/clash}"

INSECURE=0
case "${UCLASH_INSECURE:-}" in
  1|true|yes|on) INSECURE=1 ;;
esac

usage() {
  cat <<EOF
用法: curl -fsSL $BASE_URL/$RELEASE_PATH/install.sh | bash -s -- [选项]

下载并安装 uclash 及其 Bash/Zsh Tab 补全。

选项:
  --prefix DIR      安装前缀 (默认: \$HOME/.local, 命令安装到 DIR/bin)
  --shell <名称>    目标 shell: bash | zsh | both | auto (默认 auto)
  --reinstall       已安装时先完全清理旧版本再安装
  --force           已安装且目标版本更低时, 允许直接降级 (不交互)
  --insecure        跳过 TLS 证书校验 (自签/私有 CA; 有风险)
  --base-url URL    下载基地址 (默认: \$UCLASH_BASE_URL 或 $BASE_URL)
  -h, --help        显示本帮助

自签/私有 CA 环境还需让引导下载跳过校验:
  curl -kfsSL $BASE_URL/$RELEASE_PATH/install.sh | bash -s -- --insecure
EOF
}

PASSTHRU=()
while [ $# -gt 0 ]; do
  case "$1" in
    --base-url)   shift; BASE_URL="${1:-}" ;;
    --base-url=*) BASE_URL="${1#*=}" ;;
    --insecure)   INSECURE=1 ;;
    -h|--help)    usage; exit 0 ;;
    --)           shift; PASSTHRU+=("$@"); break ;;
    *)            PASSTHRU+=("$1") ;;
  esac
  shift
done

[ -n "$BASE_URL" ] || { printf '下载根地址不能为空 (--base-url / UCLASH_BASE_URL)\n' >&2; exit 1; }

case "$(uname -s)" in
  Linux) ;;
  *) printf '错误: 不支持的操作系统: %s (仅支持 Linux)\n' "$(uname -s)" >&2; exit 1 ;;
esac

for cmd in tar mktemp; do
  command -v "$cmd" >/dev/null 2>&1 || { printf '错误: 缺少依赖命令: %s\n' "$cmd" >&2; exit 1; }
done

if command -v curl >/dev/null 2>&1; then
  DOWNLOADER=curl
elif command -v wget >/dev/null 2>&1; then
  DOWNLOADER=wget
else
  printf '错误: 需要 curl 或 wget 以进行下载\n' >&2
  exit 1
fi

ROOT="${BASE_URL%/}/$RELEASE_PATH"
ARCHIVE="$APP-unix.tar.gz"
URL="$ROOT/$ARCHIVE"

TMP_DIR="$(mktemp -d "${TMPDIR:-/tmp}/uclash.XXXXXX")"
trap 'rm -rf "$TMP_DIR"' EXIT

fetch() {
  # fetch <url> <dest>
  if [ "$DOWNLOADER" = "curl" ]; then
    if [ "$INSECURE" -eq 1 ]; then
      curl -kfsSL "$1" -o "$2"
    else
      curl -fsSL "$1" -o "$2"
    fi
  else
    if [ "$INSECURE" -eq 1 ]; then
      wget -q --no-check-certificate "$1" -O "$2"
    else
      wget -q "$1" -O "$2"
    fi
  fi
}

if [ "$INSECURE" -eq 1 ]; then
  printf '警告: 已跳过 TLS 证书校验 (--insecure)\n' >&2
fi

printf '下载 %s\n' "$URL"
fetch "$URL" "$TMP_DIR/$ARCHIVE" || { printf '错误: 下载失败: %s\n' "$URL" >&2; exit 1; }

# 尽力校验 sha256; 校验文件缺失时仅提示, 不阻断安装。
if fetch "$URL.sha256" "$TMP_DIR/$ARCHIVE.sha256" 2>/dev/null; then
  if command -v sha256sum >/dev/null 2>&1; then
    expected="$(awk '{print $1}' "$TMP_DIR/$ARCHIVE.sha256")"
    actual="$(sha256sum "$TMP_DIR/$ARCHIVE" | awk '{print $1}')"
    [ "$expected" = "$actual" ] || { printf '错误: sha256 校验失败 (期望 %s, 实际 %s)\n' "$expected" "$actual" >&2; exit 1; }
    printf 'sha256 校验通过\n'
  elif command -v shasum >/dev/null 2>&1; then
    expected="$(awk '{print $1}' "$TMP_DIR/$ARCHIVE.sha256")"
    actual="$(shasum -a 256 "$TMP_DIR/$ARCHIVE" | awk '{print $1}')"
    [ "$expected" = "$actual" ] || { printf '错误: sha256 校验失败 (期望 %s, 实际 %s)\n' "$expected" "$actual" >&2; exit 1; }
    printf 'sha256 校验通过\n'
  else
    printf '提示: 未找到 sha256sum/shasum, 跳过校验\n' >&2
  fi
else
  printf '提示: 未取到校验文件, 跳过校验\n' >&2
fi

tar -xzf "$TMP_DIR/$ARCHIVE" -C "$TMP_DIR" || { printf '错误: 解压失败: %s\n' "$ARCHIVE" >&2; exit 1; }

INNER="$TMP_DIR/$APP-unix/install.sh"
[ -f "$INNER" ] || { printf '错误: 归档中未找到 install.sh\n' >&2; exit 1; }

bash "$INNER" ${PASSTHRU[@]+"${PASSTHRU[@]}"}
