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

SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
task_tmp="$(mktemp -d "${TMPDIR:-/tmp}/tipoc-env-render.XXXXXX")"
trap 'rm -r -- "${task_tmp}"' EXIT

render_common() {
  TIPOC_OBJECT_STORE_URI=none \
  TIPOC_GLOBAL_SORT_URI_REF=none \
  TIPOC_BR_ENABLED=false \
  TIPOC_PREPARE_OPS=generate,import,add-index \
  "${SCRIPT_DIR}/tiup/init-attempt.sh" "$@" --render-only >/dev/null
}

default_out="${task_tmp}/default"
render_common --scale 1G --out "${default_out}"
if grep -q '^[[:space:]]*query_cost:' "${default_out}/spec.yaml"; then
  echo "default render unexpectedly contains query_cost" >&2
  exit 1
fi
if grep -q '^  securities:' "${default_out}/spec.yaml"; then
  echo "default render unexpectedly contains securities order flow" >&2
  exit 1
fi

lifecycle_out="${task_tmp}/lifecycle"
TIPOC_SECURITIES_ORDER_FLOW_MODE=lifecycle_coverage \
TIPOC_SECURITIES_ORDER_FLOW_SEED=20260811 \
TIPOC_SECURITIES_ORDER_QUANTITIES='100=3,200=1' \
TIPOC_SECURITIES_CASH_PERCENT=80 \
TIPOC_SECURITIES_LIFO_PERCENT=50 \
render_common --scale 1G --out "${lifecycle_out}"
grep -q "^  securities:$" "${lifecycle_out}/spec.yaml"
grep -q "^      mode: 'lifecycle_coverage'$" "${lifecycle_out}/spec.yaml"
grep -q "^      seed: 20260811$" "${lifecycle_out}/spec.yaml"
for trade_type in TMB TMS TLB TLS TSL; do
  grep -q "^        ${trade_type}: 1$" "${lifecycle_out}/spec.yaml"
done
grep -q "^        - quantity: 100$" "${lifecycle_out}/spec.yaml"
grep -q "^          weight: 3$" "${lifecycle_out}/spec.yaml"
grep -q "^        - quantity: 200$" "${lifecycle_out}/spec.yaml"
grep -q "^      cash_percent: 80$" "${lifecycle_out}/spec.yaml"
grep -q "^      lifo_percent: 50$" "${lifecycle_out}/spec.yaml"

if TIPOC_SECURITIES_ORDER_FLOW_MODE=lifecycle_coverage \
  TIPOC_SECURITIES_TSL_WEIGHT=0 \
  render_common --scale 1G --out "${task_tmp}/lifecycle-missing-type" 2>/dev/null; then
  echo "lifecycle render accepted a zero TSL weight" >&2
  exit 1
fi

if TIPOC_SECURITIES_ORDER_FLOW_SEED=20260811 \
  render_common --scale 1G --out "${task_tmp}/stale-order-flow" 2>/dev/null; then
  echo "default render accepted order-flow parameters without a mode" >&2
  exit 1
fi

if TIPOC_SECURITIES_ORDER_FLOW_MODE=explicit_mix \
  TIPOC_SECURITIES_SELL_PROBE_LIMIT=1025 \
  render_common --scale 1G --out "${task_tmp}/oversized-sell-probe" 2>/dev/null; then
  echo "order-flow render accepted an oversized sell probe limit" >&2
  exit 1
fi

attestation_path="${task_tmp}/deployment-attestation.json"
printf '{}\n' >"${attestation_path}"
attestation_pin="sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
enabled_out="${task_tmp}/enabled"
TIPOC_QUERY_COST_MODE=latency_and_statement_ru \
TIPOC_QUERY_COST_DEPLOYMENT_ATTESTATION_PATH="${attestation_path}" \
TIPOC_QUERY_COST_DEPLOYMENT_ATTESTATION_SHA256="${attestation_pin}" \
TIPOC_QUERY_COST_POLL_INTERVAL_SECONDS=5 \
TIPOC_QUERY_COST_POLL_TIMEOUT_SECONDS=2 \
TIPOC_QUERY_COST_ISOLATION_STATUS=verified_test_environment \
TIPOC_QUERY_COST_ISOLATION_REASON=dedicated_tiup_cluster_and_exclusive_campaign_process_audit \
render_common --scale 1G --out "${enabled_out}"

