#!/bin/sh
# Clidex CLI 安装脚本。
#
#   curl -fsSL https://clidex.dev/install.sh | sh
#
# 环境变量:
#   CLIDEX_VERSION      指定版本 (默认取最新 release),例如 v1.2.3
#   CLIDEX_INSTALL_DIR  安装目录 (默认 /usr/local/bin,没有写权限时回落到 ~/.local/bin)
#   CLIDEX_REPO         从别的仓库装 (内测用)
#
# 用 POSIX sh 而不是 bash:Alpine 之类的镜像里默认只有 /bin/sh,
# 一个安装脚本不该先要求用户去装一个 shell。
set -eu

REPO="${CLIDEX_REPO:-Coding-CLI/clidex}"
GITHUB="${CLIDEX_GITHUB_URL:-https://github.com}"
GITHUB_API="${CLIDEX_GITHUB_API:-https://api.github.com}"
VERSION="${CLIDEX_VERSION:-}"
BIN_NAME="clidex"

info() { printf '%s\n' "$*"; }
warn() { printf '%s\n' "$*" >&2; }
die() { printf 'clidex 安装失败: %s\n' "$*" >&2; exit 1; }

# ---- 1. 识别平台 ----------------------------------------------------------

detect_os() {
    os=$(uname -s | tr '[:upper:]' '[:lower:]')
    case "$os" in
        linux) echo linux ;;
        darwin) echo darwin ;;
        # Windows 用户直接下 .exe —— MSYS/Cygwin 下装出来的路径与 PATH 语义
        # 跟原生 Windows 对不上,装了也多半跑不通
        mingw*|msys*|cygwin*)
            die "Windows 请使用 PowerShell: irm https://clidex.dev/install.ps1 | iex，或 CMD: curl -fsSL https://clidex.dev/install.cmd -o install.cmd && install.cmd && del install.cmd" ;;
        *) die "不支持的操作系统: $os" ;;
    esac
}

detect_arch() {
    arch=$(uname -m)
    case "$arch" in
        x86_64|amd64) echo amd64 ;;
        aarch64|arm64) echo arm64 ;;
        *) die "不支持的 CPU 架构: $arch" ;;
    esac
}

OS=$(detect_os)
ARCH=$(detect_arch)
ASSET="${BIN_NAME}-${OS}-${ARCH}"

# ---- 2. 挑下载工具 --------------------------------------------------------

HAVE_CURL=0
if command -v curl >/dev/null 2>&1; then
    HAVE_CURL=1
    fetch() { curl -fsSL "$1" -o "$2"; }
    fetch_stdout() { curl -fsSL "$1"; }
elif command -v wget >/dev/null 2>&1; then
    fetch() { wget -qO "$2" "$1"; }
    fetch_stdout() { wget -qO- "$1"; }
else
    die "需要 curl 或 wget"
fi

# ---- 3. 解析版本 ----------------------------------------------------------

# 优先跟 /releases/latest 的 302 跳转拿 tag:**匿名调 API 每小时只有 60 次**,
# 公司出口 NAT 后面很容易撞满,而跳转没有这个限制。拿不到再退回 API
resolve_version() {
    if [ "$HAVE_CURL" = 1 ]; then
        final=$(curl -fsSLI -o /dev/null -w '%{url_effective}' \
            "$GITHUB/$REPO/releases/latest" 2>/dev/null) || final=""
        case "$final" in
            */releases/tag/*) printf '%s' "${final##*/releases/tag/}"; return 0 ;;
        esac
    fi
    fetch_stdout "$GITHUB_API/repos/$REPO/releases/latest" 2>/dev/null \
        | sed -n 's/.*"tag_name"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' \
        | head -n 1
}

if [ -z "$VERSION" ]; then
    VERSION=$(resolve_version)
    [ -n "$VERSION" ] || die "拿不到最新版本号,请用 CLIDEX_VERSION 指定,或到 $GITHUB/$REPO/releases 手动下载"
fi

DL="$GITHUB/$REPO/releases/download/$VERSION"

# ---- 4. 下载 --------------------------------------------------------------

TMP=$(mktemp -d 2>/dev/null || mktemp -d -t clidex)
trap 'rm -rf "$TMP"' EXIT INT TERM

info "正在下载 clidex $VERSION ($OS/$ARCH) ..."
fetch "$DL/$ASSET" "$TMP/$ASSET" || die "下载 $DL/$ASSET 失败"

chmod +x "$TMP/$ASSET"

# ---- 5. 安装 --------------------------------------------------------------

# 不自作主张 sudo:一个从管道跑起来的脚本去提权是最不该有的行为。
# 装不进系统目录就退到用户目录,并告诉用户怎么加 PATH
if [ -n "${CLIDEX_INSTALL_DIR:-}" ]; then
    DEST="$CLIDEX_INSTALL_DIR"
