#!/usr/bin/env bash
# Fase 0 — Baseline do ambiente de desenvolvimento
# Somente leitura: NÃO instala nem altera pacotes do sistema.

set -euo pipefail

ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
OUT_DIR="$ROOT/results/env"
STAMP="$(date -u +%Y%m%dT%H%M%SZ)"
JSON_OUT="$OUT_DIR/baseline-$STAMP.json"
MD_OUT="$OUT_DIR/baseline-$STAMP.md"
LATEST_JSON="$OUT_DIR/baseline-latest.json"
LATEST_MD="$OUT_DIR/baseline-latest.md"

mkdir -p "$OUT_DIR"

have() { command -v "$1" >/dev/null 2>&1; }

ver_or_missing() {
  local bin="$1"
  shift
  if have "$bin"; then
    "$@" 2>&1 | head -n 1 | tr -d '\r'
  else
    printf 'AUSENTE'
  fi
}

human_bytes() {
  python3 -c "b=int('$1'); u=['B','KiB','MiB','GiB','TiB']; i=0
while b>=1024 and i<len(u)-1: b/=1024; i+=1
print(f'{b:.1f} {u[i]}')"
}

OS_NAME="$(. /etc/os-release; echo "$NAME")"
OS_VERSION="$(. /etc/os-release; echo "$VERSION")"
KERNEL="$(uname -r)"
HOSTNAME="$(hostname)"
CPU_MODEL="$(lscpu 2>/dev/null | awk -F: '/Model name/ {gsub(/^[ \t]+/,"",$2); print $2; exit}')"
CPU_CORES="$(nproc)"
MEM_TOTAL="$(free -b | awk '/Mem:/ {print $2}')"
MEM_AVAIL="$(free -b | awk '/Mem:/ {print $7}')"
DISK_SIZE="$(df -B1 / | awk 'NR==2{print $2}')"
DISK_USED="$(df -B1 / | awk 'NR==2{print $3}')"
DISK_AVAIL="$(df -B1 / | awk 'NR==2{print $4}')"
DISK_PCT="$(df -h / | awk 'NR==2{print $5}')"

PHP_V="$(ver_or_missing php php -v)"
PY_V="$(ver_or_missing python3 python3 --version)"
FFMPEG_V="$(ver_or_missing ffmpeg ffmpeg -version)"
FFPROBE_V="$(ver_or_missing ffprobe ffprobe -version)"
PSQL_V="$(ver_or_missing psql psql --version)"
NGINX_V="$(ver_or_missing nginx nginx -v)"
APACHE_V="$(ver_or_missing apache2 apache2 -v)"
MYSQL_V="$(ver_or_missing mysql mysql --version)"
DOCKER_V="$(ver_or_missing docker docker --version)"

LAN_IP="$(ip -4 -o addr show scope global 2>/dev/null | awk '{print $4}' | head -n1)"
DEFAULT_IF="$(ip -4 route show default 2>/dev/null | awk '{print $5; exit}')"
DEFAULT_GW="$(ip -4 route show default 2>/dev/null | awk '{print $3; exit}')"

export STAMP HOSTNAME OS_NAME OS_VERSION KERNEL CPU_MODEL CPU_CORES
export MEM_TOTAL MEM_AVAIL DISK_SIZE DISK_USED DISK_AVAIL DISK_PCT
export PHP_V PY_V FFMPEG_V FFPROBE_V PSQL_V NGINX_V APACHE_V MYSQL_V DOCKER_V
export LAN_IP DEFAULT_IF DEFAULT_GW