grep -q "^  query_cost:$" "${enabled_out}/spec.yaml"
grep -q "^    mode: 'latency_and_statement_ru'$" "${enabled_out}/spec.yaml"
grep -q "^    attempt_ru_source: 'off'$" "${enabled_out}/spec.yaml"
grep -q "^    poll_interval_seconds: 5$" "${enabled_out}/spec.yaml"
grep -q "^    poll_timeout_seconds: 2$" "${enabled_out}/spec.yaml"
grep -q "^      status: 'verified_test_environment'$" "${enabled_out}/spec.yaml"
grep -q "^      reason: 'dedicated_tiup_cluster_and_exclusive_campaign_process_audit'$" "${enabled_out}/spec.yaml"
grep -Fq "      path: '${attestation_path}'" "${enabled_out}/spec.yaml"
grep -Fq "      sha256: '${attestation_pin}'" "${enabled_out}/spec.yaml"

session_ru_out="${task_tmp}/session-ru"
TIPOC_QUERY_COST_MODE=latency_and_statement_ru \
TIPOC_QUERY_COST_ATTEMPT_RU_SOURCE=tidb_last_query_info \
TIPOC_QUERY_COST_ATTEMPT_RU_TIMEOUT_MILLISECONDS=321 \
TIPOC_QUERY_COST_ATTEMPT_RU_FAILURE_BUDGET=17 \
TIPOC_QUERY_COST_DEPLOYMENT_ATTESTATION_PATH="${attestation_path}" \
TIPOC_QUERY_COST_DEPLOYMENT_ATTESTATION_SHA256="${attestation_pin}" \
render_common --scale 1G --out "${session_ru_out}"

grep -q "^    attempt_ru_source: 'tidb_last_query_info'$" "${session_ru_out}/spec.yaml"
grep -q "^    attempt_ru_timeout_milliseconds: 321$" "${session_ru_out}/spec.yaml"
grep -q "^    attempt_ru_failure_budget: 17$" "${session_ru_out}/spec.yaml"

session_ru_defaults_out="${task_tmp}/session-ru-defaults"
TIPOC_QUERY_COST_MODE=latency_and_statement_ru \
TIPOC_QUERY_COST_ATTEMPT_RU_SOURCE=tidb_last_query_info \
TIPOC_QUERY_COST_DEPLOYMENT_ATTESTATION_PATH="${attestation_path}" \
TIPOC_QUERY_COST_DEPLOYMENT_ATTESTATION_SHA256="${attestation_pin}" \
render_common --scale 1G --out "${session_ru_defaults_out}"

grep -q "^    attempt_ru_timeout_milliseconds: 500$" "${session_ru_defaults_out}/spec.yaml"
grep -q "^    attempt_ru_failure_budget: 100$" "${session_ru_defaults_out}/spec.yaml"

if TIPOC_QUERY_COST_MODE=latency_and_statement_ru render_common --scale 1G --out "${task_tmp}/missing-attestation" 2>/dev/null; then
  echo "enabled render accepted missing attestation" >&2
  exit 1
fi

if TIPOC_QUERY_COST_DEPLOYMENT_ATTESTATION_PATH="${attestation_path}" \
  TIPOC_QUERY_COST_DEPLOYMENT_ATTESTATION_SHA256="${attestation_pin}" \
  render_common --scale 1G --out "${task_tmp}/stale-attestation" 2>/dev/null; then
  echo "disabled render accepted stale attestation" >&2
  exit 1
fi

if TIPOC_QUERY_COST_ATTEMPT_RU_SOURCE=tidb_last_query_info \
  render_common --scale 1G --out "${task_tmp}/stale-attempt-ru" 2>/dev/null; then
  echo "disabled render accepted stale attempt-RU settings" >&2
  exit 1
fi

if TIPOC_QUERY_COST_MODE=latency_only \
  TIPOC_QUERY_COST_ATTEMPT_RU_SOURCE=tidb_last_query_info \
  TIPOC_QUERY_COST_DEPLOYMENT_ATTESTATION_PATH="${attestation_path}" \
  TIPOC_QUERY_COST_DEPLOYMENT_ATTESTATION_SHA256="${attestation_pin}" \
  render_common --scale 1G --out "${task_tmp}/latency-only-session-ru" 2>/dev/null; then
  echo "latency-only render accepted a session-RU source" >&2
  exit 1
