#!/bin/bash

# NPM一键发布脚本

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"
}

log_success() {
    echo -e "${CYAN}[SUCCESS]${NC} $1"
}

# 检查NPM registry
check_registry() {
    log_step "检查NPM registry..."
    
    local current_registry=$(npm config get registry)
    echo "当前registry: $current_registry"
    
    if [[ "$current_registry" == "https://registry.npmjs.org/" ]]; then
        log_info "✓ 使用官方NPM registry"
        return 0
    else
        log_warn "当前使用镜像registry，正在切换..."
        npm config set registry https://registry.npmjs.org/
        log_info "✓ 已切换到官方NPM registry"
        return 0
    fi
}

# 检查登录状态
check_login() {
    log_step "检查NPM登录状态..."
    
    if npm whoami &> /dev/null; then
        local user=$(npm whoami)
        log_info "✓ 已登录NPM，用户: $user"
        return 0
    else
        log_warn "未登录NPM"
        return 1
    fi
}

# NPM登录
npm_login() {
    log_step "NPM登录..."
    
    echo ""
    log_info "如果您还没有NPM账号，请先访问: https://www.npmjs.com/signup"
    echo ""
    
    if npm login; then
        local user=$(npm whoami)
        log_info "✓ 登录成功，用户: $user"
        return 0
    else
        log_error "登录失败"
        return 1
    fi
}

# 运行测试
run_tests() {
    log_step "运行测试..."
    
    if node scripts/test-mcp.js unit; then
        log_info "✓ 所有测试通过"
        return 0
    else
        log_error "测试失败"
        return 1
    fi
}

# 检查包信息
check_package() {
    log_step "检查包信息..."
    
    local package_name=$(node -p "require('./package.json').name")
    local version=$(node -p "require('./package.json').version")
    
    echo "包名: $package_name"
    echo "版本: $version"
    
    # 检查包是否已存在
    if npm view "$package_name@$version" &> /dev/null; then
        log_error "版本 $package_name@$version 已存在"
        echo ""
        log_info "请更新版本号："
        echo "  npm version patch  # 1.0.0 -> 1.0.1"
        echo "  npm version minor  # 1.0.0 -> 1.1.0"
        echo "  npm version major  # 1.0.0 -> 2.0.0"
        return 1
    else
        log_info "✓ 版本号可用"
        return 0
    fi
}

# 预览包内容
preview_package() {
    log_step "预览包内容..."
    
    echo ""
    log_info "将要发布的文件："
    npm pack --dry-run
    echo ""
    
    read -p "确认发布这些文件？(y/N): " -n 1 -r
    echo
    if [[ $REPLY =~ ^[Yy]$ ]]; then
        return 0
    else
        log_warn "用户取消发布"
        return 1
    fi
}

# 发布包
publish_package() {
    log_step "发布NPM包..."
    
    local package_name=$(node -p "require('./package.json').name")
    local version=$(node -p "require('./package.json').version")
    
    log_info "正在发布 $package_name@$version ..."
    
    if npm publish; then
        log_success "🎉 发布成功！"
        echo ""
        log_info "包信息:"
        echo "  名称: $package_name"
        echo "  版本: $version"
        echo "  链接: https://www.npmjs.com/package/$package_name"
        echo ""
        
        log_info "安装命令:"
        echo "  npm install -g $package_name"
        echo "  npx $package_name"
        echo ""
        
        log_info "MCP配置:"
        cat << EOF
{
  "mcpServers": {
    "geoapify-maps": {
      "command": "npx",
      "args": ["-y", "$package_name"],
      "env": {
        "GEOAPIFY_API_KEY": "3234bd7e35264a8aa29fc15e89f8f76f"
      }
    }
  }
}
EOF
        return 0
    else
        log_error "发布失败"
        return 1
    fi
}

# 验证发布
verify_publish() {
    log_step "验证发布..."
    
    local package_name=$(node -p "require('./package.json').name")
    
    sleep 5  # 等待NPM更新
    
    if npm view "$package_name" &> /dev/null; then
        log_info "✓ 包已成功发布到NPM registry"
        
        # 显示包信息
        echo ""
        log_info "包详情:"
        npm view "$package_name" --json | head -20
        
        return 0
    else
        log_error "验证失败，包可能未正确发布"
        return 1
    fi
}

# 恢复中国镜像
restore_mirror() {
    log_step "恢复中国镜像..."
    
    read -p "是否恢复中国镜像以提高下载速度？(Y/n): " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Nn]$ ]]; then
        npm config set registry https://registry.npmmirror.com
        log_info "✓ 已恢复中国镜像"
    else
        log_info "保持官方registry"
    fi
}

# 测试发布的包
test_published_package() {
    log_step "测试发布的包..."
    
    local package_name=$(node -p "require('./package.json').name")
    
    echo ""
    log_info "测试命令（您可以手动运行）："
    echo "  npx $package_name"
    echo "  echo '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\"}' | npx $package_name"
    echo ""
}

# 主发布流程
main() {
    log_info "🚀 开始NPM发布流程"
    echo ""
    
    # 1. 检查registry
    check_registry
    
    # 2. 检查登录
    if ! check_login; then
        npm_login
    fi
    
    # 3. 运行测试
    run_tests
    
    # 4. 检查包信息
    check_package
    
    # 5. 预览包内容
    preview_package
    
    # 6. 发布包
    publish_package
    
    # 7. 验证发布
    verify_publish
    
    # 8. 测试说明
    test_published_package
    
    # 9. 恢复镜像
    restore_mirror
    
    echo ""
    log_success "🎉 NPM发布流程完成！"
    echo ""
    log_info "您的包现在可以通过以下方式使用："
    echo "  npx @travel-mcp/geoapify-server"
    echo ""
    log_info "MCP客户端可以使用以下配置："
    echo '  "command": "npx"'
    echo '  "args": ["-y", "@travel-mcp/geoapify-server"]'
}

# 处理命令行参数
case "${1:-publish}" in
    "publish")
        main
        ;;
    "check")
        check_registry
        check_login
        check_package
        ;;
    "test")
        run_tests
        ;;
    "login")
        check_registry
        npm_login
        ;;
    "help")
        echo "用法: $0 [命令]"
        echo ""
        echo "命令："
        echo "  publish - 完整发布流程（默认）"
        echo "  check   - 检查发布条件"
        echo "  test    - 运行测试"
        echo "  login   - NPM登录"
        echo "  help    - 显示帮助"
        ;;
    *)
        log_error "未知命令: $1"
        echo "使用 '$0 help' 查看可用命令"
        exit 1
        ;;
esac
