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

fail() { echo "L0 Engine release locator: $*" >&2; exit 1; }
usage() { echo "usage: $0 --bom FILE --output FILE" >&2; }

bom= output=
while [[ $# -gt 0 ]]; do
  case "$1" in
    --bom) bom="${2:-}"; shift 2 ;;
    --output) output="${2:-}"; shift 2 ;;
    *) usage; fail "unknown argument $1" ;;
  esac
done

[[ -f "$bom" && -n "$output" ]] || { usage; exit 2; }
[[ "$(jq -er .schema_version "$bom")" == nexuscrm.serviceification-bom/v10 ]] \
  || fail "BOM is not a v10 Engine release selection"
repository="$(jq -er .l0_engine.oci_repository "$bom")"
version="$(jq -er .l0_engine.version "$bom")"
[[ "$repository" == ghcr.io/pingcap-inc/nexuscrm-l0-engine-release ]] \
  || fail "unexpected Engine release repository"
[[ "$version" =~ ^dev-[0-9]{8}-[0-9]+\.[0-9]+\.[0-9]+-[0-9a-f]{8}$ ]] \
  || fail "Engine release version is not canonical"

digest="$(docker buildx imagetools inspect "$repository:$version" \
  --format '{{json .Manifest}}' | jq -er '.digest')"
[[ "$digest" =~ ^sha256:[0-9a-f]{64}$ ]] || fail "Engine digest is not canonical"
docker pull --quiet --platform linux/amd64 "$repository@$digest" >/dev/null
container="$(docker create --platform linux/amd64 "$repository@$digest" /bin/true)"
release_json="$(mktemp)"
cleanup() {
  docker rm -f "$container" >/dev/null 2>&1 || true
  rm -f "$release_json"
}
trap cleanup EXIT
docker cp "$container:/release.json" "$release_json"
source_commit="$(jq -er --arg version "$version" \
  'select(.schema_version == "nexuscrm.l0-engine-release/v1" and
          .version == $version and .source.repository == "pingcap-inc/NexusCRM") |
   .source.commit | select(test("^[0-9a-f]{40}$"))' "$release_json")"

mkdir -p "$(dirname "$output")"
jq -cnS \
  --arg repository "$repository" --arg version "$version" \
  --arg digest "$digest" --arg source_repository pingcap-inc/NexusCRM \
  --arg source_commit "$source_commit" \
  '{oci_repository:$repository,version:$version,digest:$digest,
    source_repository:$source_repository,source_commit:$source_commit}' > "$output"
