#!/bin/sh
set -eu

BASE_URL="${GLOWFISH_INSTALL_BASE_URL:-https://glowfi.sh/glowfish}"
PREFIX="${GLOWFISH_INSTALL_PREFIX:-${HOME}/.local}"
CHANNEL="${GLOWFISH_INSTALL_CHANNEL:-latest}"
VERSION="${GLOWFISH_INSTALL_VERSION:-}"

log() {
  printf '%s\n' "$*"
}

die() {
  printf 'glowfish install: %s\n' "$*" >&2
  exit 1
}

need_cmd() {
  command -v "$1" >/dev/null 2>&1 || die "missing required command: $1"
}

detect_platform() {
  os_name=$(uname -s)
  arch_name=$(uname -m)
  case "${os_name}:${arch_name}" in
    Darwin:arm64) printf '%s\n' "macos-arm64" ;;
    Darwin:x86_64) printf '%s\n' "macos-x86_64" ;;
    Linux:x86_64) printf '%s\n' "linux-x86_64" ;;
    Linux:aarch64|Linux:arm64) printf '%s\n' "linux-arm64" ;;
    *) die "unsupported platform: ${os_name} ${arch_name}" ;;
  esac
}

sha256_file() {
  if command -v shasum >/dev/null 2>&1; then
    shasum -a 256 "$1" | awk '{print $1}'
  elif command -v sha256sum >/dev/null 2>&1; then
    sha256sum "$1" | awk '{print $1}'
  else
    die "missing shasum or sha256sum"
  fi
}

download() {
  url="$1"
  output="$2"
  if command -v curl >/dev/null 2>&1; then
    curl -fsSL "$url" -o "$output"
  elif command -v fetch >/dev/null 2>&1; then
    fetch -q -o "$output" "$url"
  else
    die "missing curl or fetch"
  fi
}

need_cmd awk
need_cmd tar
PLATFORM="${GLOWFISH_INSTALL_PLATFORM:-$(detect_platform)}"
ARTIFACT="glowfish-host-${PLATFORM}.tar.gz"
if [ -n "${VERSION}" ]; then
  RELEASE_PATH="releases/${VERSION}"
  ARTIFACT="glowfish-host-${PLATFORM}-${VERSION}.tar.gz"
else
  RELEASE_PATH="releases/${CHANNEL}"
fi

TMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/glowfish-install.XXXXXX")
cleanup() {
  rm -rf "${TMP_DIR}"
}
trap cleanup EXIT INT TERM

ARTIFACT_PATH="${TMP_DIR}/${ARTIFACT}"
SHA_PATH="${TMP_DIR}/${ARTIFACT}.sha256"
PACKAGE_DIR="${TMP_DIR}/package"

log "downloading ${BASE_URL}/${RELEASE_PATH}/${ARTIFACT}"
download "${BASE_URL}/${RELEASE_PATH}/${ARTIFACT}" "${ARTIFACT_PATH}"
download "${BASE_URL}/${RELEASE_PATH}/${ARTIFACT}.sha256" "${SHA_PATH}"

EXPECTED_SHA=$(awk '{print $1; exit}' "${SHA_PATH}")
[ -n "${EXPECTED_SHA}" ] || die "empty checksum metadata"
ACTUAL_SHA=$(sha256_file "${ARTIFACT_PATH}")
if [ "${EXPECTED_SHA}" != "${ACTUAL_SHA}" ]; then
  die "checksum mismatch for ${ARTIFACT}"
fi

mkdir -p "${PACKAGE_DIR}"
tar -xzf "${ARTIFACT_PATH}" -C "${PACKAGE_DIR}"
[ -x "${PACKAGE_DIR}/install.sh" ] || die "artifact is missing install.sh"

sh "${PACKAGE_DIR}/install.sh" --prefix "${PREFIX}" "${PACKAGE_DIR}"
if [ -x "${PREFIX}/bin/glowfish" ]; then
  "${PREFIX}/bin/glowfish" doctor || true
fi
case ":${PATH}:" in
  *":${PREFIX}/bin:"*) log "glowfish installed. Run: glowfish" ;;
  *) log "glowfish installed. Run: ${PREFIX}/bin/glowfish" ;;
esac
