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

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

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

Opcoes de alta carga aceitas e repassadas para escuta/escuta:
  --lote=N                 padrao 20000 (rajadas acima de 10k mensagens)
  --paralelo=N             padrao 512 (pool local de atores; max configuravel 10000)
  --lote-ator=N            padrao 100 para atores com comandoLote/executavelLote
  --intervalo=N            padrao 1 segundo
  --intervalo-limpeza=N    padrao 300 segundos; 0 desabilita limpeza pesada
  --log-compacto           padrao; reduz I/O em massa
  --log-detalhado          audita cada entrega/inicio/conclusao
  --validar-marcador-api   modo estrito; confere conteudo de cada marcador
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=""
args=()
for a in "$@"; do
  case "$a" in
    --ajuda|--help|-h) uso; exit 0 ;;
    --base=*) base_arg="${a#--base=}" ;;
    *) args+=("$a") ;;
  esac
done

base="$(resolver_base "$base_arg")" || { echo "ligar-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"
log="$base/espaco/escuta.log"
logpathfile="$lockdir/escuta-daemon.logpath"
mkdir -p "$lockdir"

# O log canonico pode ter sido criado pelo Apache/www-data. Quando o usuario
# CLI nao consegue escrever nele, usa um fallback dentro de espaco/tmp para nao
# impedir a escuta de subir.
if ! { [[ -e "$log" ]] || touch "$log" 2>/dev/null; } || [[ ! -w "$log" ]]; then
  mkdir -p "$base/espaco/tmp" 2>/dev/null || true
  fallback_user="${USER:-cli}"
  fallback_user="${fallback_user//[^A-Za-z0-9._-]/-}"
  log="$base/espaco/tmp/escuta-${fallback_user}-$(id -u 2>/dev/null || echo 0).log"
  touch "$log" 2>/dev/null || { echo "ligar-escuta: sem permissao para criar log em espaco/escuta.log nem em espaco/tmp" >&2; exit 1; }
fi
chmod 0664 "$log" 2>/dev/null || true
printf '%s\n' "$log" > "$logpathfile" 2>/dev/null || true

pid=""
[[ -f "$pidfile" ]] && pid="$(tr -cd '0-9' < "$pidfile" || true)"
if pid_rodando "$pid"; then
  echo "escuta ja esta ligada para $base (pid=$pid)"
  exit 0
fi
pid=""
[[ -f "$lockfile" ]] && pid="$(tr -cd '0-9' < "$lockfile" || true)"
if pid_rodando "$pid"; then
  printf '%s\n' "$pid" > "$pidfile"
  echo "escuta ja esta ligada para $base (pid=$pid)"
  exit 0
fi

(
  cd "$base"
  # Alta carga cria muitos processos/arquivos; eleva o limite de FDs quando o
  # sistema permitir, sem falhar em hospedagens com limite fixo.
  ulimit -n 1048576 2>/dev/null || true
  nohup ./escuta/escuta --base="$base" "${args[@]}" >> "$log" 2>&1 &
  echo "$!" > "$pidfile"
)

sleep 0.4
pid="$(tr -cd '0-9' < "$pidfile" || true)"
if pid_rodando "$pid"; then
  echo "escuta ligada para $base (pid=$pid, log=espaco/escuta.log)"
  exit 0
fi

echo "ligar-escuta: falha ao iniciar. Veja $log" >&2
exit 1
