#!/bin/bash
#
# J-Link 一键安装/配置脚本 for macOS
# 用法: bash install_jlink.sh
#

set -euo pipefail

# -------------------- 配置 --------------------
# 如需指定版本，修改此处即可
VERSION="V812"
PKG_PREFIX="JLink_MacOSX_${VERSION}"
TMP_DIR=$(mktemp -d)
trap 'rm -rf "$TMP_DIR"' EXIT

# 颜色
RED=$'\033[0;31m'
GREEN=$'\033[0;32m'
YELLOW=$'\033[1;33m'
BLUE=$'\033[0;34m'
NC=$'\033[0m'

log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_ok()   { echo -e "${GREEN}[OK]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_err()  { echo -e "${RED}[ERR]${NC} $1"; }

# -------------------- 检查现有安装 --------------------
check_existing() {
    if command -v JLinkExe &>/dev/null; then
        log_ok "J-Link 命令行工具已可在终端使用"
        JLinkExe -version 2>/dev/null | head -5 || true
        return 0
    fi

    local found_app
    found_app=$(find /Applications -maxdepth 2 -iname "*jlink*" -type d 2>/dev/null | head -n 1)
    if [[ -n "$found_app" ]]; then
        log_warn "发现 J-Link 应用，但未加入系统 PATH"
        echo "  位置: $found_app"
        return 2
    fi

    return 1
}

# -------------------- 自动下载 --------------------
download_pkg() {
    local pkg_name=""
    local download_url=""
    local http_code

    # 尝试几种常见的包名后缀
    for suffix in "universal.pkg" "x86_64.pkg" "arm64.pkg" "pkg"; do
        pkg_name="${PKG_PREFIX}_${suffix}"
        download_url="https://www.segger.com/downloads/jlink/${pkg_name}"

        log_info "尝试下载: $pkg_name ..."
        http_code=$(curl -w "%{http_code}" -L \
            -H "Content-Type: application/x-www-form-urlencoded" \
            -d "accept_license=1" \
            -o "$TMP_DIR/$pkg_name" \
            "$download_url" \
            -s)

        if [[ "$http_code" == "200" ]] && [[ -s "$TMP_DIR/$pkg_name" ]]; then
            # 检查下载的是不是 HTML 错误页（SEGGER 有时会返回页面）
            local file_type
            file_type=$(file -b "$TMP_DIR/$pkg_name")
            if [[ "$file_type" == *"HTML"* ]] || [[ "$file_type" == *"text"* ]]; then
                continue
            fi
            log_ok "下载成功: $pkg_name ($(du -h "$TMP_DIR/$pkg_name" | cut -f1))"
            echo "$TMP_DIR/$pkg_name"
            return 0
        fi
    done

    return 1
}

# -------------------- 安装 pkg --------------------
install_pkg() {
    local pkg_path="$1"
    log_info "正在运行安装器 (需要管理员权限)..."
    sudo installer -pkg "$pkg_path" -target /
    log_ok "安装完成"
}

# -------------------- 配置 PATH --------------------
setup_path() {
    local shell_rc="$HOME/.zshrc"
    [[ "$(basename "$SHELL")" == "bash" ]] && shell_rc="$HOME/.bash_profile"

    local jlink_dir
    jlink_dir=$(find /Applications/SEGGER -maxdepth 1 -name "JLink_V*" -type d 2>/dev/null | sort -V | tail -n 1)

    if [[ -z "$jlink_dir" ]]; then
        log_err "在 /Applications/SEGGER 下找不到 JLink_V* 目录"
        return 1
    fi

    if grep -q "$jlink_dir" "$shell_rc" 2>/dev/null; then
        log_warn "PATH 中已存在该目录，跳过"
    else
        {
            echo ""
            echo "# SEGGER J-Link (added by install_jlink.sh)"
            echo "export PATH=\"\$PATH:$jlink_dir\""
        } >> "$shell_rc"
        log_ok "已添加 PATH 到 $shell_rc"
    fi

    echo ""
    log_info "请执行以下命令使配置生效:"
    echo "   source $shell_rc"
}

# -------------------- 主流程 --------------------
main() {
    echo "=================================="
    echo "  J-Link macOS 安装/配置脚本"
    echo "=================================="
    echo ""

    # 1. 检查是否已安装
    if check_existing; then
        log_ok "无需重复安装"
        exit 0
    fi

    # 2. 尝试自动下载安装
    local pkg_path=""
    if pkg_path=$(download_pkg); then
        install_pkg "$pkg_path"
    else
        log_warn "自动下载失败，SEGGER 官网可能需要登录或接受许可协议"
        echo ""
        echo "请按以下步骤手动安装："
        echo "  1. 浏览器打开 https://www.segger.com/downloads/jlink/"
        echo "  2. 下载 macOS 版 'J-Link Software and Documentation Pack'"
        echo "  3. 双击 .pkg 或 .dmg 完成安装"
        echo ""
        read -rp "按回车打开下载页面..."
        open "https://www.segger.com/downloads/jlink/" 2>/dev/null || true
        echo ""
        read -rp "安装完成后，按回车继续配置 PATH..."

        if ! check_existing; then
            log_err "仍未检测到 J-Link 安装"
            exit 1
        fi
    fi

    # 3. 配置环境变量
    setup_path

    # 4. 验证
    echo ""
    log_info "验证安装..."
    export PATH="$PATH:$(find /Applications/SEGGER -maxdepth 1 -name 'JLink_V*' -type d 2>/dev/null | sort -V | tail -n 1)"
    if command -v JLinkExe &>/dev/null; then
        JLinkExe -version 2>/dev/null | head -3 || true
        echo ""
        log_ok "🎉 J-Link 安装并配置成功！"
    else
        log_warn "命令仍不可用，请运行 'source $shell_rc' 后重试"
    fi
}

main "$@"
