#!/usr/bin/env bash
set -euo pipefail
umask 077
self=$(readlink -f -- "${BASH_SOURCE[0]}")
release_dir=$(cd -- "$(dirname -- "$self")/.." && pwd)
prefix=$(cd -- "$release_dir/../.." && pwd)
IFS= read -r state_dir < "$prefix/state-dir"
runtime="$prefix/current/bin/teambridge-runtime"
agent="$prefix/current/bin/teambridge-agent"
command_name="${1:-help}"
if (($#)); then shift; fi
case "$command_name" in
 version) "$runtime" version; "$agent" version;;
 doctor)
  status=0
  "$runtime" version; "$agent" version
  printf 'OS user: %s (%s)\nState directory: %s\n' "$(id -un)" "$(id -u)" "$state_dir"
  if systemctl --user show-environment >/dev/null 2>&1; then echo 'systemd user: available'; else echo 'systemd user: unavailable'; status=1; fi
  linger=$(loginctl show-user "$(id -un)" -p Linger --value 2>/dev/null || true)
  printf 'Linger: %s (변경하지 않음)\n' "${linger:-unknown}"
  if [[ -f "$state_dir/config.json" ]]; then echo 'Runtime identity: registered'; else echo 'Runtime identity: not registered'; fi
  if command -v codex >/dev/null; then codex --version; else echo 'Codex: not installed; fake 프로필만 사용 가능'; fi
  [[ "$linger" != no ]] || echo '로그아웃/재부팅 지속성은 관리자 정책 확인이 필요합니다.'
  exit "$status";;
 register|recover) exec "$runtime" "$command_name" --state-dir "$state_dir" --agent-binary "$agent" "$@";;
 configure) exec "$runtime" configure --state-dir "$state_dir" "$@";;
 run|status) exec "$runtime" "$command_name" --state-dir "$state_dir" "$@";;
 start)
  [[ -f "$state_dir/config.json" ]] || { echo '먼저 register를 실행하세요.' >&2; exit 1; }
  systemctl --user enable teambridge-runtime.service
  systemctl --user restart teambridge-runtime.service;;
 stop) systemctl --user stop teambridge-runtime.service; echo 'Runtime 중지. Agent는 Console에서 별도로 중지합니다.';;
 logs) exec journalctl --user -u teambridge-runtime.service -f "$@";;
 rollback)
  [[ -L "$prefix/previous" ]] || { echo '이전 버전이 없습니다.' >&2; exit 1; }
  previous=$(readlink "$prefix/previous");current=$(readlink "$prefix/current")
  [[ "$previous" == releases/* && "$previous" != *'..'* && -d "$prefix/$previous" ]] || { echo '잘못된 이전 버전 경로입니다.' >&2; exit 1; }
  (cd "$prefix/$previous" && sha256sum --quiet -c SHA256SUMS)
  ln -s -- "$previous" "$prefix/.rollback-new-$$"; mv -Tf -- "$prefix/.rollback-new-$$" "$prefix/current"
  ln -s -- "$current" "$prefix/.previous-new-$$"; mv -Tf -- "$prefix/.previous-new-$$" "$prefix/previous"
  echo '바이너리 current만 이전 버전으로 전환했습니다. 상태 DB는 유지합니다. 적용하려면 start를 실행하세요.';;
 *)
  cat <<'HELP'
teambridge-host version|doctor|register|recover|configure|run|status|start|stop|logs|rollback
register: --hub HTTPS_URL --nats TLS_URL --name DISPLAY_NAME [--ca-file PEM]
등록 코드는 TEAMBRIDGE_ENROLLMENT_CODE 환경변수로 전달합니다.
configure: --enable-cursor --cursor-binary PATH (existing OS account login)
configure: --enable-codex --codex-auth-source PATH [--codex-binary PATH] [--max-agents N]
HELP
  [[ "$command_name" == help || "$command_name" == --help ]] || exit 2;;
esac
