#!/usr/bin/env bash
# R-01: три независимых прогона, каждый — на свежем контейнере со свежей генерацией данных.
# Запуск из папки исследования (Linux, macOS или Git Bash на Windows):  bash run.sh
# Нужны Docker и Node.js; перед первым запуском — npm install.
set -euo pipefail
cd "$(dirname "$0")"

IMAGE=postgres:17-alpine
NAME=kb-g-research
PORT=55417
RUNS=${RUNS:-3}

host_info() {
  if command -v powershell.exe > /dev/null; then
    powershell.exe -NoProfile -Command '[Console]::OutputEncoding = [Text.Encoding]::UTF8; $c = Get-CimInstance Win32_Processor; $s = Get-CimInstance Win32_ComputerSystem; $o = Get-CimInstance Win32_OperatingSystem; "CPU " + $c.Name + ", cores " + $c.NumberOfCores + ", logical " + $c.NumberOfLogicalProcessors; "RAM " + [math]::Round($s.TotalPhysicalMemory / 1GB, 1) + " GB"; $o.Caption + " " + $o.Version' | tr -d '\r'
  elif command -v lscpu > /dev/null; then
    lscpu | grep 'Model name'; free -g | head -2
  else
    sysctl -n machdep.cpu.brand_string hw.memsize
  fi
}

: > raw.csv
for RUN in $(seq 1 "$RUNS"); do
  docker run --rm -d --name "$NAME" --cpus=2 --memory=2g \
    -e POSTGRES_PASSWORD=bench -e POSTGRES_DB=bench -p "$PORT:5432" \
    "$IMAGE" -c jit=off > /dev/null
  # ждём финальный сервер (временный сервер инициализации слушает только сокет)
  for _ in $(seq 1 60); do
    docker exec "$NAME" pg_isready -U postgres -h 127.0.0.1 > /dev/null 2>&1 && break
    sleep 1
  done
  docker exec -i "$NAME" psql -U postgres -d bench -v ON_ERROR_STOP=1 < setup.sql | tail -n 3
  echo "run $RUN: $(date -u +%FT%TZ)" >&2
  if [ "$RUN" -eq 1 ]; then RUN=$RUN node bench.mjs >> raw.csv; else RUN=$RUN NO_HEADER=1 node bench.mjs >> raw.csv; fi
  RUN=$RUN node bench.mjs --explain
  if [ "$RUN" -eq 1 ]; then
    {
      echo "# R-01 environment, recorded $(date -u +%FT%TZ)"
      echo "## host"
      uname -a
      host_info
      echo "## runtime"
      echo "node $(node -v)"
      echo "pg $(node -p "require('./node_modules/pg/package.json').version")"
      docker version --format 'docker client {{.Client.Version}}, server {{.Server.Version}} ({{.Server.Os}}/{{.Server.Arch}})'
      docker info --format 'docker VM: {{.OperatingSystem}}, kernel {{.KernelVersion}}, {{.NCPU}} CPU, {{.MemTotal}} bytes'
      docker image inspect "$IMAGE" --format 'image {{index .RepoTags 0}} {{.Id}}'
      echo "container limits: --cpus=2 --memory=2g; server flag: -c jit=off"
      echo "## postgres"
      node bench.mjs --settings
    } > env.txt
  fi
  docker stop "$NAME" > /dev/null
done
node summarize.mjs raw.csv > summary.txt
cat summary.txt
