#!/bin/sh
# wynba installer: download the right binary from GitHub releases and install it.
# Usage:
#   curl -fsSL https://raw.githubusercontent.com/flaxodotdev/wynba/main/install.sh | sh
#   curl -fsSL .../install.sh | sh -s -- --prefix /tmp/test --version v0.1.0
set -eu

REPO="flaxodotdev/wynba"
BIN="wynba"
VERSION="latest"
PREFIX=""

usage() {
  echo "Usage: install.sh [--prefix DIR] [--version TAG]" >&2
  echo "  --prefix DIR   install directory for the binary (default: /usr/local if writable, else ~/.local)" >&2
  echo "  --version TAG  release tag to install (default: latest)" >&2
}

while [ $# -gt 0 ]; do
  case "$1" in
    --prefix) PREFIX="${2:-}"; shift 2 ;;
    --prefix=*) PREFIX="${1#--prefix=}"; shift ;;
    --version) VERSION="${2:-}"; shift 2 ;;
    --version=*) VERSION="${1#--version=}"; shift ;;
    -h|--help) usage; exit 0 ;;
    *) echo "Unknown argument: $1" >&2; usage; exit 1 ;;
  esac
done

if [ "$VERSION" = "latest" ]; then
  if command -v curl >/dev/null 2>&1; then
    TAG="$(curl -fsSL "https://api.github.com/repos/${REPO}/releases/latest" | grep -m1 '"tag_name"' | cut -d'"' -f4 || true)"
  elif command -v wget >/dev/null 2>&1; then
    TAG="$(wget -qO- "https://api.github.com/repos/${REPO}/releases/latest" | grep -m1 '"tag_name"' | cut -d'"' -f4 || true)"
  else
    echo "Error: need curl or wget to resolve the latest release." >&2
    exit 1
  fi
  if [ -z "${TAG:-}" ]; then
    echo "Error: could not resolve latest release for ${REPO}." >&2
    exit 1
  fi
  VERSION="$TAG"
fi

OS="$(uname -s | tr '[:upper:]' '[:lower:]')"
ARCH="$(uname -m)"
case "$OS" in
  darwin) OS="apple-darwin" ;;
  linux) OS="unknown-linux-gnu" ;;
  mingw*|msys*|cygwin*|windowsnt) OS="pc-windows-gnu"; ARCH="x86_64" ;;
  *) echo "Unsupported OS: $OS" >&2; exit 1 ;;
esac
case "$ARCH" in
  x86_64|amd64) ARCH="x86_64" ;;
  arm64|aarch64) ARCH="aarch64" ;;
  *) echo "Unsupported architecture: $ARCH" >&2; exit 1 ;;
esac

ASSET="${BIN}-${ARCH}-${OS}"
case "$OS" in
  pc-windows-gnu) ASSET="${ASSET}.exe" ;;
esac
URL="https://github.com/${REPO}/releases/download/${VERSION}/${ASSET}"

TMP="$(mktemp -t wynba-install.XXXXXX 2>/dev/null || mktemp /tmp/wynba-install.XXXXXX)"
trap 'rm -f "$TMP"' EXIT INT TERM

echo "Downloading ${ASSET} (${VERSION})..."
if command -v curl >/dev/null 2>&1; then
  curl -fsSL "$URL" -o "$TMP"
elif command -v wget >/dev/null 2>&1; then
  wget -qO "$TMP" "$URL"
else
  echo "Error: need curl or wget to download." >&2
  exit 1
fi
chmod +x "$TMP"

if [ -z "$PREFIX" ]; then
  if [ -w "/usr/local/bin" ]; then
    PREFIX="/usr/local"
  else
    PREFIX="$HOME/.local"
  fi
fi
BINDIR="${PREFIX}/bin"
mkdir -p "$BINDIR"

DEST="${BINDIR}/${BIN}"
case "$OS" in
  pc-windows-gnu) DEST="${DEST}.exe" ;;
esac

if mv "$TMP" "$DEST" 2>/dev/null; then
  :
else
  echo "Need elevated permissions to write to ${BINDIR}, trying sudo..."
  sudo mv "$TMP" "$DEST"
fi
chmod +x "$DEST"
trap - EXIT INT TERM

echo "Installed ${BIN} ${VERSION} to ${DEST}"
case ":$PATH:" in
  *":${BINDIR}:"*) ;;
  *) echo "Note: ${BINDIR} is not on your PATH. Add: export PATH=\"${BINDIR}:\$PATH\"" >&2 ;;
esac
"$DEST" --version 2>/dev/null || true
