#!/bin/bash

###############################################################################
# 改名并发布脚本
# Rename and Publish Script
#
# 用途: 修改包名并发布到 npm
# Purpose: Rename package and publish to npm
#
# 使用方法 / Usage:
#   ./scripts/rename-and-publish.sh
###############################################################################

set -e

# Colors
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'

echo -e "${BLUE}"
cat << "EOF"
╔═══════════════════════════════════════════════════════════╗
║                                                           ║
║         改名并发布 / Rename and Publish                  ║
║                                                           ║
╚═══════════════════════════════════════════════════════════╝
EOF
echo -e "${NC}"

# 检查是否登录
if ! npm whoami &> /dev/null; then
    echo -e "${RED}❌ 未登录 npm / Not logged in to npm${NC}"
    echo ""
    echo "请先登录 / Please login first:"
    echo "  npm login"
    exit 1
fi

NPM_USER=$(npm whoami)
echo -e "${GREEN}✅ 已登录 / Logged in as: $NPM_USER${NC}"
echo ""

# 获取当前包名
CURRENT_NAME=$(node -p "require('./package.json').name" 2>/dev/null || echo "")
CURRENT_VERSION=$(node -p "require('./package.json').version" 2>/dev/null || echo "1.0.0")

echo "当前包名 / Current name: ${YELLOW}$CURRENT_NAME${NC}"
echo "当前版本 / Current version: ${YELLOW}$CURRENT_VERSION${NC}"
echo ""

# 建议新包名
SUGGESTED_NAME="@$NPM_USER/react-native-code-push"

echo -e "${BLUE}💡 建议的新包名 / Suggested new name:${NC}"
echo ""
echo "  选项 1: ${GREEN}$SUGGESTED_NAME${NC}"
echo "         （推荐，使用你的用户名作为 scope）"
echo ""
echo "  选项 2: ${GREEN}@$NPM_USER/codepush${NC}"
echo "         （简短版本）"
echo ""
echo "  选项 3: 自定义名称"
echo ""

# 询问用户选择
echo -n "请选择 [1-3] 或直接输入自定义名称: "
read -r choice

case $choice in
    1)
        NEW_NAME="$SUGGESTED_NAME"
        ;;
    2)
        NEW_NAME="@$NPM_USER/codepush"
        ;;
    3)
        echo -n "请输入自定义包名: "
        read -r NEW_NAME
        ;;
    *)
        if [ -n "$choice" ] && [[ "$choice" =~ ^[@a-z0-9/_-]+$ ]]; then
            NEW_NAME="$choice"
        else
            echo -e "${YELLOW}无效输入，使用建议名称${NC}"
            NEW_NAME="$SUGGESTED_NAME"
        fi
        ;;
esac

echo ""
echo -e "${BLUE}新包名: ${GREEN}$NEW_NAME${NC}"
echo ""

# 检查名称是否可用
echo -e "${BLUE}🔍 检查名称是否可用 / Checking availability...${NC}"

if npm view "$NEW_NAME" &> /dev/null; then
    echo -e "${RED}❌ 名称已被占用 / Name is already taken${NC}"
    echo ""
    echo "请查看已存在的包："
    echo "  https://www.npmjs.com/package/$NEW_NAME"
    echo ""
    echo "建议："
    echo "  1. 添加后缀，如: ${NEW_NAME}-fork"
    echo "  2. 使用不同的名称"
    echo "  3. 重新运行此脚本"
    exit 1
else
    echo -e "${GREEN}✅ 名称可用！/ Name is available!${NC}"
fi

echo ""

# 确认修改
echo -e "${YELLOW}即将进行以下修改 / About to make the following changes:${NC}"
echo ""
echo "  包名 / Name:        $CURRENT_NAME  →  $NEW_NAME"
echo "  版本 / Version:     $CURRENT_VERSION  →  1.0.0 (建议)"
echo ""
echo -n "确认修改? / Confirm? [y/N] "
read -r confirm

if [[ ! $confirm =~ ^[Yy]$ ]]; then
    echo -e "${YELLOW}已取消 / Cancelled${NC}"
    exit 0
fi

# 备份 package.json
echo ""
echo -e "${BLUE}📦 备份 package.json / Backing up package.json...${NC}"
cp package.json package.json.backup
echo -e "${GREEN}✅ 已备份到 package.json.backup${NC}"

# 修改 package.json
echo ""
echo -e "${BLUE}📝 修改 package.json / Modifying package.json...${NC}"

# 使用 node 来修改 JSON（更安全）
node << EOF
const fs = require('fs');
const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8'));
pkg.name = '$NEW_NAME';
pkg.version = '1.0.0';
fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2) + '\n');
EOF

echo -e "${GREEN}✅ 修改完成 / Modified${NC}"

# 显示更改
echo ""
echo -e "${BLUE}📄 新的 package.json 内容 / New package.json:${NC}"
echo ""
head -10 package.json
echo "..."
echo ""

# 询问是否发布
echo -n "是否立即发布到 npm? / Publish to npm now? [y/N] "
read -r publish_now

if [[ $publish_now =~ ^[Yy]$ ]]; then
    echo ""
    echo -e "${BLUE}🚀 开始发布 / Starting publish...${NC}"
    echo ""
    
    # 调用发布脚本
    if [ -f "./scripts/publish-to-npmjs.sh" ]; then
        ./scripts/publish-to-npmjs.sh
    else
        echo -e "${YELLOW}⚠️  找不到发布脚本，使用手动发布 / Publish script not found, using manual publish${NC}"
        echo ""
        
        # 手动发布流程
        echo "运行测试..."
        yarn test || true
        
        echo ""
        echo "构建项目..."
        yarn prepare
        
        echo ""
        echo "发布到 npm..."
        npm publish --access public
        
        echo ""
        echo -e "${GREEN}✅ 发布成功！/ Published successfully!${NC}"
        echo ""
        echo "查看你的包 / View your package:"
        echo "  https://www.npmjs.com/package/$NEW_NAME"
    fi
else
    echo ""
    echo -e "${GREEN}✅ 包名已修改！/ Package name updated!${NC}"
    echo ""
    echo "下一步 / Next steps:"
    echo "  1. 查看修改: cat package.json"
    echo "  2. 发布: ./scripts/publish-to-npmjs.sh"
    echo "  3. 或恢复: mv package.json.backup package.json"
    echo ""
fi

echo ""
echo -e "${BLUE}💡 提示 / Tips:${NC}"
echo ""
echo "  安装新包 / Install your package:"
echo "    npm install $NEW_NAME"
echo ""
echo "  恢复备份 / Restore backup:"
echo "    mv package.json.backup package.json"
echo ""
echo "  删除备份 / Remove backup:"
echo "    rm package.json.backup"
echo ""

