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

SUMMARY_PATH=""
OUTPUT_PATH=""
MERGE_SHA=""
PR_NUMBER=""
PR_TITLE=""
PR_URL=""
PR_AUTHOR=""
PR_MERGED_AT=""
PR_RESOLUTION="resolved"
RUN_URL=""
BENCH_COMMAND=""
GENERATED_AT=""

usage() {
  cat <<'EOF'
Usage:
  scripts/update-trace-bench.sh \
    --summary <path> \
    --output <path> \
    --sha <merge-sha> \
    --pr-number <number> \
    --pr-title <title> \
    --pr-url <url> \
    --pr-author <login> \
    --pr-merged-at <timestamp> \
    [--pr-resolution <resolved|unresolved>] \
    --run-url <url> \
    --bench-command <command> \
    [--generated-at <timestamp>]

Appends one benchmark entry to trace_bench.md using an existing summary.tsv file.
The script is idempotent per merge commit SHA and skips when the target file
already contains a marker for the provided commit.
EOF
}

fail() {
  printf '[trace-bench] ERROR: %s\n' "$*" >&2
  exit 1
}

require_cmd() {
  command -v "$1" >/dev/null 2>&1 || fail "required command not found: $1"
}

parse_args() {
  while [[ $# -gt 0 ]]; do
    case "$1" in
      --summary)
        SUMMARY_PATH="${2:-}"
        shift 2
        ;;
      --output)
        OUTPUT_PATH="${2:-}"
        shift 2
        ;;
      --sha)
        MERGE_SHA="${2:-}"
        shift 2
        ;;
      --pr-number)
        PR_NUMBER="${2:-}"
        shift 2
        ;;
      --pr-title)
        PR_TITLE="${2:-}"
        shift 2
        ;;
      --pr-url)
        PR_URL="${2:-}"
        shift 2
        ;;
      --pr-author)
        PR_AUTHOR="${2:-}"
        shift 2
        ;;
      --pr-merged-at)
        PR_MERGED_AT="${2:-}"
        shift 2
        ;;
      --pr-resolution)
        PR_RESOLUTION="${2:-}"
        shift 2
        ;;
      --run-url)
        RUN_URL="${2:-}"
        shift 2
        ;;
      --bench-command)
        BENCH_COMMAND="${2:-}"
        shift 2
        ;;
      --generated-at)
        GENERATED_AT="${2:-}"
        shift 2
        ;;
      -h|--help)
        usage
        exit 0
        ;;
      *)
        fail "unknown argument: $1"
        ;;
    esac
  done
}

validate_inputs() {
  [[ -n "$SUMMARY_PATH" ]] || fail "--summary is required"
  [[ -f "$SUMMARY_PATH" ]] || fail "summary file not found: $SUMMARY_PATH"
  [[ -n "$OUTPUT_PATH" ]] || fail "--output is required"
  [[ -n "$MERGE_SHA" ]] || fail "--sha is required"
  [[ -n "$PR_NUMBER" ]] || fail "--pr-number is required"
  [[ -n "$PR_TITLE" ]] || fail "--pr-title is required"
  [[ -n "$PR_URL" ]] || fail "--pr-url is required"
  [[ -n "$PR_AUTHOR" ]] || fail "--pr-author is required"
  [[ -n "$PR_MERGED_AT" ]] || fail "--pr-merged-at is required"
  [[ -n "$RUN_URL" ]] || fail "--run-url is required"
  [[ -n "$BENCH_COMMAND" ]] || fail "--bench-command is required"

  require_cmd awk
  require_cmd date
  require_cmd grep

  if [[ -z "$GENERATED_AT" ]]; then
    GENERATED_AT="$(date -u '+%Y-%m-%d %H:%M:%S UTC')"
  fi

  PR_TITLE="${PR_TITLE//$'\n'/ }"
}

initialize_trace_file() {
  if [[ -f "$OUTPUT_PATH" ]]; then
    return 0
  fi

  cat >"$OUTPUT_PATH" <<'EOF'
# Trace Bench

This file is auto-updated by `.github/workflows/trace-bench.yml` after pull requests merge to `main`.

Each entry records the merged PR metadata plus the results from:

`scripts/bench-gh.sh --runs 5 --warmups 1`

Entries are keyed by merge commit SHA so reruns can skip duplicates.
EOF
}

print_markdown_table() {
  awk -F'\t' '
    NR == 1 {
      print "| scenario | n | mean_ms | p50_ms | p95_ms | min_ms | max_ms |"
      print "| --- | ---: | ---: | ---: | ---: | ---: | ---: |"
      next
    }
    {
      printf "| %s | %s | %s | %s | %s | %s | %s |\n", $1, $2, $3, $4, $5, $6, $7
    }
  ' "$SUMMARY_PATH"
}

append_trace_entry() {
  local marker
  marker="<!-- trace-bench:${MERGE_SHA} -->"

  if grep -Fq "$marker" "$OUTPUT_PATH"; then
    printf '[trace-bench] entry already exists for %s, skipping\n' "$MERGE_SHA"
    return 0
  fi

  {
    printf '\n%s\n' "$marker"
    printf '## %s\n\n' "$GENERATED_AT"
    printf -- '- PR: [#%s](%s) %s\n' "$PR_NUMBER" "$PR_URL" "$PR_TITLE"
    printf -- '- PR resolution: %s\n' "$PR_RESOLUTION"
    printf -- '- Author: @%s\n' "$PR_AUTHOR"
    printf -- '- PR merged at: %s\n' "$PR_MERGED_AT"
    printf -- '- Merge commit: `%s`\n' "$MERGE_SHA"
    printf -- '- Workflow run: [run](%s)\n' "$RUN_URL"
    printf -- '- Bench command: `%s`\n\n' "$BENCH_COMMAND"
    print_markdown_table
    printf '\n'
  } >>"$OUTPUT_PATH"

  printf '[trace-bench] appended entry for PR #%s (%s)\n' "$PR_NUMBER" "$MERGE_SHA"
}

main() {
  parse_args "$@"
  validate_inputs
  initialize_trace_file
  append_trace_entry
}

main "$@"
