#!/bin/bash

# 🎯 MCP服务生态系统管理器
# 基于awesome-mcp-servers项目的模块化MCP服务管理工具

set -e

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

# 配置
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ENV_FILE="$SCRIPT_DIR/.env"

# 服务层级定义 (兼容旧版bash)
get_tier_file() {
    case "$1" in
        "core") echo "docker-compose.core.yml" ;;
        "extended") echo "docker-compose.extended.yml" ;;
        "professional") echo "docker-compose.professional.yml" ;;
        *) echo "" ;;
    esac
}

get_tier_description() {
    case "$1" in
        "core") echo "核心基础服务 (无需API密钥)" ;;
        "extended") echo "扩展功能服务 (部分需要免费API)" ;;
        "professional") echo "专业工具服务 (需要付费API)" ;;
        *) echo "" ;;
    esac
}

# 日志函数
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
log_highlight() { echo -e "${PURPLE}[HIGHLIGHT]${NC} $1"; }
log_step() { echo -e "${CYAN}[STEP]${NC} $1"; }

# 显示横幅
show_banner() {
    echo -e "${PURPLE}"
    cat << 'EOF'
╔══════════════════════════════════════════════════════════════╗
║                    🎯 MCP服务生态系统管理器                    ║
║                                                              ║
║  基于 awesome-mcp-servers 项目的模块化MCP服务管理工具         ║
║  支持分层部署、按需启动、智能管理                             ║
╚══════════════════════════════════════════════════════════════╝
EOF
    echo -e "${NC}"
}

