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

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/artifact_contract.sh"

: "${RUN_ID:=}"

if [[ -z "${RUN_ID}" ]]; then
  echo "Missing RUN_ID; expected to be provided (e.g., RUN_ID=2026-03-04)." >&2
  exit 2
fi

run_dir="$(artifact_run_dir "$RUN_ID")"
latest_link="$ARTIFACT_LATEST_LINK"
latest_run_file="$ARTIFACT_LATEST_RUN_FILE"
latest_summary="$ARTIFACT_LATEST_SUMMARY"
run_summary="$(artifact_summary_path "$RUN_ID")"

run_id_regex='^[0-9]{4}-[0-9]{2}-[0-9]{2}$'
errors=0

resolve_realpath() {
  local target="$1"
  python3 - "$target" <<'PY'
import os, sys
print(os.path.realpath(sys.argv[1]))
PY
}

fail() {
  echo "$1" >&2
  errors=1
}

if [[ ! "$RUN_ID" =~ $run_id_regex ]]; then
  fail "INVALID_RUN_ID: expected YYYY-MM-DD format, got: ${RUN_ID}"
else
  echo "OK: RUN_ID format is dated (${RUN_ID})."
fi

if [[ ! -f "$run_summary" ]]; then
  fail "MISSING: ${run_summary}"
else
  echo "OK: ${run_summary}"
fi

if [[ ! -L "$latest_link" ]]; then
  fail "INVALID: ${latest_link} missing or not a symlink."
else
  resolved_latest="$(resolve_realpath "$latest_link")"
  resolved_run="$(resolve_realpath "$run_dir")"
  if [[ "$resolved_latest" != "$resolved_run" ]]; then
    fail "MISMATCH: ${latest_link} resolves to ${resolved_latest}, expected ${resolved_run}."
  else
    echo "OK: latest pointer resolves to ${resolved_latest}."
  fi
fi

if [[ ! -f "$latest_run_file" ]]; then
  fail "MISSING: ${latest_run_file}"
else
  latest_run_value="$(tr -d '\r\n' < "$latest_run_file")"
  if [[ -z "$latest_run_value" ]]; then
    fail "INVALID: ${latest_run_file} is empty."
  elif [[ ! -d "$latest_run_value" ]]; then
    fail "INVALID: ${latest_run_file} points to missing directory: ${latest_run_value}"
  else
    resolved_latest_run="$(resolve_realpath "$latest_run_value")"
    resolved_run="$(resolve_realpath "$run_dir")"
    if [[ "$resolved_latest_run" != "$resolved_run" ]]; then
      fail "MISMATCH: ${latest_run_file} resolves to ${resolved_latest_run}, expected ${resolved_run}."
    else
      echo "OK: latest run file matches run directory."
    fi
  fi
fi

if [[ ! -f "$latest_summary" ]]; then
  fail "MISSING: ${latest_summary}"
else
  echo "OK: ${latest_summary}"
fi

# Validate required summary.json keys.
if [[ -f "$run_summary" ]]; then
  if ! python3 - "$run_summary" "$RUN_ID" <<'PY'
import json
import sys

summary_path = sys.argv[1]
run_id = sys.argv[2]

with open(summary_path, "r", encoding="utf-8") as f:
    payload = json.load(f)

required_top = ["generated_at", "root_dir", "manifest", "run_id", "summary", "benchmarks"]
missing_top = [key for key in required_top if key not in payload]
if missing_top:
    print(f"MISSING_SUMMARY_TOP_KEYS: {', '.join(missing_top)}", file=sys.stderr)
    sys.exit(1)

if payload.get("run_id") != run_id:
    print(f"RUN_ID_MISMATCH: expected {run_id}, found {payload.get('run_id')}", file=sys.stderr)
    sys.exit(1)

required_summary = ["total", "passed", "failed"]
summary = payload["summary"]
missing_summary = [key for key in required_summary if key not in summary]
if missing_summary:
    print(f"MISSING_SUMMARY_STATS_KEYS: {', '.join(missing_summary)}", file=sys.stderr)
    sys.exit(1)

if not isinstance(payload.get("benchmarks"), list):
    print("INVALID_BENCHMARKS: expected an array/list", file=sys.stderr)
    sys.exit(1)

print("OK: summary.json contains required keys.")
PY
  then
    fail "INVALID: summary.json missing required keys or schema mismatch (${run_summary})."
  fi
fi

# Validate latest summary hash equality with run summary.
if [[ -f "$run_summary" && -f "$latest_summary" ]]; then
  read -r run_summary_hash latest_summary_hash <<< "$(python3 - "$run_summary" "$latest_summary" <<'PY'
import hashlib
import sys

for path in sys.argv[1:]:
    with open(path, 'rb') as f:
        print(hashlib.sha256(f.read()).hexdigest(), end=' ')
PY
)"
  if [[ -z "$run_summary_hash" || -z "$latest_summary_hash" ]]; then
    fail "Unable to compute one or both artifact hashes."
  elif [[ "$run_summary_hash" != "$latest_summary_hash" ]]; then
    fail "HASH_MISMATCH: ${ARTIFACT_LATEST_SUMMARY} (${latest_summary_hash}) != run summary (${run_summary_hash})."
  else
    echo "OK: ${ARTIFACT_LATEST_SUMMARY} hash equals latest run summary hash."
  fi
fi

if [[ ${errors} -ne 0 ]]; then
  echo "Artifact contract check failed." >&2
  exit 1
fi

echo "Artifact contract check passed."
exit 0
