#!/usr/bin/env bash
# tmux-viewer.sh — run-owned tmux log viewer helpers.
#
# The orchestrator owns session names; the harness only opens windows inside a
# session resolved by tmux-session.sh. When no run-owned session is available the
# viewer is skipped. Runtime processes still run and write logs.

_tv_shared_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck disable=SC1091
for _tv_src in "$_tv_shared_dir/tmux-session.sh" "$_tv_shared_dir/lib/tmux-session.sh"; do
  [ -f "$_tv_src" ] && { . "$_tv_src"; break; }
done
unset _tv_src _tv_shared_dir

tmux_viewer_port_is_listening() {
  local port="${1:-}"
  case "$port" in ''|*[!0-9]*) return 1 ;; esac
  command -v lsof >/dev/null 2>&1 || return 1
  lsof -nP -iTCP:"$port" -sTCP:LISTEN -t >/dev/null 2>&1
}

tmux_viewer_open() {
  local prefix="$1" port="$2" log="$3" runtime_dir="$4" marker_file="$5" command="$6"
  command -v tmux >/dev/null 2>&1 || return 0
  command -v resolve_run_tmux_session >/dev/null 2>&1 || return 0

  local session window
  session="$(resolve_run_tmux_session "$runtime_dir")"
  { [ -n "$session" ] && tmux has-session -t "=$session" 2>/dev/null; } || return 0

  window="${prefix}-${port:-default}"
  tmux list-windows -t "$session" -F '#{window_name}' 2>/dev/null | while IFS= read -r _win; do
    case "$_win" in
      "$prefix"-*) ;;
      *) continue ;;
    esac
    _port="${_win#"$prefix"-}"
    if [ "$_win" != "$window" ] || ! tmux_viewer_port_is_listening "$_port"; then
      tmux kill-window -t "${session}:${_win}" >/dev/null 2>&1 || true
    fi
  done

  tmux kill-window -t "${session}:${window}" >/dev/null 2>&1 || true
  tmux new-window -d -t "$session" -n "$window" "$command"
  if [ -n "$marker_file" ]; then
    mkdir -p "$(dirname "$marker_file")"
    printf '%s:%s\n' "$session" "$window" > "$marker_file"
  fi
  printf '%s log viewer → tmux %s:%s\n' "$prefix" "$session" "$window" >&2
}

tmux_viewer_close_marker() {
  local marker_file="$1"
  command -v tmux >/dev/null 2>&1 || { rm -f "$marker_file"; return 0; }
  if [ -f "$marker_file" ]; then
    local target marker_session owned_session runtime_dir
    target="$(cat "$marker_file" 2>/dev/null || true)"
    marker_session="${target%%:*}"
    runtime_dir="$(dirname "$marker_file")"
    owned_session="$(resolve_run_tmux_session "$runtime_dir")"
    if [ -n "$target" ] && [ -n "$owned_session" ] && [ "$marker_session" = "$owned_session" ]; then
      tmux kill-window -t "$target" >/dev/null 2>&1 || true
    fi
  fi
  rm -f "$marker_file"
}

tmux_viewer_sweep_prefix() {
  local prefix="$1" runtime_dir="$2"
  command -v tmux >/dev/null 2>&1 || return 0
  command -v resolve_run_tmux_session >/dev/null 2>&1 || return 0
  local session
  session="$(resolve_run_tmux_session "$runtime_dir")"
  { [ -n "$session" ] && tmux has-session -t "=$session" 2>/dev/null; } || return 0
  tmux list-windows -t "$session" -F '#{window_name}' 2>/dev/null | while IFS= read -r _win; do
    case "$_win" in
      "$prefix"-*) tmux kill-window -t "${session}:${_win}" >/dev/null 2>&1 || true ;;
    esac
  done
}