# 检查依赖
check_dependencies() {
    log_step "检查系统依赖..."
    
    local missing_deps=()
    
    if ! command -v docker &> /dev/null; then
        missing_deps+=("docker")
    fi
    
    if ! command -v docker-compose &> /dev/null; then
        missing_deps+=("docker-compose")
    fi
    
    if [ ${#missing_deps[@]} -ne 0 ]; then
        log_error "缺少依赖: ${missing_deps[*]}"
        echo "请安装缺少的依赖后重试"
        exit 1
    fi
    
    log_success "依赖检查完成"
}

# 检查环境变量文件
check_env_file() {
    if [ ! -f "$ENV_FILE" ]; then
        log_warning "环境变量文件不存在，创建默认配置..."
        create_default_env
    fi
}

# 创建默认环境变量文件
create_default_env() {
    cat > "$ENV_FILE" << 'EOF'
# MCP服务生态系统环境变量配置

# ===== 核心服务 (无需API密钥) =====
# Memory, Filesystem, Git, Time, Calculator MCP

# ===== 扩展服务 =====
# GitHub Personal Access Token (免费)
GITHUB_PERSONAL_ACCESS_TOKEN=your_github_token_here

# Brave Search API Key (2000次/月免费)
BRAVE_API_KEY=your_brave_api_key_here

# ===== 专业服务 =====
# OpenAI API Key (按量付费)
OPENAI_API_KEY=your_openai_api_key_here

# Notion Integration Token (免费)
NOTION_TOKEN=your_notion_token_here

# Wolfram Alpha App ID (2000次/月免费)
WOLFRAM_ALPHA_APPID=your_wolfram_app_id_here

# ===== 安全提醒 =====
# - 请勿将此文件提交到版本控制系统
# - 设置文件权限: chmod 600 .env
# - 定期更换API密钥
EOF
    
    chmod 600 "$ENV_FILE"
    log_success "默认环境变量文件已创建: $ENV_FILE"
}

# 检查API密钥配置
check_api_keys() {
    log_step "检查API密钥配置状态..."
    
    echo ""
    echo -e "${CYAN}📋 API密钥配置状态:${NC}"
    
    # 核心服务 (无需API密钥)
    echo -e "${GREEN}✅ 核心服务 (立即可用):${NC}"
    echo "  • Memory MCP - 知识图谱记忆"
    echo "  • Filesystem MCP - 文件系统操作"
    echo "  • Git MCP - 版本控制"
    echo "  • Time MCP - 时间处理"
    echo "  • Calculator MCP - 数学计算"
    
    echo ""
    echo -e "${YELLOW}⚡ 扩展服务:${NC}"
    check_key "GITHUB_PERSONAL_ACCESS_TOKEN" "GitHub代码仓库管理" "免费"
    check_key "BRAVE_API_KEY" "Brave网络搜索" "2000次/月免费"
    echo "  • Fetch MCP - 网页内容获取 (无需密钥)"
    echo "  • SQLite MCP - 轻量级数据库 (无需密钥)"
    echo "  • YouTube MCP - 视频内容分析 (无需密钥)"
    
    echo ""
    echo -e "${PURPLE}🚀 专业服务:${NC}"
    check_key "OPENAI_API_KEY" "OpenAI模型调用" "按量付费"
    check_key "NOTION_TOKEN" "Notion知识管理" "免费"
    check_key "WOLFRAM_ALPHA_APPID" "Wolfram Alpha计算引擎" "2000次/月免费"
    echo "  • ArXiv MCP - 学术论文检索 (无需密钥)"
}

# 检查单个API密钥
check_key() {
    local key_name="$1"
    local service_desc="$2"
    local cost_info="$3"
    
    if grep -q "^${key_name}=.*[^_here]$" "$ENV_FILE" 2>/dev/null; then
        echo -e "  ${GREEN}✅${NC} $service_desc ($cost_info)"
    else
        echo -e "  ${RED}❌${NC} $service_desc ($cost_info) - 未配置"
    fi
}

# 创建数据目录
setup_directories() {
    log_step "创建数据目录结构..."
    
    mkdir -p mcp-data/{memory,filesystem,git,github,sqlite}
    
    # 创建Git配置
    cat > mcp-data/git/.gitconfig << 'EOF'
[user]
    name = MCP Git User
    email = mcp@example.com
[init]
    defaultBranch = main
EOF
    
    # 创建示例文件
    cat > mcp-data/filesystem/README.md << 'EOF'
# MCP服务生态系统

欢迎使用基于awesome-mcp-servers项目的MCP服务生态系统！

## 当前启用的服务

### 核心服务 (Tier 1)
- Memory MCP - 知识图谱记忆
- Filesystem MCP - 文件系统操作
- Git MCP - 版本控制
- Time MCP - 时间处理
- Calculator MCP - 数学计算

### 扩展服务 (Tier 2)
- GitHub MCP - 代码仓库管理
- Brave Search MCP - 网络搜索
- Fetch MCP - 网页内容获取
- SQLite MCP - 轻量级数据库
- YouTube MCP - 视频内容分析

### 专业服务 (Tier 3)
- OpenAI MCP - AI模型调用
- Notion MCP - 知识管理
- Wolfram Alpha MCP - 计算引擎
- ArXiv MCP - 学术论文检索

## 使用指南

1. 查看服务状态: `./mcp-manager.sh status`
2. 启动特定层级: `./mcp-manager.sh start --tier=core`
3. 检查API密钥: `./mcp-manager.sh check-keys`
4. 查看帮助: `./mcp-manager.sh help`
EOF
    
    log_success "数据目录创建完成"
}

# 启动指定层级的服务
start_tier() {
    local tier="$1"
    local compose_file="$(get_tier_file "$tier")"

    if [ -z "$compose_file" ]; then
        log_error "未知的服务层级: $tier"
        return 1
    fi

    log_step "启动 $tier 层级服务: $(get_tier_description "$tier")"
    
    # 检查compose文件是否存在
    if [ ! -f "$compose_file" ]; then
        log_error "配置文件不存在: $compose_file"
        return 1
    fi
    
    # 拉取镜像
    log_info "拉取Docker镜像..."
    docker-compose -f "$compose_file" pull
    
    # 启动服务
    log_info "启动服务容器..."
    docker-compose -f "$compose_file" up -d
    
    # 等待服务启动
    log_info "等待服务启动..."
    sleep 15
    
    log_success "$tier 层级服务启动完成"
}

# 停止指定层级的服务
stop_tier() {
    local tier="$1"
    local compose_file="$(get_tier_file "$tier")"

    if [ -z "$compose_file" ]; then
        log_error "未知的服务层级: $tier"
        return 1
    fi

    log_step "停止 $tier 层级服务"
    docker-compose -f "$compose_file" down
    log_success "$tier 层级服务已停止"
}

# 显示服务状态
show_status() {
    log_step "MCP服务生态系统状态"
    echo ""
    
    for tier in core extended professional; do
        local compose_file="$(get_tier_file "$tier")"
        echo -e "${CYAN}📦 $tier 层级 - $(get_tier_description "$tier"):${NC}"
        
        if [ -f "$compose_file" ]; then
            if docker-compose -f "$compose_file" ps --services --filter "status=running" &> /dev/null; then
                docker-compose -f "$compose_file" ps --format "table {{.Name}}\t{{.Status}}\t{{.Ports}}"
            else
                echo "  没有运行中的服务"
            fi
        else
            echo "  配置文件不存在: $compose_file"
        fi
        echo ""
    done
}

# 显示帮助信息
show_help() {
    show_banner
    echo "用法: $0 [命令] [选项]"
    echo ""
    echo "命令:"
    echo "  start [--tier=TIER]     启动服务 (默认: core)"
    echo "  stop [--tier=TIER]      停止服务"
    echo "  restart [--tier=TIER]   重启服务"
    echo "  status                  显示所有服务状态"
    echo "  check-keys              检查API密钥配置"
    echo "  logs [--tier=TIER]      查看服务日志"
    echo "  help                    显示帮助信息"
    echo ""
    echo "服务层级:"
    echo "  core                    核心基础服务 (无需API密钥)"
    echo "  extended                扩展功能服务 (部分需要免费API)"
    echo "  professional            专业工具服务 (需要付费API)"
    echo "  all                     所有服务"
    echo ""
    echo "示例:"
    echo "  $0 start --tier=core              # 启动核心服务"
    echo "  $0 start --tier=extended          # 启动扩展服务"
    echo "  $0 start --tier=all               # 启动所有服务"
    echo "  $0 check-keys                     # 检查API密钥配置"
    echo "  $0 logs --tier=core               # 查看核心服务日志"
}

# 解析命令行参数
parse_args() {
    local command="$1"
    shift
    
    local tier="core"
    
    while [[ $# -gt 0 ]]; do
        case $1 in
            --tier=*)
                tier="${1#*=}"
                shift
                ;;
            *)
                log_error "未知参数: $1"
                exit 1
                ;;
        esac
    done
    
    case "$command" in
        start)
            check_dependencies
            check_env_file
            setup_directories
            if [ "$tier" = "all" ]; then
                start_tier "core"
                start_tier "extended"
                start_tier "professional"
            else
                start_tier "$tier"
            fi
            ;;
        stop)
            if [ "$tier" = "all" ]; then
                stop_tier "professional"
                stop_tier "extended"
                stop_tier "core"
            else
                stop_tier "$tier"
            fi
            ;;
        restart)
            if [ "$tier" = "all" ]; then
                stop_tier "professional"
                stop_tier "extended"
                stop_tier "core"
                sleep 2
                start_tier "core"
                start_tier "extended"
                start_tier "professional"
            else
                stop_tier "$tier"
                sleep 2
                start_tier "$tier"
            fi
            ;;
        status)
            show_status
            ;;
        check-keys)
            check_api_keys
            ;;
        logs)
            local compose_file="$(get_tier_file "$tier")"
            if [ -f "$compose_file" ]; then
                docker-compose -f "$compose_file" logs -f
            else
                log_error "配置文件不存在: $compose_file"
            fi
            ;;
        help|--help|-h)
            show_help
            ;;
        *)
            log_error "未知命令: $command"
            show_help
            exit 1
            ;;
    esac
}

# 主函数
main() {
    if [ $# -eq 0 ]; then
        show_help
        exit 0
    fi
    
    parse_args "$@"
}

# 运行主函数
main "$@"
