#!/bin/bash
set -uo pipefail

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
REGISTRY="$ROOT_DIR/.smbatcher/REGISTRY.md"
RUNS_DIR="$ROOT_DIR/.smbatcher/runs"

PASS=true

require_file() {
  if [ ! -f "$1" ]; then
    echo "FAIL: missing $1"
    PASS=false
  fi
}

require_file "$REGISTRY"

PYTHON_BIN="${PYTHON_BIN:-python3.12}"

now_epoch=$(date +%s)

# Latest design domains (to scope checks to current run)
LATEST_DESIGN_LOG=$(ls -t "$RUNS_DIR"/design-*.log 2>/dev/null | head -n1 || true)
LATEST_DESIGN_DOMAINS=()
LATEST_DESIGN_DOMAINS_CSV=""
if [ -n "$LATEST_DESIGN_LOG" ] && [ -f "$LATEST_DESIGN_LOG" ]; then
  domains_line=$(grep "^domains=" "$LATEST_DESIGN_LOG" || true)
  if [ -n "$domains_line" ]; then
    domains_csv=${domains_line#domains=}
    LATEST_DESIGN_DOMAINS_CSV="$domains_csv"
    IFS=',' read -r -a LATEST_DESIGN_DOMAINS <<<"$domains_csv"
  fi
fi

# SC-002: 95% completion per batch (Q) over total entries for batch
for batch in $(grep "|" "$REGISTRY" | tail -n +3 | awk -F'|' '{print $6}' | tr -d ' ' | sort | uniq | grep -v '^-$' || true); do
  counts=$("$PYTHON_BIN" "$ROOT_DIR/tools/shared/metrics-batch-counts.py" "$REGISTRY" "$batch" "${LATEST_DESIGN_DOMAINS_CSV}")
  total=${counts%,*}
  done_count=${counts#*,}
  if [ "$total" -gt 0 ]; then
    rate=$("$PYTHON_BIN" "$ROOT_DIR/tools/shared/metrics-completion-rate.py" "$total" "$done_count")
    if (( $(echo "$rate < 0.95" | bc -l) )); then
      echo "FAIL: SC-002 batch $batch completion rate $rate < 0.95"
      PASS=false
    fi
  fi
done

# SC-003: collision rate <1% using latest design log (count lines with 'collision', ignore advisory similarity)
if [ -n "$LATEST_DESIGN_LOG" ] && [ -f "$LATEST_DESIGN_LOG" ]; then
  collision_count=$(grep -i "collision" "$LATEST_DESIGN_LOG" 2>/dev/null | wc -l | tr -d ' ')
  site_count=${#LATEST_DESIGN_DOMAINS[@]}
  if [ "$site_count" -gt 0 ]; then
    collision_rate=$("$PYTHON_BIN" "$ROOT_DIR/tools/shared/metrics-collision-rate.py" "$collision_count" "$site_count")
    if (( $(echo "$collision_rate >= 0.01" | bc -l) )); then
      echo "FAIL: SC-003 collision rate $collision_rate >= 0.01"
      PASS=false
    fi
  fi
fi

# SC-005: run records available within 5 minutes of completion (mtime check)
if ls $RUNS_DIR/*.log >/dev/null 2>&1; then
  latest_log=$(ls -t $RUNS_DIR/*.log | head -n1)
  mtime=$(stat -f %m "$latest_log")
  age=$((now_epoch - mtime))
  if [ "$age" -gt 300 ]; then
    echo "FAIL: SC-005 latest log $latest_log older than 5 minutes"
    PASS=false
  fi
fi

# SC-007: registry updated within 1 minute of last run log (mtime comparison)
if ls "$RUNS_DIR"/*.log >/dev/null 2>&1; then
  latest_log_epoch=$(stat -f %m $(ls -t "$RUNS_DIR"/*.log | head -n1))
  reg_epoch=$(stat -f %m "$REGISTRY")
  lag=$((reg_epoch - latest_log_epoch))
  if [ "$lag" -gt 60 ]; then
    echo "FAIL: SC-007 registry lag ${lag}s > 60s"
    PASS=false
  fi
fi

# SC-006: dry-run duration ≤ 300s (captured by ci-dry-run)
DURATION_FILE="$RUNS_DIR/ci-dry-run-duration.log"
if [ -f "$DURATION_FILE" ]; then
  duration=$(cat "$DURATION_FILE")
  if [ "$duration" -gt 300 ]; then
    echo "FAIL: SC-006 ci-dry-run duration ${duration}s > 300s"
    PASS=false
  fi
else
  echo "FAIL: SC-006 duration file missing ($DURATION_FILE)"
  PASS=false
fi

if [ "$PASS" = true ]; then
  echo "OK:metrics_passed:all checks satisfied"
  exit 0
else
  echo "FAIL:metrics_failed:one or more checks failed"
  exit 1
fi
