#!/usr/bin/env bash
set -euo pipefail

RELEASE_VERSION="1.0.2"
RELEASE_TAG="v1.0.2"
DEFAULT_BASE_URL="https://turing.tap365.org/${RELEASE_TAG}"
DEFAULT_MIRROR_URL="https://tap365.cn/turing/${RELEASE_TAG}"

log_info() {
  printf '%s\n' "[信息] $*"
}

log_warn() {
  printf '%s\n' "[警告] $*" >&2
}

log_result() {
  printf '%s\n' "[结果] $*"
}

die() {
  printf '%s\n' "[错误] $*" >&2
  exit 1
}

show_help() {
  cat <<HELP
Turing Code ${RELEASE_VERSION} 一键安装脚本

用法：
  curl -fsSL ${DEFAULT_BASE_URL}/install.sh | bash
  curl -fsSL ${DEFAULT_BASE_URL}/install.sh | bash -s -- [选项]

选项：
  --base-url <url>       指定下载根地址
  --mirror-cn            切换到腾讯镜像 ${DEFAULT_MIRROR_URL}
  --install-dir <path>   指定安装目录，默认 ~/.local/share/turing
  --bin-dir <path>       指定命令目录，默认 ~/.local/bin
  -h, --help             显示帮助

环境变量：
  TURING_DOWNLOAD_BASE_URL  与 --base-url 等价
  TURING_INSTALL_ROOT       与 --install-dir 等价
  TURING_BIN_DIR            与 --bin-dir 等价

说明：
  1. 本脚本当前仅支持 Linux x64 与 macOS x64。
  2. 安装后会写入：turing / turingopenai / turinggrok / turinggemini / turingclaude / turingp。
  3. 脚本不会写入你的真实 Key；请安装后自行配置环境变量或 ~/.claude/settings.json。
HELP
}

require_cmd() {
  command -v "$1" >/dev/null 2>&1 || die "缺少命令：$1"
}

BASE_URL="${TURING_DOWNLOAD_BASE_URL:-$DEFAULT_BASE_URL}"
INSTALL_ROOT="${TURING_INSTALL_ROOT:-${HOME}/.local/share/turing}"
BIN_DIR="${TURING_BIN_DIR:-${HOME}/.local/bin}"

while [ "$#" -gt 0 ]; do
  case "$1" in
    --base-url)
      [ "$#" -ge 2 ] || die "--base-url 缺少参数"
      BASE_URL="$2"
      shift 2
      ;;
    --mirror-cn)
      BASE_URL="$DEFAULT_MIRROR_URL"
      shift
      ;;
    --install-dir)
      [ "$#" -ge 2 ] || die "--install-dir 缺少参数"
      INSTALL_ROOT="$2"
      shift 2
      ;;
    --bin-dir)
      [ "$#" -ge 2 ] || die "--bin-dir 缺少参数"
      BIN_DIR="$2"
      shift 2
      ;;
    -h|--help)
      show_help
      exit 0
      ;;
    *)
      die "未知参数：$1"
      ;;
  esac
done

require_cmd curl
require_cmd chmod
require_cmd mkdir
require_cmd ln

OS_NAME=$(uname -s)
ARCH_NAME=$(uname -m)

case "$OS_NAME" in
  Linux)
    REMOTE_NAME="turing-${RELEASE_TAG}-linux-x64-max"
    ;;
  Darwin)
    REMOTE_NAME="turing-${RELEASE_TAG}-macos-x64"
    ;;
  *)
    die "当前系统不支持：${OS_NAME}。当前仅支持 Linux x64 / macOS x64。"
    ;;
esac

case "$ARCH_NAME" in
  x86_64|amd64)
    ;;
  *)
    die "当前架构不支持：${ARCH_NAME}。当前仅支持 x64；macOS arm64 / M1 暂未发布。"
    ;;
esac

VERSION_DIR="${INSTALL_ROOT}/${RELEASE_TAG}"
CURRENT_LINK="${INSTALL_ROOT}/current"
BINARY_PATH="${VERSION_DIR}/turing"
DOWNLOAD_URL="${BASE_URL}/${REMOTE_NAME}"
SUMS_URL="${BASE_URL}/SHA256SUMS.txt"
TMP_BINARY="${TMPDIR:-/tmp}/turing-${RELEASE_TAG}-$$"
TMP_SUMS="${TMPDIR:-/tmp}/turing-${RELEASE_TAG}-$$.sha256"