fi

if TIPOC_QUERY_COST_MODE=latency_and_statement_ru \
  TIPOC_QUERY_COST_ATTEMPT_RU_TIMEOUT_MILLISECONDS=500 \
  TIPOC_QUERY_COST_DEPLOYMENT_ATTESTATION_PATH="${attestation_path}" \
  TIPOC_QUERY_COST_DEPLOYMENT_ATTESTATION_SHA256="${attestation_pin}" \
  render_common --scale 1G --out "${task_tmp}/timeout-without-source" 2>/dev/null; then
  echo "attempt-RU timeout was accepted without a session-RU source" >&2
  exit 1
fi

if TIPOC_QUERY_COST_MODE=latency_and_statement_ru \
  TIPOC_QUERY_COST_ATTEMPT_RU_SOURCE=tidb_last_query_info \
  TIPOC_QUERY_COST_ATTEMPT_RU_TIMEOUT_MILLISECONDS=0 \
  TIPOC_QUERY_COST_DEPLOYMENT_ATTESTATION_PATH="${attestation_path}" \
  TIPOC_QUERY_COST_DEPLOYMENT_ATTESTATION_SHA256="${attestation_pin}" \
  render_common --scale 1G --out "${task_tmp}/zero-attempt-ru-timeout" 2>/dev/null; then
  echo "session-RU render accepted a zero timeout" >&2
  exit 1
fi

if TIPOC_QUERY_COST_MODE=latency_and_statement_ru \
  TIPOC_QUERY_COST_ATTEMPT_RU_SOURCE=tidb_last_query_info \
  TIPOC_QUERY_COST_ATTEMPT_RU_FAILURE_BUDGET=1000001 \
  TIPOC_QUERY_COST_DEPLOYMENT_ATTESTATION_PATH="${attestation_path}" \
  TIPOC_QUERY_COST_DEPLOYMENT_ATTESTATION_SHA256="${attestation_pin}" \
  render_common --scale 1G --out "${task_tmp}/oversized-attempt-ru-budget" 2>/dev/null; then
  echo "session-RU render accepted an oversized failure budget" >&2
  exit 1
fi

if TIPOC_QUERY_COST_MODE=latency_only \
  TIPOC_QUERY_COST_DEPLOYMENT_ATTESTATION_PATH="${attestation_path}" \
  TIPOC_QUERY_COST_DEPLOYMENT_ATTESTATION_SHA256=sha256:not-a-pin \
  render_common --scale 1G --out "${task_tmp}/bad-pin" 2>/dev/null; then
  echo "enabled render accepted invalid attestation pin" >&2
  exit 1
fi

if TIPOC_QUERY_COST_MODE=latency_and_statement_ru \
  TIPOC_QUERY_COST_DEPLOYMENT_ATTESTATION_PATH="${attestation_path}" \
  TIPOC_QUERY_COST_DEPLOYMENT_ATTESTATION_SHA256="${attestation_pin}" \
  TIPOC_QUERY_COST_POLL_INTERVAL_SECONDS=5 \
  TIPOC_QUERY_COST_POLL_TIMEOUT_SECONDS=5 \
  render_common --scale 1G --out "${task_tmp}/bad-poll-timeout" 2>/dev/null; then
  echo "enabled render accepted poll timeout equal to interval" >&2
  exit 1
fi

if TIPOC_QUERY_COST_MODE=latency_and_statement_ru \
  TIPOC_QUERY_COST_DEPLOYMENT_ATTESTATION_PATH="${attestation_path}" \
  TIPOC_QUERY_COST_DEPLOYMENT_ATTESTATION_SHA256="${attestation_pin}" \
  TIPOC_QUERY_COST_ISOLATION_STATUS=verified_test_environment \
  render_common --scale 1G --out "${task_tmp}/missing-isolation-reason" 2>/dev/null; then
  echo "enabled render accepted verified isolation without evidence reason" >&2
  exit 1
fi

echo "tipoc env render tests passed"