python3 - "$JSON_OUT" <<'PY'
import json, os, sys
out = sys.argv[1]
env = {
  "collected_at_utc": os.environ.get("STAMP"),
  "host": {
    "hostname": os.environ["HOSTNAME"],
    "os_name": os.environ["OS_NAME"],
    "os_version": os.environ["OS_VERSION"],
    "kernel": os.environ["KERNEL"],
  },
  "cpu": {
    "model": os.environ.get("CPU_MODEL") or None,
    "cores": int(os.environ["CPU_CORES"]),
  },
  "memory_bytes": {
    "total": int(os.environ["MEM_TOTAL"]),
    "available": int(os.environ["MEM_AVAIL"]),
  },
  "disk_root_bytes": {
    "size": int(os.environ["DISK_SIZE"]),
    "used": int(os.environ["DISK_USED"]),
    "available": int(os.environ["DISK_AVAIL"]),
    "used_percent": os.environ["DISK_PCT"],
  },
  "network": {
    "default_interface": os.environ.get("DEFAULT_IF") or None,
    "default_gateway": os.environ.get("DEFAULT_GW") or None,
    "primary_cidr": os.environ.get("LAN_IP") or None,
  },
  "software": {
    "php": os.environ["PHP_V"],
    "python": os.environ["PY_V"],
    "ffmpeg": os.environ["FFMPEG_V"],
    "ffprobe": os.environ["FFPROBE_V"],
    "postgresql_client": os.environ["PSQL_V"],
    "nginx": os.environ["NGINX_V"],
    "apache": os.environ["APACHE_V"],
    "mysql": os.environ["MYSQL_V"],
    "docker": os.environ["DOCKER_V"],
  },
  "phase0_notes": {
    "baseline_is_read_only": True,
    "no_packages_installed_by_this_script": True,
    "recorder_must_be_independent_of_laravel": True,
  },
}
with open(out, "w", encoding="utf-8") as f:
    json.dump(env, f, indent=2, ensure_ascii=False)
    f.write("\n")
PY

{
  echo "# Baseline do ambiente — Fase 0"
  echo
  echo "- Coletado (UTC): \`$STAMP\`"
  echo "- Host: \`$HOSTNAME\`"
  echo "- OS: $OS_NAME $OS_VERSION (kernel \`$KERNEL\`)"
  echo
  echo "## Hardware"
  echo
  echo "| Item | Valor |"
  echo "|---|---|"
  echo "| CPU | $CPU_MODEL |"
  echo "| Cores | $CPU_CORES |"
  echo "| RAM total | $(human_bytes "$MEM_TOTAL") |"
  echo "| RAM disponível | $(human_bytes "$MEM_AVAIL") |"
  echo "| Disco / | $(human_bytes "$DISK_SIZE") (usado $DISK_PCT, livre $(human_bytes "$DISK_AVAIL")) |"
  echo
  echo "## Rede"
  echo
  echo "| Item | Valor |"
  echo "|---|---|"
  echo "| Interface default | \`${DEFAULT_IF:-—}\` |"
  echo "| Gateway | \`${DEFAULT_GW:-—}\` |"
  echo "| Endereço | \`${LAN_IP:-—}\` |"
  echo
  echo "## Software"
  echo
  echo "| Pacote | Situação |"
  echo "|---|---|"
  echo "| PHP | \`$PHP_V\` |"
  echo "| Python | \`$PY_V\` |"
  echo "| FFmpeg | \`$FFMPEG_V\` |"
  echo "| ffprobe | \`$FFPROBE_V\` |"
  echo "| PostgreSQL client | \`$PSQL_V\` |"
  echo "| Nginx | \`$NGINX_V\` |"
  echo "| Apache | \`$APACHE_V\` |"
  echo "| MySQL | \`$MYSQL_V\` |"
  echo "| Docker | \`$DOCKER_V\` |"
  echo
  echo "## Notas Fase 0"
  echo
  echo "- Este script é **somente leitura** (não instala pacotes)."
  echo "- Ausências (FFmpeg/ffprobe/PostgreSQL/Nginx) são esperadas até fases posteriores; instalar só quando a fase exigir."
  echo "- **Recorder Service deve funcionar independentemente do Laravel** — restart do painel não pode interromper gravações."
} > "$MD_OUT"

cp -f "$JSON_OUT" "$LATEST_JSON"
cp -f "$MD_OUT" "$LATEST_MD"

echo "OK: $MD_OUT"
echo "OK: $JSON_OUT"
