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

BIN_NAME="${BIN_NAME:-grantos}"
INSTALL_DIR="${GRANTOS_INSTALL_DIR:-/usr/local/bin}"
BASE_URL="${GRANTOS_INSTALL_BASE_URL:-https://grantos.happenings.social}"
VERSION="${GRANTOS_CLI_VERSION:-}"

if ! command -v curl >/dev/null 2>&1; then
  echo "error: curl is required" >&2
  exit 1
fi

OS="$(uname -s | tr '[:upper:]' '[:lower:]')"
ARCH="$(uname -m)"

case "${OS}" in
  linux|darwin) ;;
  *)
    echo "error: unsupported OS '${OS}' (supported: linux, darwin)" >&2
    exit 1
    ;;
esac

case "${ARCH}" in
  x86_64|amd64) ARCH="amd64" ;;
  arm64|aarch64) ARCH="arm64" ;;
  *)
    echo "error: unsupported architecture '${ARCH}' (supported: amd64, arm64)" >&2
    exit 1
    ;;
esac

ASSET="${BIN_NAME}-cli-${OS}-${ARCH}"

if [[ -z "${VERSION}" ]]; then
  set +e
  VERSION="$(curl -fsSL "${BASE_URL}/downloads/latest.txt" 2>/dev/null | tr -d '[:space:]')"
  set -e
fi

TMP_DIR="$(mktemp -d)"
cleanup() {
  rm -rf "${TMP_DIR}"
}
trap cleanup EXIT

TMP_BIN="${TMP_DIR}/${BIN_NAME}"
URL=""
CANDIDATES=()
if [[ -n "${VERSION}" ]]; then
  CANDIDATES+=("${BASE_URL}/downloads/${VERSION}/${ASSET}")
fi
CANDIDATES+=("${BASE_URL}/downloads/${ASSET}")

for candidate in "${CANDIDATES[@]}"; do
  echo "Downloading ${ASSET} from ${candidate} ..."
  if curl -fsSL "${candidate}" -o "${TMP_BIN}"; then
    URL="${candidate}"
    break
  fi
done

if [[ -z "${URL}" ]]; then
  echo "error: download failed for ${ASSET}" >&2
  echo "error: expected ${BASE_URL}/downloads/{latest.txt,<version>/}${ASSET}" >&2
  exit 1
fi

chmod +x "${TMP_BIN}"

TARGET_DIR="${INSTALL_DIR}"
TARGET_BIN="${TARGET_DIR}/${BIN_NAME}"

install_to() {
  local src="$1"
  local dst="$2"
  if command -v install >/dev/null 2>&1; then
    install -m 0755 "${src}" "${dst}"
  else
    cp "${src}" "${dst}"
    chmod 0755 "${dst}"
  fi
}

if mkdir -p "${TARGET_DIR}" >/dev/null 2>&1 && install_to "${TMP_BIN}" "${TARGET_BIN}" 2>/dev/null; then
  :
elif command -v sudo >/dev/null 2>&1; then
  echo "Installing to ${TARGET_BIN} with sudo ..."
  sudo mkdir -p "${TARGET_DIR}"
  if command -v install >/dev/null 2>&1; then
    sudo install -m 0755 "${TMP_BIN}" "${TARGET_BIN}"
  else
    sudo cp "${TMP_BIN}" "${TARGET_BIN}"
    sudo chmod 0755 "${TARGET_BIN}"
  fi
else
  TARGET_DIR="${HOME}/.local/bin"
  TARGET_BIN="${TARGET_DIR}/${BIN_NAME}"
  mkdir -p "${TARGET_DIR}"
  install_to "${TMP_BIN}" "${TARGET_BIN}"
  echo "Installed to ${TARGET_BIN}."
  echo "Add ${TARGET_DIR} to PATH if needed:"
  echo '  export PATH="$HOME/.local/bin:$PATH"'
fi

echo "Installed ${BIN_NAME} to ${TARGET_BIN}"
echo
"${TARGET_BIN}" --help >/dev/null 2>&1 || true
echo "Run: ${BIN_NAME} --help"
