#!/usr/bin/env bash
set -euo pipefail

# このスクリプトはbin/配下にあるため、プラグインルートは一つ上の階層です。
plugin_root="$(cd "$(dirname "$(readlink -f "$0")")/.." && pwd)"

# ビルド完了の判定パスです。
# ラッパーから第1引数で目的の生成物を渡されるとファイル単位で判定します。
# `dist`はあるが目的のファイルが無い状態でもビルドし直せるようにするためです。
# hooks経由など引数なしの呼び出しでは従来どおり`dist`の有無で判定します。
check_path="${1:-${plugin_root}/dist}"

# ビルド済みなら何もせず即座に終了します。
# プラグイン更新時はプラグインごと入れ替わりビルドしたファイルも消えるため、
# 初回・更新後の両方でビルドされていないことを検知できます。
[ -e "${check_path}" ] && exit 0

# 競合防止のためにロックを取得します。
exec 9>"${plugin_root}/.build.lock"
flock --wait 250 9

# ロックしている間に他のプロセスがビルドしていたら終了します。
[ -e "${check_path}" ] && exit 0

# 必要なコマンドが存在するか簡易検証します。
if ! command -v npm &>/dev/null; then
  echo "Error: npm is not found. Install Node.js to build the plugin." >&2
  exit 1
fi

# ディレクトリを固定します。
cd "${plugin_root}"
# 依存関係をインストールします。
npm ci
# ビルドします。
npm run build

# ビルドが成功しても目的の生成物が無い場合は、
# 後続のnode実行で原因の分かりにくいエラーになる前に明示的に失敗させます。
if [ ! -e "${check_path}" ]; then
  echo "Error: ${check_path} not found after build." >&2
  exit 1
fi
