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

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT_DIR"

METRICS_FILE="${1:-}"
if [[ -z "$METRICS_FILE" ]]; then
  echo "usage: $0 <metrics-prom-file> [--allow-zero-total]" >&2
  exit 2
fi

ALLOW_ZERO_TOTAL=0
if [[ "${2:-}" == "--allow-zero-total" ]]; then
  ALLOW_ZERO_TOTAL=1
fi

if [[ ! -f "$METRICS_FILE" ]]; then
  echo "missing metrics file: $METRICS_FILE" >&2
  exit 2
fi

MAX_ERROR_RATE="${MAX_ERROR_RATE:-0.05}"
MAX_P95_MICROS="${MAX_P95_MICROS:-200000}"
MAX_P99_MICROS="${MAX_P99_MICROS:-300000}"
ARTIFACTS_DIR="${ARTIFACTS_DIR:-$ROOT_DIR/artifacts}"
OUT_JSON="${OUT_JSON:-$ARTIFACTS_DIR/slo_gate_report.json}"
OUT_MD="${OUT_MD:-$ARTIFACTS_DIR/slo_gate_report.md}"

metric_value() {
  local key="$1"
  awk -v k="$key" '$1 == k { print $2 }' "$METRICS_FILE" | tail -n1
}

QUERY_TOTAL="$(metric_value iridium_query_total)"
QUERY_ERRORS="$(metric_value iridium_query_errors)"
P95="$(metric_value iridium_query_p95_latency_micros)"
P99="$(metric_value iridium_query_p99_latency_micros)"

QUERY_TOTAL="${QUERY_TOTAL:-0}"
QUERY_ERRORS="${QUERY_ERRORS:-0}"
P95="${P95:-0}"
P99="${P99:-0}"

ERROR_RATE="$(awk -v total="$QUERY_TOTAL" -v err="$QUERY_ERRORS" 'BEGIN {
  if (total <= 0) { print "0.000000"; } else { printf "%.6f", err / total; }
}')"

if [[ "$ALLOW_ZERO_TOTAL" -eq 0 && "$QUERY_TOTAL" -eq 0 ]]; then
  echo "SLO gate failed: query_total is 0 (use --allow-zero-total to bypass)" >&2
  exit 1
fi

PASS_ERROR_RATE=1
PASS_P95=1
PASS_P99=1

awk -v v="$ERROR_RATE" -v max="$MAX_ERROR_RATE" 'BEGIN { exit !(v <= max) }' || PASS_ERROR_RATE=0
awk -v v="$P95" -v max="$MAX_P95_MICROS" 'BEGIN { exit !(v <= max) }' || PASS_P95=0
awk -v v="$P99" -v max="$MAX_P99_MICROS" 'BEGIN { exit !(v <= max) }' || PASS_P99=0

OVERALL_PASS=1
if [[ "$PASS_ERROR_RATE" -ne 1 || "$PASS_P95" -ne 1 || "$PASS_P99" -ne 1 ]]; then
  OVERALL_PASS=0
fi

mkdir -p "$ARTIFACTS_DIR"
TIMESTAMP_UTC="$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
COMMIT_SHA="$(git rev-parse --short HEAD 2>/dev/null || echo "unknown")"

cat >"$OUT_JSON" <<EOF
{
  "timestamp_utc": "$TIMESTAMP_UTC",
  "commit_sha": "$COMMIT_SHA",
  "input_metrics_file": "$(basename "$METRICS_FILE")",
  "thresholds": {
    "max_error_rate": $MAX_ERROR_RATE,
    "max_p95_latency_micros": $MAX_P95_MICROS,
    "max_p99_latency_micros": $MAX_P99_MICROS
  },
  "observed": {
    "query_total": $QUERY_TOTAL,
    "query_errors": $QUERY_ERRORS,
    "error_rate": $ERROR_RATE,
    "query_p95_latency_micros": $P95,
    "query_p99_latency_micros": $P99
  },
  "checks": {
    "error_rate": $( [[ "$PASS_ERROR_RATE" -eq 1 ]] && echo "true" || echo "false" ),
    "p95_latency": $( [[ "$PASS_P95" -eq 1 ]] && echo "true" || echo "false" ),
    "p99_latency": $( [[ "$PASS_P99" -eq 1 ]] && echo "true" || echo "false" )
  },
  "overall_pass": $( [[ "$OVERALL_PASS" -eq 1 ]] && echo "true" || echo "false" )
}
EOF

cat >"$OUT_MD" <<EOF
# SLO Gate Report

- Timestamp (UTC): $TIMESTAMP_UTC
- Commit: $COMMIT_SHA
- Input metrics: $(basename "$METRICS_FILE")

## Thresholds
- Max error rate: $MAX_ERROR_RATE
- Max p95 latency (micros): $MAX_P95_MICROS
- Max p99 latency (micros): $MAX_P99_MICROS

## Observed
- Query total: $QUERY_TOTAL
- Query errors: $QUERY_ERRORS
- Error rate: $ERROR_RATE
- Query p95 latency (micros): $P95
- Query p99 latency (micros): $P99

## Result
- Error rate check: $( [[ "$PASS_ERROR_RATE" -eq 1 ]] && echo "PASS" || echo "FAIL" )
- P95 latency check: $( [[ "$PASS_P95" -eq 1 ]] && echo "PASS" || echo "FAIL" )
- P99 latency check: $( [[ "$PASS_P99" -eq 1 ]] && echo "PASS" || echo "FAIL" )
- Overall: $( [[ "$OVERALL_PASS" -eq 1 ]] && echo "PASS" || echo "FAIL" )
EOF

echo "Wrote:"
echo "  $OUT_JSON"
echo "  $OUT_MD"

if [[ "$OVERALL_PASS" -ne 1 ]]; then
  echo "SLO gate failed" >&2
  exit 1
fi
