#!/bin/bash
#
# くまもり 成果レポート GCS連携 プロビジョニングスクリプト
#
# GCP プロジェクト ot-opcon に以下を冪等に作成する:
#   - レポート共有用 GCS バケット（東京リージョン / uniform access / 公開防止 / バージョニング）
#   - writer サービスアカウント（opconバッチのアップロード用）
#   - reader サービスアカウント（OpenApps/Link-Uのプル取得用）
#   - バケット単位の最小権限 IAM バインディング
#   - 古いオブジェクトバージョンの自動削除ライフサイクル
#
# 鍵JSONの発行は機密のため別途手動で実施すること（末尾コメント参照）。
#
# 前提: gcloud SDK / ot-opcon への権限（storage.admin, iam.serviceAccountAdmin 相当）
# 実行: bash src/release/kumamori/provision_gcs.sh
#
set -euo pipefail

PROJECT="ot-opcon"
BUCKET="gs://ot-opcon-kumamori-reports"
LOCATION="asia-northeast1"
WRITER_SA="kumamori-report-writer"
READER_SA="kumamori-report-reader"
WRITER_EMAIL="${WRITER_SA}@${PROJECT}.iam.gserviceaccount.com"
READER_EMAIL="${READER_SA}@${PROJECT}.iam.gserviceaccount.com"

echo "[1/6] バケット作成 (${BUCKET})"
if ! gcloud storage buckets describe "${BUCKET}" --project="${PROJECT}" >/dev/null 2>&1; then
  gcloud storage buckets create "${BUCKET}" \
    --project="${PROJECT}" \
    --location="${LOCATION}" \
    --uniform-bucket-level-access \
    --public-access-prevention
else
  echo "  既存のためスキップ"
fi

echo "[2/6] オブジェクトバージョニング有効化"
gcloud storage buckets update "${BUCKET}" --versioning

echo "[3/6] サービスアカウント作成 (writer/reader)"
gcloud iam service-accounts describe "${WRITER_EMAIL}" --project="${PROJECT}" >/dev/null 2>&1 \
  || gcloud iam service-accounts create "${WRITER_SA}" --project="${PROJECT}" \
       --display-name="Kumamori Report Writer (opcon batch upload)"
gcloud iam service-accounts describe "${READER_EMAIL}" --project="${PROJECT}" >/dev/null 2>&1 \
  || gcloud iam service-accounts create "${READER_SA}" --project="${PROJECT}" \
       --display-name="Kumamori Report Reader (OpenApps/Link-U pull)"

echo "[4/6] IAM バインディング（最小権限・バケット単位）"
# writer: オブジェクトの作成/上書き
gcloud storage buckets add-iam-policy-binding "${BUCKET}" \
  --member="serviceAccount:${WRITER_EMAIL}" \
  --role="roles/storage.objectAdmin"
# reader: 読み取り専用（削除不可）
gcloud storage buckets add-iam-policy-binding "${BUCKET}" \
  --member="serviceAccount:${READER_EMAIL}" \
  --role="roles/storage.objectViewer"

echo "[5/6] ライフサイクル（非カレント版・Daily現行オブジェクトを180日で削除）"
TMP_LC="$(mktemp)"
# set -e 有効時に途中でエラー終了しても一時ファイルを確実に掃除する
trap 'rm -f "${TMP_LC}"' EXIT
cat > "${TMP_LC}" <<'JSON'
{
  "rule": [
    { "action": {"type": "Delete"}, "condition": {"daysSinceNoncurrentTime": 180} },
    { "action": {"type": "Delete"}, "condition": {"age": 180, "matchesPrefix": ["reports/kumamori_daily_"]} }
  ]
}
JSON
# 2つ目のルールは reports/kumamori_daily_YYYYMMDD.csv （個人情報を含む現行オブジェクト）を
# 作成から180日で削除する。reports/kumamori_daily_latest.csv も同じprefixに一致するが、
# 日次バッチで毎回上書き（=作成日時が更新）されるため180日に達することはなく実質対象外。
gcloud storage buckets update "${BUCKET}" --lifecycle-file="${TMP_LC}"

echo "[6/6] 完了。現在のバケットIAM:"
gcloud storage buckets get-iam-policy "${BUCKET}" --format="value(bindings.role,bindings.members)"

cat <<EOF

==========================================================================
認証情報の発行（機密・手動・リポジトリにコミットしないこと）
--------------------------------------------------------------------------
# writer鍵JSON（opconバッチのアップロード用 -> 本番VMの ETC_DIR に配置）
gcloud iam service-accounts keys create ./kumamori-report-writer.json \\
  --iam-account="${WRITER_EMAIL}" --project="${PROJECT}"

# reader HMACキー（OpenApps/Link-Uのプル取得用・S3互換 / 相互運用性API）
#   ※サービスアカウントHMACを使用（ユーザーアカウントHMACは使わない）
#   ※accessId と secret を控え、安全な経路でOpenAppsへ受け渡す（secretは作成時のみ表示）
gcloud storage hmac create "${READER_EMAIL}" --project="${PROJECT}"

# （参考）reader鍵JSON方式を使う場合の代替
# gcloud iam service-accounts keys create ./kumamori-report-reader.json \\
#   --iam-account="${READER_EMAIL}" --project="${PROJECT}"

# HMACキーのローテーション/失効
# gcloud storage hmac list --project="${PROJECT}"
# gcloud storage hmac update <accessId> --deactivate --project="${PROJECT}"
# gcloud storage hmac delete <accessId> --project="${PROJECT}"
==========================================================================
EOF
