#!/bin/bash
# =============================================================================
# officer-setup — is this machine ready
# =============================================================================
#
# Definitions only.
#
# ── Inherited, not re-asked ──
#
# machine-setup saves the account, the Officer path and the machine role beside
# itself. This reads the same file, so a normal run — machine-setup, then this —
# asks nothing at all. It only prompts on a machine where machine-setup never
# ran, which is a supported case rather than an error: somebody may have
# provisioned the box their own way.

[[ -n "${OFFICER_SETUP_PREFLIGHT_LOADED:-}" ]] && return 0
OFFICER_SETUP_PREFLIGHT_LOADED=1

# Where machine-setup keeps what it was told. Beside this script, one directory
# across.
MACHINE_ANSWERS="${MACHINE_ANSWERS:-${SCRIPT_DIR}/machine-setup/.setup-answers}"

# Read as assignments rather than sourced: the file is read by a root run and
# sourcing it would make it executable content.
load_machine_answers() {
  [[ -r "$MACHINE_ANSWERS" ]] || return 1
  local key value
  while IFS='=' read -r key value; do
    [[ "$key" =~ ^[A-Z_]+$ ]] || continue
    [[ -n "$value" ]] || continue
    case "$key" in
      MACHINE_ROLE) if [[ -z "$MACHINE_ROLE" ]]; then MACHINE_ROLE="$value"; fi ;;
      SETUP_USERNAME) if [[ -z "$USERNAME" ]]; then USERNAME="$value"; fi ;;
      OFFICER_ROOT) if [[ -z "$OFFICER_ROOT" ]]; then OFFICER_ROOT="$value"; fi ;;
    esac
  done <"$MACHINE_ANSWERS"
  return 0
}

# What Officer needs to already be here, and what installs it.
#
# Checked together and reported together: finding out about a missing bun three
# sections in, after the repository has been cloned and a database started, is a
# worse way to learn it than being told at the start.
REQUIRED_TOOLS=(git node bun pm2)
OPTIONAL_TOOLS=(docker)

missing_tools() {
  local t
  for t in "${REQUIRED_TOOLS[@]}"; do command -v "$t" &>/dev/null || echo "$t"; done
}

missing_optional_tools() {
  local t
  for t in "${OPTIONAL_TOOLS[@]}"; do command -v "$t" &>/dev/null || echo "$t"; done
}

tool_why() {
  case "$1" in
    git) echo "to clone and update the platform" ;;
    node) echo "pm2 runs on it, and the terminal sidecar builds node-pty against it" ;;
    bun) echo "the platform itself and nineteen of the twenty processes" ;;
    pm2) echo "supervises every process; the ecosystem files are written for it" ;;
    docker) echo "Postgres, and anything the app store provisions" ;;
    *) echo "" ;;
  esac
}

# The account has to exist before anything is written to its home.
owner_exists() { id "$USERNAME" &>/dev/null; }

resolve_user_home() {
  USER_HOME="$(getent passwd "$USERNAME" 2>/dev/null | cut -d: -f6)"
  [[ -n "$USER_HOME" ]] || USER_HOME="/home/${USERNAME}"
}
