#!/bin/bash
# MyAgent Unix/macOS 启动脚本
# 用法: ./start.sh [cli|web|tray|server|setup|reinstall]
# 支持 npm 全局安装后从任意目录运行
#
# 所有依赖安装到独立虚拟环境 ~/.myagent/venv

set -euo pipefail

# ── 颜色 ────────────────────────────────────────────
BOLD='\033[1m'
ACCENT='\033[36m'
INFO='\033[90m'
SUCCESS='\033[32m'
WARN='\033[33m'
ERROR='\033[31m'
NC='\033[0m'

info()    { echo -e "${INFO}[i]${NC} $*"; }
success() { echo -e "${SUCCESS}[✓]${NC} $*"; }
warn()    { echo -e "${WARN}[!]${NC} $*"; }
err()     { echo -e "${ERROR}[✗]${NC} $*" >&2; }

# ── 解析脚本真实路径（兼容 symlink） ─────────
resolve_script_dir() {
    local src="${BASH_SOURCE[0]}"
    while [ -L "$src" ]; do
        local dir="$(cd -P "$(dirname "$src")" && pwd)"
        src="$(readlink "$src")"
        [[ "$src" != /* ]] && src="$dir/$src"
    done
    cd -P "$(dirname "$src")" && pwd
}

SCRIPT_DIR="$(resolve_script_dir)"
PROJECT_DIR="$SCRIPT_DIR"

if [ ! -f "$PROJECT_DIR/main.py" ]; then
    NPM_PKG_DIR="$(npm root -g 2>/dev/null)/myagent-ai"
    if [ -f "$NPM_PKG_DIR/main.py" ]; then
        PROJECT_DIR="$NPM_PKG_DIR"
    else
        err "错误: 找不到 main.py"
        echo "  脚本目录: $SCRIPT_DIR"
        echo "  请确保从正确位置运行，或重新安装: npm install -g myagent-ai"
        exit 1
    fi
fi

# ── 虚拟环境 ────────────────────────────────────────
VENV_DIR="$HOME/.myagent/venv"
VENV_PY="$VENV_DIR/bin/python"
VENV_PIP="$VENV_DIR/bin/pip"
MYAGENT_DIR="$HOME/.myagent"

# 查找系统 Python
find_system_python() {
    hash -r 2>/dev/null || true
    for cmd in python3 python3.14 python3.13 python3.12 python; do
        if command -v "$cmd" &>/dev/null; then
            local ver
            ver="$($cmd -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")' 2>/dev/null)" || continue
            local major minor
            major="$(echo "$ver" | cut -d. -f1)"
            minor="$(echo "$ver" | cut -d. -f2)"
            if [ "$major" -ge 3 ] && [ "$minor" -ge 10 ]; then
                echo "$cmd"
                return 0
            fi
        fi
    done
    echo ""
}

# 确保虚拟环境存在
ensure_venv() {
    # 检查现有 venv
    if [ -f "$VENV_PY" ]; then
        if "$VENV_PY" --version &>/dev/null; then
            return 0
        fi
        # venv 损坏，重建
        warn "虚拟环境已损坏，正在重建..."
        rm -rf "$VENV_DIR"
    fi

    # 需要创建
    local sys_py
    sys_py="$(find_system_python)"
    if [ -z "$sys_py" ]; then
        err "未找到 Python 3.10+"
        echo "  macOS:  brew install python@3.14"
        echo "  Linux:  sudo apt install python3.14 python3-pip"
        echo ""
        echo "  一键安装: curl -fsSL https://raw.githubusercontent.com/ctz168/myagent/main/install/install.sh | bash"
        exit 1
    fi

    mkdir -p "$MYAGENT_DIR"
    echo -e "  ${ACCENT}[*]${NC} 创建独立虚拟环境..."
    info "位置: $VENV_DIR"
    info "系统Python: $sys_py"
    "$sys_py" -m venv "$VENV_DIR"
    success "虚拟环境已创建"
}

# 检查并安装依赖
install_deps() {
    local missing=0
    local req_file="$PROJECT_DIR/requirements.txt"

    echo -e "  ${ACCENT}[*]${NC} 检查依赖..."

    for mod in openai aiohttp requests; do
        if "$VENV_PY" -c "import $mod" 2>/dev/null; then
            success "  $mod"
        else
            warn "  $mod"
            missing=1
        fi
    done

    if [ "$missing" -eq 0 ]; then
        return 0
    fi

    # 升级 pip
    echo -e "  ${INFO}[i]${NC} 升级 pip..."
    "$VENV_PY" -m pip install --upgrade pip --quiet 2>/dev/null || true

    if [ -f "$req_file" ]; then
        echo -e "  ${WARN}[!]${NC} 正在安装缺失依赖到虚拟环境..."
        "$VENV_PY" -m pip install -r "$req_file" --disable-pip-version-check
        success "依赖安装完成"
    else
        warn "未找到 requirements.txt"
        # fallback: 直接安装核心包
        "$VENV_PY" -m pip install --quiet \
            "openai>=1.12.0" "aiohttp>=3.9.0" "requests>=2.31.0" \
            "duckduckgo-search>=6.0.0" "beautifulsoup4>=4.12.0" \
            "lxml>=5.0.0" "psutil>=5.9.0" --disable-pip-version-check 2>/dev/null || true
        success "核心依赖安装完成"
    fi
}

# ── 首次运行检测 ─────────────────────────────────
check_first_run() {
    if [ ! -f "$HOME/.myagent/config.json" ]; then
        echo ""
        info "检测到首次运行，MyAgent 将在启动后引导你完成配置。"
        echo "  1. 配置 LLM API Key（支持 OpenAI/Anthropic/ModelScope 等）"
        echo "  2. 选择默认运行模式"
        echo ""
    fi
}

# ── 确定运行模式 ─────────────────────────────────
MODE="${1:-}"

if [ -z "$MODE" ]; then
    echo ""
    echo -e "  ${BOLD}MyAgent${NC} - 本地桌面端执行型 AI 助手"
    echo ""
    echo "选择运行模式:"
    echo "  1) CLI 交互模式"
    echo "  2) Web 管理后台 (推荐, 端口 8767)"
    echo "  3) 系统托盘模式"
    echo "  4) 纯 API 服务模式"
    echo "  5) 首次配置向导"
    echo ""
    read -rp "请输入 (1-5) [2]: " MODE
    case "$MODE" in
        1) MODE="cli" ;;
        2|'') MODE="web" ;;
        3) MODE="tray" ;;
        4) MODE="server" ;;
        5) MODE="setup" ;;
        *) MODE="web" ;;
    esac
fi

cd "$PROJECT_DIR"

# 特殊命令: reinstall
if [ "$MODE" = "reinstall" ]; then
    if [ -d "$VENV_DIR" ]; then
        echo -e "  ${ACCENT}[*]${NC} 删除旧虚拟环境..."
        rm -rf "$VENV_DIR"
    fi
    ensure_venv
    install_deps
    echo ""
    success "依赖已全部重新安装到虚拟环境"
    info "虚拟环境: $VENV_DIR"
    echo ""
    exit 0
fi

# ── 主流程 ─────────────────────────────────────────
echo ""
echo -e "  ${BOLD}${ACCENT}MyAgent${NC} - 本地桌面端执行型 AI 助手"
echo ""

ensure_venv
install_deps
check_first_run

info "虚拟环境: $VENV_DIR"
info "Python: $VENV_PY"
echo ""

case "$MODE" in
    cli)
        echo -e "${ACCENT}启动 CLI 模式...${NC}"
        exec "$VENV_PY" main.py
        ;;
    web)
        echo -e "${ACCENT}启动 Web 管理后台 (http://localhost:8767)...${NC}"
        echo -e "${INFO}按 Ctrl+C 停止${NC}"
        echo ""
        exec "$VENV_PY" main.py --web
        ;;
    tray)
        echo -e "${ACCENT}启动系统托盘模式...${NC}"
        exec "$VENV_PY" main.py --tray
        ;;
    server)
        echo -e "${ACCENT}启动纯 API 服务...${NC}"
        exec "$VENV_PY" main.py --server
        ;;
    setup)
        echo -e "${ACCENT}启动配置向导...${NC}"
        exec "$VENV_PY" main.py --setup
        ;;
    *)
        err "未知模式: $MODE"
        echo "可用模式: cli | web | tray | server | setup | reinstall"
        exit 1
        ;;
esac