cleanup() {
  rm -f "$TMP_BINARY" "$TMP_SUMS"
}
trap cleanup EXIT

log_info "开始安装 Turing Code ${RELEASE_VERSION}"
log_info "下载地址：${DOWNLOAD_URL}"

mkdir -p "$VERSION_DIR" "$BIN_DIR" "$INSTALL_ROOT"

curl -fL --retry 3 --connect-timeout 15 -o "$TMP_BINARY" "$DOWNLOAD_URL"
curl -fL --retry 3 --connect-timeout 15 -o "$TMP_SUMS" "$SUMS_URL"

EXPECTED_SHA=$(awk -v name="$REMOTE_NAME" '$2 == name { print $1; exit }' "$TMP_SUMS")
if [ -z "$EXPECTED_SHA" ]; then
  die "未能在 SHA256SUMS.txt 中找到 ${REMOTE_NAME} 的校验值。"
fi

if command -v shasum >/dev/null 2>&1; then
  ACTUAL_SHA=$(shasum -a 256 "$TMP_BINARY" | awk '{print $1}')
elif command -v sha256sum >/dev/null 2>&1; then
  ACTUAL_SHA=$(sha256sum "$TMP_BINARY" | awk '{print $1}')
else
  log_warn "当前机器没有 shasum/sha256sum，跳过本地校验。"
  ACTUAL_SHA="$EXPECTED_SHA"
fi

if [ "$ACTUAL_SHA" != "$EXPECTED_SHA" ]; then
  die "下载校验失败：期望 ${EXPECTED_SHA}，实际 ${ACTUAL_SHA}。"
fi

cp "$TMP_BINARY" "$BINARY_PATH"
chmod 755 "$BINARY_PATH"
ln -sfn "$VERSION_DIR" "$CURRENT_LINK"

write_wrapper() {
  local wrapper_path="$1"
  local wrapper_body="$2"
  cat > "$wrapper_path" <<WRAPPER_HEAD
#!/usr/bin/env sh
set -eu

BINARY_PATH="${CURRENT_LINK}/turing"
if [ ! -x "\$BINARY_PATH" ]; then
  printf '%s\n' "错误：未找到 Turing 二进制：\$BINARY_PATH" >&2
  exit 1
fi

export TURING_DISABLE_GLOBAL_CONFIG=1
WRAPPER_HEAD
  cat >> "$wrapper_path" <<WRAPPER_BODY
${wrapper_body}
exec "\$BINARY_PATH" "\$@"
WRAPPER_BODY
  chmod 755 "$wrapper_path"
}

write_wrapper "${BIN_DIR}/turing" '
export TURING_PROVIDER_PRESET="openai"
export CLAUDE_CODE_USE_OPENAI_RESPONSES="1"
export CLAUDE_CODE_USE_GEMINI=""
export OPENAI_BASE_URL="${OPENAI_BASE_URL:-https://sub-lb.tap365.org/v1}"
export OPENAI_MODEL="${OPENAI_MODEL:-gpt-5.4}"
export TURING_IMAGE_BASE_URL="${TURING_IMAGE_BASE_URL:-https://progpt.tap365.org/c2a-4a57f72b}"
export TURING_IMAGE_MODEL="${TURING_IMAGE_MODEL:-gpt-image-1-mini}"
'

write_wrapper "${BIN_DIR}/turingopenai" '
export TURING_PROVIDER_PRESET="openai"
export CLAUDE_CODE_USE_OPENAI_RESPONSES="1"
export CLAUDE_CODE_USE_GEMINI=""
export OPENAI_BASE_URL="${OPENAI_BASE_URL:-https://sub-lb.tap365.org/v1}"
export OPENAI_MODEL="${OPENAI_MODEL:-gpt-5.4}"
export TURING_IMAGE_BASE_URL="${TURING_IMAGE_BASE_URL:-https://progpt.tap365.org/c2a-4a57f72b}"
export TURING_IMAGE_MODEL="${TURING_IMAGE_MODEL:-gpt-image-1-mini}"
'

write_wrapper "${BIN_DIR}/turinggrok" '
export TURING_PROVIDER_PRESET="grok"
export CLAUDE_CODE_USE_OPENAI_RESPONSES="1"
export CLAUDE_CODE_USE_GEMINI=""
if [ -n "${GROK_API_KEY:-}" ]; then
  export OPENAI_API_KEY="${GROK_API_KEY}"
  export TURING_IMAGE_API_KEY="${GROK_API_KEY}"
