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

BASE_URL="${LINGHOU_DOWNLOAD_BASE:-https://linghou.loock.vip/downloads/cli}"
LATEST_URL="${BASE_URL}/latest.json"
INSTALL_DIR="${LINGHOU_INSTALL_DIR:-${HOME}/.local/bin}"
MARKET_URL="${LINGHOU_MARKET_URL:-https://linghou.loock.vip}"
REALTIME_URL="${LINGHOU_REALTIME_URL:-https://linghou.loock.vip}"
UPDATE_URL="${LINGHOU_UPDATE_URL:-${LATEST_URL}}"

OS_NAME="$(uname -s)"
ARCH_NAME="$(uname -m)"
case "${OS_NAME}:${ARCH_NAME}" in
  Darwin:arm64|Darwin:aarch64) TARGET="aarch64-apple-darwin" ;;
  Darwin:x86_64|Darwin:amd64) TARGET="x86_64-apple-darwin" ;;
  Linux:x86_64|Linux:amd64) TARGET="x86_64-unknown-linux-gnu" ;;
  *)
    echo "不支持的系统或架构: ${OS_NAME} ${ARCH_NAME}" >&2
    exit 1
    ;;
esac

require_cmd() {
  if ! command -v "$1" >/dev/null 2>&1; then
    echo "缺少依赖命令: $1" >&2
    exit 1
  fi
}

require_cmd curl
require_cmd tar

sha256_file() {
  if command -v shasum >/dev/null 2>&1; then
    shasum -a 256 "$1" | awk '{print $1}'
  elif command -v sha256sum >/dev/null 2>&1; then
    sha256sum "$1" | awk '{print $1}'
  else
    echo "缺少依赖命令: shasum 或 sha256sum" >&2
    exit 1
  fi
}

PYTHON_BIN=""
if command -v python3 >/dev/null 2>&1; then
  PYTHON_BIN="python3"
elif command -v python >/dev/null 2>&1; then
  PYTHON_BIN="python"
else
  echo "缺少 python3，无法解析 ${LATEST_URL}" >&2
  exit 1
fi

TMP_DIR="$(mktemp -d)"
cleanup() {
  rm -rf "${TMP_DIR}"
}
trap cleanup EXIT

MANIFEST_PATH="${TMP_DIR}/latest.json"
curl -fsSL "${LATEST_URL}" -o "${MANIFEST_PATH}"

ARTIFACT="$("${PYTHON_BIN}" - "${MANIFEST_PATH}" "${TARGET}" <<'PY'
import json
import sys

manifest_path, target = sys.argv[1], sys.argv[2]
with open(manifest_path, "r", encoding="utf-8") as fh:
    manifest = json.load(fh)
for artifact in manifest.get("artifacts", []):
    if artifact.get("target") == target:
        print(artifact["archiveName"])
        print(artifact["downloadUrl"])
        print(artifact["sha256"])
        sys.exit(0)
raise SystemExit(f"manifest has no artifact for {target}")
PY
)"

ARCHIVE_NAME="$(printf '%s\n' "${ARTIFACT}" | sed -n '1p')"
DOWNLOAD_URL="$(printf '%s\n' "${ARTIFACT}" | sed -n '2p')"
EXPECTED_SHA256="$(printf '%s\n' "${ARTIFACT}" | sed -n '3p')"
ARCHIVE_PATH="${TMP_DIR}/${ARCHIVE_NAME}"
EXTRACT_DIR="${TMP_DIR}/extract"

mkdir -p "${EXTRACT_DIR}"
curl -fsSL "${DOWNLOAD_URL}" -o "${ARCHIVE_PATH}"

ACTUAL_SHA256="$(sha256_file "${ARCHIVE_PATH}")"
if [ "${ACTUAL_SHA256}" != "${EXPECTED_SHA256}" ]; then
  echo "SHA256 校验失败: ${ARCHIVE_NAME}" >&2
  echo "expected: ${EXPECTED_SHA256}" >&2
  echo "actual:   ${ACTUAL_SHA256}" >&2
  exit 1
fi

tar -xzf "${ARCHIVE_PATH}" -C "${EXTRACT_DIR}"
PACKAGE_DIR="${EXTRACT_DIR}/${ARCHIVE_NAME%.tar.gz}"

install -d "${INSTALL_DIR}"
install -m 755 "${PACKAGE_DIR}/lh" "${INSTALL_DIR}/lh"
install -m 755 "${PACKAGE_DIR}/lhcli-nmhost" "${INSTALL_DIR}/lhcli-nmhost"

"${INSTALL_DIR}/lh" config set market-url "${MARKET_URL}"
"${INSTALL_DIR}/lh" config set realtime-url "${REALTIME_URL}"
"${INSTALL_DIR}/lh" config set update-url "${UPDATE_URL}"

echo "Linghou CLI 已安装到 ${INSTALL_DIR}"
echo "版本信息:"
"${INSTALL_DIR}/lh" --version || true

case ":${PATH}:" in
  *":${INSTALL_DIR}:"*) ;;
  *)
    echo ""
    echo "提示: 当前 PATH 不包含 ${INSTALL_DIR}"
    echo "请把下面这行加入你的 shell 配置文件，然后重新打开终端:"
    echo "export PATH=\"${INSTALL_DIR}:\$PATH\""
    ;;
esac

echo ""
echo "下一步:"
echo "1. 打开 Chrome Web Store 安装 Linghou 插件:"
echo "   https://chromewebstore.google.com/detail/灵猴-linghou/iblfknlmegjlaohhdknfidhocnpgibch"
echo "2. 登录 CLI:"
echo "   lh login"
echo "3. 安装 Native Messaging host:"
echo "   lh install-host"
