#!/bin/bash

# Geoapify MCP Server 部署脚本

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

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

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

# 检查必需的工具
check_requirements() {
    log_info "检查部署要求..."
    
    if ! command -v docker &> /dev/null; then
        log_error "Docker 未安装，请先安装 Docker"
        exit 1
    fi
    
    if ! command -v docker-compose &> /dev/null; then
        log_error "Docker Compose 未安装，请先安装 Docker Compose"
        exit 1
    fi
    
    log_info "✓ 所有要求已满足"
}

# 检查环境变量
check_env() {
    log_info "检查环境变量..."
    
    if [ ! -f .env ]; then
        log_warn ".env 文件不存在，从示例文件创建..."
        cp .env.example .env
        log_warn "请编辑 .env 文件并设置正确的配置值"
        exit 1
    fi
    
    # 检查关键环境变量
    source .env
    
    if [ -z "$GEOAPIFY_API_KEY" ] || [ "$GEOAPIFY_API_KEY" = "your_geoapify_api_key_here" ]; then
        log_error "请在 .env 文件中设置有效的 GEOAPIFY_API_KEY"
        exit 1
    fi
    
    log_info "✓ 环境变量检查通过"
}

# 构建镜像
build_image() {
    log_info "构建 Docker 镜像..."
    docker build -t geoapify-mcp:latest .
    log_info "✓ 镜像构建完成"
}

# 部署服务
deploy_services() {
    log_info "部署服务..."
    
    # 停止现有服务
    docker-compose down
    
    # 启动新服务
    docker-compose up -d
    
    log_info "✓ 服务部署完成"
}

# 健康检查
health_check() {
    log_info "执行健康检查..."
    
    local max_attempts=30
    local attempt=1
    
    while [ $attempt -le $max_attempts ]; do
        if curl -f http://localhost:3000/health &> /dev/null; then
            log_info "✓ 服务健康检查通过"
            return 0
        fi
        
        log_warn "健康检查失败，重试 $attempt/$max_attempts..."
        sleep 2
        ((attempt++))
    done
    
    log_error "健康检查失败，服务可能未正常启动"
    return 1
}

# 显示服务状态
show_status() {
    log_info "服务状态："
    docker-compose ps
    
    log_info "服务日志（最近10行）："
    docker-compose logs --tail=10
}

# 显示访问信息
show_access_info() {
    log_info "部署完成！"
    echo ""
    echo "服务访问信息："
    echo "  健康检查: http://localhost:3000/health"
    echo "  工具列表: http://localhost:3000/tools"
    echo "  API文档: 查看 README.md"
    echo ""
    echo "管理命令："
    echo "  查看日志: docker-compose logs -f"
    echo "  重启服务: docker-compose restart"
    echo "  停止服务: docker-compose down"
    echo "  更新服务: ./scripts/deploy.sh"
}

# 清理函数
cleanup() {
    log_info "清理临时文件..."
    # 这里可以添加清理逻辑
}

# 主函数
main() {
    log_info "开始部署 Geoapify MCP Server..."
    
    # 设置清理陷阱
    trap cleanup EXIT
    
    # 执行部署步骤
    check_requirements
    check_env
    build_image
    deploy_services
    
    # 等待服务启动
    sleep 5
    
    if health_check; then
        show_status
        show_access_info
    else
        log_error "部署失败，请检查日志"
        docker-compose logs
        exit 1
    fi
}

# 处理命令行参数
case "${1:-deploy}" in
    "deploy")
        main
        ;;
    "build")
        check_requirements
        build_image
        ;;
    "start")
        docker-compose up -d
        health_check && show_access_info
        ;;
    "stop")
        docker-compose down
        log_info "服务已停止"
        ;;
    "restart")
        docker-compose restart
        health_check && log_info "服务已重启"
        ;;
    "logs")
        docker-compose logs -f
        ;;
    "status")
        show_status
        ;;
    "clean")
        docker-compose down -v
        docker rmi geoapify-mcp:latest 2>/dev/null || true
        log_info "清理完成"
        ;;
    "help")
        echo "用法: $0 [命令]"
        echo ""
        echo "命令："
        echo "  deploy   - 完整部署（默认）"
        echo "  build    - 仅构建镜像"
        echo "  start    - 启动服务"
        echo "  stop     - 停止服务"
        echo "  restart  - 重启服务"
        echo "  logs     - 查看日志"
        echo "  status   - 查看状态"
        echo "  clean    - 清理所有资源"
        echo "  help     - 显示帮助"
        ;;
    *)
        log_error "未知命令: $1"
        echo "使用 '$0 help' 查看可用命令"
        exit 1
        ;;
esac
