#!/bin/bash

# 本地MCP设置脚本

set -e

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

log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

log_step() {
    echo -e "${BLUE}[STEP]${NC} $1"
}

# 获取当前目录
get_current_dir() {
    if command -v realpath &> /dev/null; then
        realpath "$(pwd)"
    elif command -v readlink &> /dev/null; then
        readlink -f "$(pwd)"
    else
        pwd
    fi
}

# 方法1: 全局安装
install_global() {
    log_step "方法1: 全局安装本地包"
    
    # 安装
    if npm install -g .; then
        log_info "✓ 全局安装成功"
        
        # 验证安装
        if npm list -g --depth=0 | grep -q "travel-mcp"; then
            log_info "✓ 包已正确安装"
            
            # 显示配置
            echo ""
            log_info "MCP客户端配置:"
            cat << 'EOF'
{
  "mcpServers": {
    "geoapify-maps": {
      "command": "@travel-mcp/geoapify-server",
      "args": [],
      "env": {
        "GEOAPIFY_API_KEY": "3234bd7e35264a8aa29fc15e89f8f76f"
      }
    }
  }
}
EOF
            return 0
        else
            log_warn "包安装验证失败"
            return 1
        fi
    else
        log_error "全局安装失败"
        return 1
    fi
}

# 方法2: NPM Link
install_link() {
    log_step "方法2: NPM Link"
    
    if npm link; then
        log_info "✓ NPM Link 成功"
        
        # 显示配置
        echo ""
        log_info "MCP客户端配置:"
        cat << 'EOF'
{
  "mcpServers": {
    "geoapify-maps": {
      "command": "npx",
      "args": ["@travel-mcp/geoapify-server"],
      "env": {
        "GEOAPIFY_API_KEY": "3234bd7e35264a8aa29fc15e89f8f76f"
      }
    }
  }
}
EOF
        return 0
    else
        log_error "NPM Link 失败"
        return 1
    fi
}

# 方法3: 直接路径
setup_direct_path() {
    log_step "方法3: 直接路径调用"
    
    local current_dir=$(get_current_dir)
    local mcp_script="$current_dir/bin/mcp-server.js"
    
    if [ -f "$mcp_script" ]; then
        log_info "✓ MCP脚本找到: $mcp_script"
        
        # 显示配置
        echo ""
        log_info "MCP客户端配置:"
        cat << EOF
{
  "mcpServers": {
    "geoapify-maps": {
      "command": "node",
      "args": ["$mcp_script"],
      "env": {
        "GEOAPIFY_API_KEY": "3234bd7e35264a8aa29fc15e89f8f76f"
      }
    }
  }
}
EOF
        return 0
    else
        log_error "MCP脚本未找到: $mcp_script"
        return 1
    fi
}

# 方法4: 创建启动脚本
create_startup_script() {
    log_step "方法4: 创建启动脚本"
    
    local current_dir=$(get_current_dir)
    local startup_script="$current_dir/start-mcp.sh"
    
    # 创建启动脚本
    cat > "$startup_script" << EOF
#!/bin/bash
cd "$current_dir"
node bin/mcp-server.js
EOF
    
    chmod +x "$startup_script"
    
    if [ -f "$startup_script" ]; then
        log_info "✓ 启动脚本创建成功: $startup_script"
        
        # 显示配置
        echo ""
        log_info "MCP客户端配置:"
        cat << EOF
{
  "mcpServers": {
    "geoapify-maps": {
      "command": "$startup_script",
      "args": [],
      "env": {
        "GEOAPIFY_API_KEY": "3234bd7e35264a8aa29fc15e89f8f76f"
      }
    }
  }
}
EOF
        return 0
    else
        log_error "启动脚本创建失败"
        return 1
    fi
}

# 测试MCP服务器
test_mcp_server() {
    log_step "测试MCP服务器"
    
    if node scripts/test-mcp.js unit; then
        log_info "✓ MCP服务器测试通过"
        return 0
    else
        log_error "MCP服务器测试失败"
        return 1
    fi
}

# 显示配置文件位置
show_config_locations() {
    log_step "MCP客户端配置文件位置"
    
    echo ""
    log_info "Claude Desktop 配置文件位置:"
    echo "  macOS: ~/Library/Application Support/Claude/claude_desktop_config.json"
    echo "  Windows: %APPDATA%\\Claude\\claude_desktop_config.json"
    echo "  Linux: ~/.config/claude/claude_desktop_config.json"
    echo ""
    
    log_info "配置步骤:"
    echo "  1. 打开配置文件"
    echo "  2. 添加上面显示的MCP配置"
    echo "  3. 保存文件"
    echo "  4. 重启Claude Desktop"
    echo "  5. 测试: '请帮我查找北京天安门的坐标'"
}

# 主菜单
show_menu() {
    echo ""
    log_info "🔧 本地MCP设置向导"
    echo ""
    echo "请选择安装方法:"
    echo "  1) 全局安装 (推荐)"
    echo "  2) NPM Link"
    echo "  3) 直接路径调用"
    echo "  4) 创建启动脚本"
    echo "  5) 测试MCP服务器"
    echo "  6) 显示配置文件位置"
    echo "  7) 退出"
    echo ""
}

# 主函数
main() {
    log_info "🚀 本地MCP设置工具"
    
    # 检查必要文件
    if [ ! -f "package.json" ]; then
        log_error "package.json 不存在，请在项目根目录运行此脚本"
        exit 1
    fi
    
    if [ ! -f "bin/mcp-server.js" ]; then
        log_error "bin/mcp-server.js 不存在"
        exit 1
    fi
    
    while true; do
        show_menu
        read -p "请选择 (1-7): " choice
        
        case $choice in
            1)
                install_global
                show_config_locations
                ;;
            2)
                install_link
                show_config_locations
                ;;
            3)
                setup_direct_path
                show_config_locations
                ;;
            4)
                create_startup_script
                show_config_locations
                ;;
            5)
                test_mcp_server
                ;;
            6)
                show_config_locations
                ;;
            7)
                log_info "退出设置向导"
                exit 0
                ;;
            *)
                log_warn "无效选择，请输入 1-7"
                ;;
        esac
        
        echo ""
        read -p "按回车键继续..."
    done
}

# 处理命令行参数
case "${1:-menu}" in
    "menu")
        main
        ;;
    "global")
        install_global
        show_config_locations
        ;;
    "link")
        install_link
        show_config_locations
        ;;
    "path")
        setup_direct_path
        show_config_locations
        ;;
    "script")
        create_startup_script
        show_config_locations
        ;;
    "test")
        test_mcp_server
        ;;
    "help")
        echo "用法: $0 [命令]"
        echo ""
        echo "命令："
        echo "  menu   - 显示交互菜单（默认）"
        echo "  global - 全局安装"
        echo "  link   - NPM Link"
        echo "  path   - 直接路径"
        echo "  script - 创建启动脚本"
        echo "  test   - 测试MCP服务器"
        echo "  help   - 显示帮助"
        ;;
    *)
        log_error "未知命令: $1"
        echo "使用 '$0 help' 查看可用命令"
        exit 1
        ;;
esac
