#!/usr/bin/env bash
# 环境感知的「构建 + 运行」一体脚本:构建命令与运行命令都按环境标识切换配置。
#
# 用法:
#   scripts/serve.sh [env] [member] [--build-only|--run-only]
#
#   env     环境标识(local/dev/test/prod 或任意自定义);缺省 local。
#   member  workspace 成员目录(缺省 examples/task-api)。
#
# 约定:成员目录下 config/ 存放 application.toml(公共) + application-<env>.toml(专属)。
# 运行时从该 config/ 目录启动二进制(配置按 cwd 相对查找),并传 --env=<env>。
# 构建后会校验目标环境的专属配置文件存在,缺失即报错——这就是「构建命令按标识切换/校验配置」。
set -euo pipefail

ENV="${1:-local}"
MEMBER="${2:-examples/task-api}"
MODE="${3:-}"

ROOT="$(cd "$(dirname "$0")/.." && pwd)"
cd "$ROOT"
# shellcheck source=/dev/null
source scripts/env.sh

CONFIG_DIR="$ROOT/$MEMBER/config"
COMMON="$CONFIG_DIR/application.toml"
PROFILE="$CONFIG_DIR/application-$ENV.toml"

if [[ "$MODE" != "--run-only" ]]; then
  echo "[serve] building (env=$ENV, member=$MEMBER)"
  cjpm build
  # 构建阶段按标识校验配置文件:公共必存,专属缺失即失败
  [[ -f "$COMMON" ]]  || { echo "[serve] missing common config: $COMMON" >&2; exit 1; }
  [[ -f "$PROFILE" ]] || { echo "[serve] missing profile for env='$ENV': $PROFILE" >&2; exit 1; }
  echo "[serve] config ok: $(basename "$COMMON") + $(basename "$PROFILE")"
fi

if [[ "$MODE" == "--build-only" ]]; then
  exit 0
fi

# 二进制名:成员目录名的 '-' 转 '_'
BIN_NAME="$(basename "$MEMBER" | tr '-' '_')"
BIN="$ROOT/target/release/bin/$BIN_NAME"
[[ -x "$BIN" ]] || { echo "[serve] binary not found: $BIN (run build first)" >&2; exit 1; }

echo "[serve] running (env=$ENV) from $CONFIG_DIR"
cd "$CONFIG_DIR"
exec "$BIN" --env="$ENV"