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

uso() {
  cat <<'TXT'
Uso: pp --desligar-escuta [--base=/caminho/do/sistema]

Desliga a escuta em segundo plano do sistema SISC atual. Se --base nao for
informado, o comando procura a raiz do sistema a partir do diretorio atual.
TXT
}

resolver_base() {
  local base_arg="${1:-}"
  if [[ -n "$base_arg" ]]; then
    (cd "$base_arg" 2>/dev/null && pwd -P) || return 1
    return 0
  fi
  local d
  d="$(pwd -P)"
  while [[ "$d" != "/" ]]; do
    if [[ -x "$d/escuta/escuta" && -d "$d/espaco" ]]; then
      printf '%s\n' "$d"
      return 0
    fi
    d="$(dirname "$d")"
  done
  return 1
}

pid_rodando() {
  local pid="${1:-}"
  [[ "$pid" =~ ^[0-9]+$ ]] && kill -0 "$pid" 2>/dev/null
}

base_arg=""
for a in "$@"; do
  case "$a" in
    --ajuda|--help|-h) uso; exit 0 ;;
    --base=*) base_arg="${a#--base=}" ;;
    *) echo "desligar-escuta: argumento invalido: $a" >&2; exit 1 ;;
  esac
done

base="$(resolver_base "$base_arg")" || { echo "desligar-escuta: nao foi possivel localizar a raiz do sistema atual" >&2; exit 1; }
lockdir="$base/espaco/locks"
pidfile="$lockdir/escuta-daemon.pid"
lockfile="$lockdir/escuta.lock"

pid=""
[[ -f "$pidfile" ]] && pid="$(tr -cd '0-9' < "$pidfile" || true)"
if ! pid_rodando "$pid" && [[ -f "$lockfile" ]]; then
  pid="$(tr -cd '0-9' < "$lockfile" || true)"
fi

if ! pid_rodando "$pid"; then
  rm -f "$pidfile"
  echo "escuta ja esta desligada para $base"
  exit 0
fi

kill -TERM "$pid" 2>/dev/null || true
# Em alta carga a escuta pode precisar reentregar centenas/milhares de
# mensagens que estavam em processamento antes de sair. Aguarde até 60s antes
# do KILL forçado para preservar a recuperação limpa.
for _ in {1..300}; do
  if ! pid_rodando "$pid"; then
    rm -f "$pidfile"
    echo "escuta desligada para $base (pid=$pid)"
    exit 0
  fi
  sleep 0.2
done

kill -KILL "$pid" 2>/dev/null || true
rm -f "$pidfile"
echo "escuta forçada a desligar para $base (pid=$pid) apos timeout de desligamento"
