#!/bin/bash

# NPM发布脚本

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
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"
}

# 检查npm登录状态
check_npm_auth() {
    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 "请输入您的NPM凭据："
    npm login
    
    if npm whoami &> /dev/null; then
        log_info "✓ NPM登录成功"
    else
        log_error "NPM登录失败"
        exit 1
    fi
}

# 检查包名是否可用
check_package_name() {
    local package_name=$(node -p "require('./package.json').name")
    log_step "检查包名可用性: $package_name"
    
    if npm view "$package_name" &> /dev/null; then
        log_warn "包名 '$package_name' 已存在"
        
        # 建议替代名称
        echo ""
        log_info "建议的替代名称："
        echo "  - @your-username/geoapify-mcp-server"
        echo "  - geoapify-mcp-server-$(date +%Y%m%d)"
        echo "  - travel-geoapify-mcp"
        echo ""
        
        read -p "是否继续发布现有包的新版本？(y/N): " -n 1 -r
        echo
        if [[ ! $REPLY =~ ^[Yy]$ ]]; then
            log_error "发布取消"
            exit 1
        fi
    else
        log_info "✓ 包名可用"
    fi
}

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

# 构建包
build_package() {
    log_step "准备发布包..."
    
    # 确保必要的文件存在
    if [ ! -f "package.json" ]; then
        log_error "package.json 不存在"
        exit 1
    fi
    
    if [ ! -f "README.md" ]; then
        log_error "README.md 不存在"
        exit 1
    fi
    
    # 检查bin文件
    if [ ! -f "bin/mcp-server.js" ]; then
        log_error "bin/mcp-server.js 不存在"
        exit 1
    fi
    
    log_info "✓ 包文件检查完成"
}

# 发布包
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_info "✓ 发布成功！"
        echo ""
        log_info "🎉 包已发布到NPM registry"
        log_info "安装命令: npm install -g $package_name"
        log_info "使用命令: npx $package_name"
        echo ""
        
        # 更新MCP配置示例
        log_info "更新后的MCP配置:"
        cat << EOF
{
  "mcpServers": {
    "geoapify-maps": {
      "command": "npx",
      "args": ["-y", "$package_name"],
      "env": {
        "GEOAPIFY_API_KEY": "3234bd7e35264a8aa29fc15e89f8f76f"
      }
    }
  }
}
EOF
    else
        log_error "发布失败"
        exit 1
    fi
}

# 主函数
main() {
    log_info "🚀 开始NPM包发布流程"
    echo ""
    
    # 检查认证
    if ! check_npm_auth; then
        npm_login
    fi
    
    # 检查包名
    check_package_name
    
    # 运行测试
    run_tests
    
    # 构建包
    build_package
    
    # 发布
    publish_package
    
    log_info "🎉 发布流程完成！"
}

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