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

REPO="${ABBOTIK_RELEASE_REPO:-abbotik/homebrew-releases}"
INSTALL_DIR="${ABBOTIK_CLI_INSTALL_DIR:-${HOME}/.local/bin}"
VERSION="${ABBOTIK_CLI_VERSION:-}"
TAG_PREFIX="abbot-"

resolve_version() {
  if [[ -n "${VERSION}" ]]; then
    printf '%s\n' "${VERSION}"
    return 0
  fi

  local releases tag
  releases="$(curl -fsSL "https://api.github.com/repos/${REPO}/releases?per_page=100")"
  tag="$(printf '%s\n' "${releases}" | sed -n 's/.*"tag_name": *"\([^"]*\)".*/\1/p' | grep "^${TAG_PREFIX}" | head -n 1)"
  tag="${tag#${TAG_PREFIX}}"

  if [[ -z "${tag}" ]]; then
    echo "Could not determine the latest ${TAG_PREFIX} release from ${REPO}." >&2
    exit 1
  fi

  printf '%s\n' "${tag}"
}

detect_target() {
  local os arch
  os="$(uname -s)"
  arch="$(uname -m)"

  case "${os}" in
    Darwin)
      case "${arch}" in
        arm64) printf 'aarch64-apple-darwin\n' ;;
        x86_64) printf 'x86_64-apple-darwin\n' ;;
        *) echo "Unsupported macOS architecture: ${arch}" >&2; exit 1 ;;
      esac
      ;;
    Linux)
      case "${arch}" in
        x86_64) printf 'x86_64-unknown-linux-gnu\n' ;;
        *) echo "Unsupported Linux architecture: ${arch}" >&2; exit 1 ;;
      esac
      ;;
    *)
      echo "Unsupported operating system: ${os}" >&2
      exit 1
      ;;
  esac
}

verify_checksum() {
  local archive_path="$1"
  local sha_path="$2"
  local expected actual

  expected="$(awk '{print $1}' "${sha_path}")"
  if command -v sha256sum >/dev/null 2>&1; then
    actual="$(sha256sum "${archive_path}" | awk '{print $1}')"
  else
    actual="$(shasum -a 256 "${archive_path}" | awk '{print $1}')"
  fi

  if [[ "${expected}" != "${actual}" ]]; then
    echo "Checksum mismatch for ${archive_path}" >&2
    echo "expected: ${expected}" >&2
    echo "actual:   ${actual}" >&2
    exit 1
  fi
}

VERSION="$(resolve_version)"
TARGET="$(detect_target)"
RELEASE_TAG="${TAG_PREFIX}${VERSION}"
ASSET="abbotik-cli-${VERSION}-${TARGET}.tar.gz"
BASE_URL="https://github.com/${REPO}/releases/download/${RELEASE_TAG}/${ASSET}"
SHA_URL="${BASE_URL}.sha256"

WORKDIR="$(mktemp -d)"
trap 'rm -rf "${WORKDIR}"' EXIT

ARCHIVE_PATH="${WORKDIR}/${ASSET}"
SHA_PATH="${WORKDIR}/${ASSET}.sha256"

curl -fsSL -o "${ARCHIVE_PATH}" "${BASE_URL}"
curl -fsSL -o "${SHA_PATH}" "${SHA_URL}"

verify_checksum "${ARCHIVE_PATH}" "${SHA_PATH}"

mkdir -p "${INSTALL_DIR}"
tar -xzf "${ARCHIVE_PATH}" -C "${INSTALL_DIR}"
chmod +x "${INSTALL_DIR}/abbot"

echo "Installed abbot to ${INSTALL_DIR}/abbot"
