#!/usr/bin/env bash

set -euo pipefail
shopt -s inherit_errexit

SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd)
REPOSITORY_ROOT="${REPOSITORY_ROOT:-$(cd "${SCRIPT_DIR}" && git rev-parse --show-toplevel)}"

goos() {
  case "$(uname -sr)" in
  Darwin*) echo 'darwin' ;;
  Linux*) echo 'linux' ;;
  *)
    echo 'Unknown OS' >&2
    exit 1
    ;;
  esac
}

goarch() {
  case $(uname -m) in
  x86_64) echo 'amd64' ;;
  arm) echo 'arm64' ;; # this is slightly simplified, but we only care about arm64
  arm64) echo 'arm64' ;;
  *)
    echo 'Unknown arch' >&2
    exit 1
    ;;
  esac
}

need_pseudo_version_tool() {
  if [[ ! -f "${REPOSITORY_ROOT}/tools/pseudo-version" ]]; then
    return 1
  fi

  expected=$(cat "${REPOSITORY_ROOT}/tools/pseudo_version_$(goos)_$(goarch).sha256")
  local need_pseudo_version_tool=0
  if type sha256sum > /dev/null 2>&1; then
    need_pseudo_version_tool=$(sha256sum -c --status <(echo "${expected}  ${REPOSITORY_ROOT}/tools/pseudo-version") && echo 0 || echo 1)
  elif type shasum > /dev/null 2>&1; then
    need_pseudo_version_tool=$(shasum -a 256 -c --status <(echo "${expected}  ${REPOSITORY_ROOT}/tools/pseudo-version") && echo 0 || echo 1)
  else
    echo "sha256sum or shasum is required to verify the pseudo-version tool" >&2
    exit 1
  fi

  return "${need_pseudo_version_tool}"
}

# shellcheck disable=SC2310
ensure_pseudo_version_tool() {
  local should_download=0
  should_download=$(need_pseudo_version_tool && echo 0 || echo 1)

  if [[ ${should_download} -ne 0 ]]; then
    get_pseudo_version_tool
  fi
}

get_pseudo_version_tool() {
  out="${REPOSITORY_ROOT}/tools/pseudo-version"
  hash=$(cat "${REPOSITORY_ROOT}/tools/pseudo_version_$(goos)_$(goarch).sha256")
  url=https://cdn.confidential.cloud/constellation/cas/sha256/${hash}
  if command -v curl &> /dev/null; then
    curl -fsSL "${url}" -o "${out}"
  elif command -v wget &> /dev/null; then
    wget -q -O "${out}" "${url}"
  else
    echo "curl or wget is required to download the pseudo-version tool" >&2
    exit 1
  fi
  chmod +x "${out}"
}

pseudo_version() {
  ensure_pseudo_version_tool
  "${REPOSITORY_ROOT}/tools/pseudo-version" -skip-v
}

timestamp() {
  ensure_pseudo_version_tool
  "${REPOSITORY_ROOT}/tools/pseudo-version" -print-timestamp -timestamp-format '2006-01-02T15:04:05Z07:00'
}

echo "REPO_URL https://github.com/edgelesssys/constellation.git"
echo "STABLE_STAMP_COMMIT $(git rev-parse HEAD)"
echo "STABLE_STAMP_STATE $(git update-index -q --really-refresh && git diff-index --quiet HEAD -- && echo "clean" || echo "dirty")"
echo "STABLE_STAMP_VERSION $(pseudo_version)"
echo "STABLE_STAMP_TIME $(timestamp)"