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

PROFILE_DIR=${HERMES_HOME:-/home/teleo/.hermes/profiles/leoclean}
KB_TOOL="$PROFILE_DIR/bin/kb_tool.py"
CLOUDSQL_TOOL="$PROFILE_DIR/bin/cloudsql_memory_tool.py"
MODE=${TELEO_KB_MODE:-auto}
COMMAND=${1:-}

cloudsql_supported() {
  case "$COMMAND" in
    status|search|context|show|evidence|edges|propose-core-change|propose-edge|list-proposals|search-proposals|show-proposal|decision-matrix-status) return 0 ;;
    *) return 1 ;;
  esac
}

cloudsql_args() {
  if [ "${TELEO_MEMORY_INCLUDE_EXCERPTS:-}" = "1" ]; then
    case "$COMMAND" in
      search|context|show|evidence|edges) printf '%s\n' "--include-excerpts" ;;
    esac
  fi
}

run_cloudsql() {
  if ! cloudsql_supported; then
    echo "teleo-kb: command '$COMMAND' is not supported by the Cloud SQL backend" >&2
    exit 64
  fi
  if [ ! -x "$CLOUDSQL_TOOL" ]; then
    echo "teleo-kb: Cloud SQL tool is missing or not executable: $CLOUDSQL_TOOL" >&2
    exit 69
  fi
  for dependency in python3 psql gcloud; do
    if ! command -v "$dependency" >/dev/null 2>&1; then
      echo "teleo-kb: required Cloud SQL dependency is unavailable: $dependency" >&2
      exit 69
    fi
  done
  extra_args=()
  while IFS= read -r arg; do
    [ -n "$arg" ] && extra_args+=("$arg")
  done < <(cloudsql_args)
  exec python3 "$CLOUDSQL_TOOL" "$@" "${extra_args[@]}"
}

case "$MODE" in
  cloudsql)
    run_cloudsql "$@"
    ;;
  local)
    exec python3 "$KB_TOOL" --local "$@"
    ;;
  remote)
    exec python3 "$KB_TOOL" "$@"
    ;;
  auto)
    # Canonical commands must fail closed on Cloud SQL errors. Falling through
    # to a different local database would make source-of-truth behavior depend
    # on health-check latency or host package state.
    if cloudsql_supported; then
      run_cloudsql "$@"
    fi
    if command -v docker >/dev/null 2>&1; then
      exec python3 "$KB_TOOL" --local "$@"
    fi
    exec python3 "$KB_TOOL" "$@"
    ;;
  *)
    echo "Unsupported TELEO_KB_MODE=$MODE; expected auto, cloudsql, local, or remote" >&2
    exit 64
    ;;
esac
