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

PACKAGE_NAME="ctxsift"
DOCS_URL="https://ctxsift.dev/docs/getting-started/installation/"
REPO_URL="https://github.com/aakashh242/ctxsift"
PLATFORM_LABEL="Linux"
PREREQ_NOTE="If local CPU wheels are unavailable, install a compiler toolchain first, for example: sudo apt install build-essential"

printf '
CtxSift installer for %s
' "$PLATFORM_LABEL"
printf 'Docs: %s
' "$DOCS_URL"
printf 'Repository: %s

' "$REPO_URL"

if ! command -v uv >/dev/null 2>&1; then
  printf 'uv is required but was not found on PATH.
'
  printf 'Install uv first: https://docs.astral.sh/uv/getting-started/installation/
'
  exit 1
fi

printf '%s

' "$PREREQ_NOTE"

read -r -p 'Version to install [latest]: ' requested_version
requested_version="$(printf '%s' "$requested_version" | tr -d '[:space:]')"

printf 'Extras: base, gpu, quant, all
'
read -r -p 'Extras [base]: ' requested_extras
requested_extras="$(printf '%s' "$requested_extras" | tr '[:upper:]' '[:lower:]' | tr -d '[:space:]')"

case "$requested_extras" in
  ''|base)
    requested_extras='base'
    ;;
  gpu)
    requested_extras='gpu'
    ;;
  quant)
    requested_extras='quant'
    ;;
  all)
    requested_extras='all'
    ;;
  *)
    printf 'Unknown extras choice: %s
' "$requested_extras"
    printf 'Choose one of: base, gpu, quant, all
'
    exit 1
    ;;
esac

build_spec() {
  local extras="$1"
  local version="$2"
  local spec="$PACKAGE_NAME"
  case "$extras" in
    gpu)
      spec="$PACKAGE_NAME[gpu]"
      ;;
    quant)
      spec="$PACKAGE_NAME[gpu,quant]"
      ;;
    all)
      spec="$PACKAGE_NAME[all]"
      ;;
  esac
  if [[ -n "$version" ]]; then
    spec="$spec==$version"
  fi
  printf '%s' "$spec"
}

install_target="$(build_spec "$requested_extras" "$requested_version")"

printf '
Running: uv tool install --reinstall %s

' "$install_target"
uv tool install --reinstall "$install_target"

printf '
CtxSift installed. Next steps:
'
printf '  ctxsift doctor
'
printf '  %s
' "$DOCS_URL"
