#!/bin/sh
# Resolve symlinks so npm global shims (prefix/bin/ks -> lib/node_modules/.../bin/ks) work.
resolve_script_dir() {
  script=$1
  while [ -L "$script" ]; do
    dir=$(cd "$(dirname "$script")" && pwd) || return 1
    target=$(readlink "$script") || return 1
    case $target in
      /*) script=$target ;;
      *) script=$dir/$target ;;
    esac
  done
  cd "$(dirname "$script")" && pwd
}

find_pkg_dir() {
  script_dir=$1
  pkg_dir=$(cd "$script_dir/.." && pwd) || return 1
  if [ -f "$pkg_dir/scripts/bootstrap.mjs" ]; then
    printf '%s\n' "$pkg_dir"
    return 0
  fi
  if command -v npm >/dev/null 2>&1; then
    root=$(npm root -g 2>/dev/null) || true
    if [ -n "$root" ]; then
      for candidate in "$root"/@kespace/ks-cli* "$root"/@ke/ks-cli*; do
        if [ -f "$candidate/scripts/bootstrap.mjs" ]; then
          printf '%s\n' "$candidate"
          return 0
        fi
      done
    fi
  fi
  printf '%s\n' "$pkg_dir"
}

resolve_ks_home() {
  if [ -n "$USERPROFILE" ]; then
    printf '%s\n' "$USERPROFILE"
  elif command -v node >/dev/null 2>&1; then
    node -e "try{process.stdout.write(require('os').userInfo().homedir)}catch{process.stdout.write(require('os').homedir())}"
  else
    printf '%s\n' "$HOME"
  fi
}

resolve_agent_id() {
  pkg_dir=$1
  if [ -n "${KS_AGENT:-}" ]; then
    printf '%s\n' "$KS_AGENT"
    return 0
  fi
  if [ -f "$pkg_dir/package.json" ] && command -v node >/dev/null 2>&1; then
    node -pe "try{JSON.parse(require('fs').readFileSync(process.argv[1],'utf8')).ksAgent||''}catch{''}" "$pkg_dir/package.json" 2>/dev/null || true
    return 0
  fi
  case "$pkg_dir" in
    *hermes*) printf '%s\n' "hermes" ;;
    *openclaw*) printf '%s\n' "openclaw" ;;
    *codex*) printf '%s\n' "codex" ;;
    *) printf '%s\n' "cc" ;;
  esac
}

skill_dir_name() {
  case "$1" in
    hermes) printf '%s\n' "ks-hermes" ;;
    openclaw) printf '%s\n' "ks-openclaw" ;;
    codex) printf '%s\n' "ks-codex" ;;
    *) printf '%s\n' "ks" ;;
  esac
}

shared_bin_path() {
  ks_home=$1
  agent=$2
  skill_name=$(skill_dir_name "$agent")
  if [ -f "$ks_home/.agents/skills/$skill_name/bin/ks.exe" ]; then
    printf '%s\n' "$ks_home/.agents/skills/$skill_name/bin/ks.exe"
  elif [ -f "$ks_home/.agents/skills/$skill_name/bin/ks" ]; then
    printf '%s\n' "$ks_home/.agents/skills/$skill_name/bin/ks"
  fi
}

SCRIPT_DIR=$(resolve_script_dir "$0")
PKG_DIR=$(find_pkg_dir "$SCRIPT_DIR")
KS_HOME=$(resolve_ks_home)
KS_AGENT=$(resolve_agent_id "$PKG_DIR")
export KS_AGENT
SHARED_BIN=$(shared_bin_path "$KS_HOME" "$KS_AGENT")

if [ -f "$PKG_DIR/scripts/bootstrap.mjs" ] && command -v node >/dev/null 2>&1; then
  if ! node "$PKG_DIR/scripts/bootstrap.mjs"; then
    SHARED_BIN=$(shared_bin_path "$KS_HOME" "$KS_AGENT")
    if [ -z "$SHARED_BIN" ]; then
      exit 1
    fi
  else
    SHARED_BIN=$(shared_bin_path "$KS_HOME" "$KS_AGENT")
  fi
fi

if [ -n "$SHARED_BIN" ]; then
  exec "$SHARED_BIN" "$@"
fi

echo "ks: binary not found — run: node \"$PKG_DIR/scripts/postinstall.mjs\"" >&2
exit 1