fi
export OPENAI_BASE_URL="${GROK_BASE_URL:-https://grok74.tap365.org/v1}"
export OPENAI_MODEL="${GROK_MODEL:-grok-4.1-fast}"
export TURING_IMAGE_BASE_URL="${GROK_BASE_URL:-https://grok74.tap365.org/v1}"
export TURING_IMAGE_MODEL="${TURING_GROK_IMAGE_MODEL:-grok-imagine-1.0}"
'

write_wrapper "${BIN_DIR}/turinggemini" '
export TURING_PROVIDER_PRESET="gemini"
export CLAUDE_CODE_USE_GEMINI="1"
export CLAUDE_CODE_USE_OPENAI_RESPONSES=""
GEMINI_BASE_URL_RESOLVED="${GEMINI_BASE_URL:-${GOOGLE_GEMINI_BASE_URL:-https://sub-lb.tap365.org/v1}}"
export GEMINI_BASE_URL="${GEMINI_BASE_URL_RESOLVED}"
export GOOGLE_GEMINI_BASE_URL="${GEMINI_BASE_URL_RESOLVED}"
if [ -n "${GOOGLE_GEMINI_API_KEY:-}" ] && [ -z "${GEMINI_API_KEY:-}" ]; then
  export GEMINI_API_KEY="${GOOGLE_GEMINI_API_KEY}"
fi
export GEMINI_MODEL="${TURING_GEMINI_MODEL:-${GEMINI_MODEL:-gemini-3.1-flash-lite-preview}}"
'

write_wrapper "${BIN_DIR}/turingp" '
export TURING_PROVIDER_PRESET="gemini"
export CLAUDE_CODE_USE_GEMINI="1"
export CLAUDE_CODE_USE_OPENAI_RESPONSES=""
GEMINI_BASE_URL_RESOLVED="${GEMINI_BASE_URL:-${GOOGLE_GEMINI_BASE_URL:-https://sub-lb.tap365.org/v1}}"
export GEMINI_BASE_URL="${GEMINI_BASE_URL_RESOLVED}"
export GOOGLE_GEMINI_BASE_URL="${GEMINI_BASE_URL_RESOLVED}"
if [ -n "${GOOGLE_GEMINI_API_KEY:-}" ] && [ -z "${GEMINI_API_KEY:-}" ]; then
  export GEMINI_API_KEY="${GOOGLE_GEMINI_API_KEY}"
fi
export GEMINI_MODEL="${TURINGP_MODEL:-gemini-3.1-flash-lite-preview}"
'

write_wrapper "${BIN_DIR}/turingclaude" '
export TURING_PROVIDER_PRESET="claude"
export CLAUDE_CODE_USE_GEMINI=""
export CLAUDE_CODE_USE_OPENAI_RESPONSES=""
if [ -n "${ANTHROPIC_API_KEY:-}" ] && [ -z "${ANTHROPIC_AUTH_TOKEN:-}" ]; then
  export ANTHROPIC_AUTH_TOKEN="${ANTHROPIC_API_KEY}"
fi
if [ -n "${ANTHROPIC_AUTH_TOKEN:-}" ] && [ -z "${ANTHROPIC_API_KEY:-}" ]; then
  export ANTHROPIC_API_KEY="${ANTHROPIC_AUTH_TOKEN}"
fi
export ANTHROPIC_BASE_URL="${ANTHROPIC_BASE_URL:-https://sub-lb.tap365.org}"
export ANTHROPIC_MODEL="${ANTHROPIC_MODEL:-claude-sonnet-4-6}"
'

log_result "安装完成：${BINARY_PATH}"
log_result "命令目录：${BIN_DIR}"
log_result "已写入命令：turing / turingopenai / turinggrok / turinggemini / turingclaude / turingp"

case ":$PATH:" in
  *":${BIN_DIR}:"*)
    log_info "PATH 已包含 ${BIN_DIR}"
    ;;
  *)
    log_warn "当前 PATH 未包含 ${BIN_DIR}，请加入后再用新命令。"
    printf '%s\n' "export PATH=\"${BIN_DIR}:\$PATH\""
    ;;
esac

cat <<DONE

下一步建议：
  turing --version
  turing -p "只回复 ok"

如需配置 Key，可写入：
  OPENAI_API_KEY
  GROK_API_KEY
  GEMINI_API_KEY
  ANTHROPIC_AUTH_TOKEN

DONE