elif [ -w /usr/local/bin ] 2>/dev/null; then
    DEST=/usr/local/bin
else
    DEST="$HOME/.local/bin"
fi

mkdir -p "$DEST" || die "无法创建目录 $DEST"
mv "$TMP/$ASSET" "$DEST/$BIN_NAME" || die "无法写入 $DEST,请设置 CLIDEX_INSTALL_DIR 换一个有写权限的目录"

# macOS 上从网络下来的文件可能被打上隔离属性,执行时会弹「无法验证开发者」
if [ "$OS" = darwin ] && command -v xattr >/dev/null 2>&1; then
    xattr -d com.apple.quarantine "$DEST/$BIN_NAME" 2>/dev/null || true
fi

info "✔ 已安装到 $DEST/$BIN_NAME"

# ---- 6. 配置 PATH ---------------------------------------------------------

setup_path() {
    in_path=0
    case ":${PATH}:" in
        *":$DEST:"*) in_path=1 ;;
    esac

    # 规范化路径 (例如将 /Users/xxx/.local/bin 转为 $HOME/.local/bin)
    export_dest="$DEST"
    case "$DEST" in
        "$HOME"/*) export_dest="\$HOME/${DEST#"$HOME"/}" ;;
    esac

    # 检查常见 profile/rc 文件中是否已经包含该路径（防止跨文件或重复配置）
    already_configured=0
    for rc in "$HOME/.zshrc" "$HOME/.zprofile" "$HOME/.bashrc" "$HOME/.bash_profile" "$HOME/.profile"; do
        if [ -f "$rc" ]; then
            if grep -qF "$DEST" "$rc" 2>/dev/null || \
               grep -qF "$export_dest" "$rc" 2>/dev/null || \
               { [ "$DEST" = "$HOME/.local/bin" ] && grep -qF '~/.local/bin' "$rc" 2>/dev/null; }; then
                already_configured=1
                break
            fi
        fi
    done

    if [ "$already_configured" = 1 ]; then
        if [ "$in_path" = 0 ]; then
            warn ""
            warn "⚠ $DEST 已在 shell 配置中，但尚未在当前终端生效"
            warn "  请执行: export PATH=\"$DEST:\$PATH\" 或重启终端"
        fi
        return 0
    fi

    # 如果已经在当前 PATH 中 (如系统已默认包含 /usr/local/bin 等)，无需重复配置
    if [ "$in_path" = 1 ]; then
        return 0
    fi

    # 若指定了不自动修改配置文件，则只输出提示
    if [ "${CLIDEX_NO_MODIFY_PATH:-0}" = 1 ]; then
        warn ""
        warn "⚠ $DEST 不在 PATH 里，请手动把下面这行加进 ~/.profile 或 ~/.zshrc:"
        warn "    export PATH=\"$export_dest:\$PATH\""
        return 0
    fi

    # 挑选用户的首选 shell 配置文件
    target_rc=""
    user_shell="$(basename "${SHELL:-}")"
    case "$user_shell" in
        zsh)
            if [ -f "$HOME/.zshrc" ]; then
                target_rc="$HOME/.zshrc"
            elif [ -f "$HOME/.zprofile" ]; then
                target_rc="$HOME/.zprofile"
            else
                target_rc="$HOME/.zshrc"
            fi
            ;;
        bash)
            if [ -f "$HOME/.bashrc" ]; then
                target_rc="$HOME/.bashrc"
            elif [ -f "$HOME/.bash_profile" ]; then
                target_rc="$HOME/.bash_profile"
            else
                target_rc="$HOME/.bashrc"
            fi
            ;;
        *)
            if [ -f "$HOME/.profile" ]; then
                target_rc="$HOME/.profile"
            elif [ -f "$HOME/.zshrc" ]; then
                target_rc="$HOME/.zshrc"
            elif [ -f "$HOME/.bashrc" ]; then
                target_rc="$HOME/.bashrc"
            fi
            ;;
    esac

    if [ -n "$target_rc" ]; then
        printf '\n# Added by Clidex installer\nexport PATH="%s:$PATH"\n' "$export_dest" >> "$target_rc"
        info "✔ 已将 $DEST 添加到 PATH ($target_rc)"
        warn "⚠ 当前终端生效请执行: export PATH=\"$DEST:\$PATH\""
    else
        warn ""
        warn "⚠ $DEST 不在 PATH 里，把下面这行加进 ~/.profile 或 ~/.zshrc:"
        warn "    export PATH=\"$export_dest:\$PATH\""
    fi
}

setup_path

info ""
info "下一步:"
info "  1. 到网页控制台的「我的 Token」页面复制初始化命令"
info "  2. clidex init <platform_url> <token>"
info "  3. cd 到项目目录,直接敲 clidex"
