#!/bin/bash
# cresc-server Cloud Run 部署辅助脚本
# 运行说明: 在 code 目录下执行 ./deploy/deploy-cloudrun.sh
set -e

# ================= GCP 配置项目 =================
PROJECT_ID="cresc-prod"
REGION="asia-southeast1"                   # 新加坡区域，与原阿里云新加坡对等
GAR_REPO="cresc-repo"                     # Google Artifact Registry 仓库名称
IMAGE_NAME="cresc-server"
TAG="latest"

# 服务命名定义
API_SERVICE_NAME="cresc-api"
WORKER_SERVICE_NAME="cresc-worker"

# ================= VPC 网络配置 (使用 GCP Memorystore 时使用) =================
# Memorystore 运行于 VPC 内部，若使用它，请解除以下两行注释，并填入您的网络与子网名称：
# VPC_NETWORK="default"
# VPC_SUBNET="default"
# ===========================================================================

IMAGE_URI="${REGION}-docker.pkg.dev/${PROJECT_ID}/${GAR_REPO}/${IMAGE_NAME}:${TAG}"

echo "======================================================="
echo " 正在构建并部署 cresc-server 到 Google Cloud Run"
echo " 目标 GCP 项目: ${PROJECT_ID}"
echo " 部署区域: ${REGION}"
echo " 容器镜像: ${IMAGE_URI}"
echo "======================================================="

# Step 1: 创建 Artifact Registry 仓库（如果不存在）
echo "检查 Artifact Registry 仓库..."
gcloud artifacts repositories create "$GAR_REPO" \
    --repository-format=docker \
    --location="$REGION" \
    --description="cresc-server docker registry" \
    --quiet || true

# Step 2: 使用 Cloud Build 在云端编译并推送镜像
# 构建上下文是 code 目录本身;.gcloudignore 排除了 .env* 等敏感文件与 .git。
# 版本信息在本地读取后经 substitutions -> docker build args 注入(prepublish 使用)。
echo "通过 Cloud Build 编译镜像中..."
GIT_COMMIT="$(git rev-parse HEAD)"
GIT_COMMIT_SHORT="$(git rev-parse --short=8 HEAD)"
GIT_COMMIT_DATE="$(git log -1 --format=%cd --date=format:%Y.%-m.%-d)"
gcloud builds submit . \
    --config deploy/cloudbuild.yaml \
    --substitutions "_IMAGE_URI=${IMAGE_URI},_GIT_COMMIT=${GIT_COMMIT},_GIT_COMMIT_SHORT=${GIT_COMMIT_SHORT},_GIT_COMMIT_DATE=${GIT_COMMIT_DATE}"

# Step 3: 部署 API 实例
# 端口: 9000
# 权限: 允许外网匿名访问 (--allow-unauthenticated)
# 扩缩容: 最小 0 实例（按需启动节省成本），最大 10 实例
# 注意: .env.prod.yaml 需自行在本地准备(不入库);其中的 Stripe/DB/SMTP/GCS HMAC
# 等密钥建议逐步迁移到 Secret Manager(--set-secrets)而非明文 env。
# GCS 访问必须配置 GCS_ACCESS_KEY / GCS_SECRET_KEY(HMAC 互操作密钥),
# bun S3Client 不支持服务账号 ADC。
echo "正在部署 API 实例..."
gcloud run deploy "$API_SERVICE_NAME" \
    --image "$IMAGE_URI" \
    --region "$REGION" \
    --port 9000 \
    --allow-unauthenticated \
    --min-instances 0 \
    --max-instances 10 \
    --memory 512Mi \
    --cpu 1 \
    --env-vars-file .env.prod.yaml \
    --network=default --subnet=default --vpc-egress=private-ranges-only

# Step 4: 部署 Worker 实例 (OTA Diff 计算服务)
# 端口: 9001 (fcWorker 监听端口)
# 启动命令: 覆盖为运行 lib/fcWorker.js
# 权限: 私有服务 (--no-allow-unauthenticated)，仅允许 API Server 内部调用
# 扩缩容: 最小 0 实例，最大 2 实例（防并发冲突）
# 超时时间: 设置为 30 分钟 (1800s) 以容纳大文件的打包和 diff 计算
echo "正在部署 Worker 实例..."
gcloud run deploy "$WORKER_SERVICE_NAME" \
    --image "$IMAGE_URI" \
    --region "$REGION" \
    --port 9001 \
    --command "bun,run,lib/fcWorker.js" \
    --no-allow-unauthenticated \
    --min-instances 0 \
    --max-instances 2 \
    --memory 2Gi \
    --cpu 2 \
    --timeout 1800 \
    --env-vars-file .env.prod.yaml \
    --network=default --subnet=default --vpc-egress=private-ranges-only

echo "======================================================="
echo " 部署完成！"
echo " 请在 GCP 控制台或 DNS 中配置 API 域名指向 $API_SERVICE_NAME"
echo " 并将 $WORKER_SERVICE_NAME 的 URL 配置到环境变量 CRESC_TASK_HTTP_URL"
echo "======================================================="
