#!/bin/bash
# SDK Tag 發布腳本 (僅限 dev 分支使用)
# 用法: ./scripts/publish_sdk.sh <sdk-name> <version>

# 此腳本執行後的行為說明：
# 1.強制分支檢查：如果當前不是 dev 分支，腳本會立即報錯終止。
# 2.版本一致性檢查：它會讀取 packages/xxx/pubspec.yaml 裡面的 version 欄位。如果你輸入的參數是 1.1.0 但檔案裡寫的是 1.0.9，腳本會拒絕執行。這強制要求你必須在 PR 階段就正確更新版本號。
# 3.同步檢查：它會檢查本地的 dev 是否與遠端的 origin/dev 一致。這防止你在忘記 git pull 的情況下把 Tag 打在舊的 Commit 上。
# 4.防重複檢查：如果該 Tag 名稱（例如 networks_sdk/1.1.0）已經存在，腳本會報錯，防止覆蓋發布。
# 5.不修改檔案：此腳本不會修改任何代碼，它只負責「蓋章（打 Tag）」和「公告（Push Tag）」。

#操作流程：
# 1.開發：在功能分支開發，手動更新 pubspec.yaml 的版本號。
# 2.審核：提交 PR，通過測試與 Code Review，合併進入 dev 分支。
# 3.發布：
#	  •git checkout dev
#	  •git pull
#	  •執行 melos run publish:sdk:only -- <sdk-name> <version>
#       範例：
#       		melos run publish:sdk:only -- networks_sdk 1.1.0
#
# 4.完成：Tag 已推送到遠端，其他專案可以引用該 Tag。

set -e

# 顏色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'

# 檢查參數
if [ -z "$1" ] || [ -z "$2" ]; then
    echo -e "${RED}用法: $0 <sdk-name> <version>${NC}"
    echo "例如: $0 networks_sdk v0.0.1"
    exit 1
fi

SDK_NAME=$1
VERSION=$2
PACKAGE_DIR="packages/$SDK_NAME"
TAG_NAME="${SDK_NAME}/${VERSION}"

echo ""
echo -e "${CYAN}開始 SDK 發布流程...${NC}"

# 1. 檢查版本格式 (必須 vX.X.X)
if [[ ! "$VERSION" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
    echo -e "${RED}錯誤: 版本號必須為 vX.X.X 格式${NC}"
    echo "例如: v1.0.0"
    exit 1
fi

# 去掉 v 用於與 pubspec.yaml 比對
VERSION_NO_V=${VERSION#v}

# 2. 檢查目前分支
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)

if [ "$CURRENT_BRANCH" != "dev" ]; then
    echo -e "${YELLOW}當前分支為 ${CURRENT_BRANCH}${NC}"
    echo -e "${CYAN}正在切換到 dev 分支...${NC}"
    git checkout dev
fi

# 3. 同步遠端 dev
echo -e "${CYAN}同步遠端 dev 分支...${NC}"
git fetch origin --quiet

echo -e "${CYAN}更新本地 dev...${NC}"
git pull origin dev --quiet

# 4. 檢查 SDK 目錄
if [ ! -f "$PACKAGE_DIR/pubspec.yaml" ]; then
    echo -e "${RED}錯誤: 找不到 $PACKAGE_DIR/pubspec.yaml${NC}"
    exit 1
fi

# 5. 讀取 pubspec.yaml 版本
FILE_VERSION=$(grep "^version: " "$PACKAGE_DIR/pubspec.yaml" | sed 's/version: //')

if [ "$FILE_VERSION" != "$VERSION_NO_V" ]; then
    echo -e "${RED}錯誤: 版本號不匹配${NC}"
    echo "輸入版本(tag): $VERSION"
    echo "pubspec.yaml: $FILE_VERSION"
    exit 1
fi

# 6. 檢查 Tag 是否存在
if git rev-parse "$TAG_NAME" >/dev/null 2>&1; then
    echo -e "${RED}錯誤: Tag '$TAG_NAME' 已存在${NC}"
    exit 1
fi

echo ""
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}SDK Tag 發布${NC}"
echo -e "${GREEN}========================================${NC}"
echo "SDK Name: $SDK_NAME"
echo "Version:  $VERSION"
echo "Tag:      $TAG_NAME"
echo "Branch:   dev"
echo "Commit:   $(git rev-parse --short HEAD)"
echo -e "${GREEN}========================================${NC}"

echo ""
echo -e "${YELLOW}警告：這將會在當前 commit 建立並推送 Git Tag。${NC}"
echo -e "${YELLOW}如果確認發布，請輸入 'y' 並按 Enter。${NC}"
echo -e "${YELLOW}輸入其他內容將取消發布。${NC}"

# 重要：從 /dev/tty 讀取，避免 melos 吃掉輸入
echo -n "是否確定發布 $TAG_NAME ? [y/N]: "
read confirm < /dev/tty

if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then
    echo ""
    echo -e "${CYAN}發布已取消${NC}"
    exit 0
fi

# 7. 建立 Tag
echo ""
echo -e "${GREEN}[1/2] 創建 Git Tag...${NC}"
git tag "$TAG_NAME"

# 8. 推送 Tag
echo ""
echo -e "${GREEN}[2/2] 推送 Tag 到遠端...${NC}"
git push --tags --quiet

echo ""
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}Tag 發布成功！${NC}"
echo -e "${GREEN}========================================${NC}"

echo "現在可以在其他專案使用："
echo "ref: $TAG_NAME"