#!/bin/bash
# Otto Governance — Full curl test suite (Tests 1–8)
# Base URL: https://projectlando.net/genie/  Endpoint: fitment/fitment_check.php
# Usage: ./test_fitment_otto_governance.sh

set -e
BASE_URL="${BASE_URL:-https://projectlando.net/genie}"
ENDPOINT="${BASE_URL}/fitment/fitment_check.php?debug=1"
FAIL=0

# Require jq
if ! command -v jq &>/dev/null; then
  echo "jq is required. Install jq or run in an environment that has it."
  exit 1
fi

# Use curl (not PowerShell alias)
CURL="curl"
if command -v curl.exe &>/dev/null; then
  CURL="curl.exe"
fi

echo ""
echo "=== Otto Governance Test Suite (curl) ==="
echo "Endpoint: $ENDPOINT"
echo ""

# ---- TEST 1 — Advisory Fallback (Primary Token Budget) ----
echo "--- TEST 1 — Advisory Fallback (2012 Ford Mustang, product 8339516915955) ---"
R1=$($CURL -s -X POST "$ENDPOINT" -H "Content-Type: application/json" -d '{
  "product_id": 8339516915955,
  "vehicle": { "year": 2012, "make": "Ford", "model": "Mustang" }
}')
if echo "$R1" | jq -e . &>/dev/null; then
  BAND=$(echo "$R1" | jq -r '.confidence_band // empty')
  CONF=$(echo "$R1" | jq -r '.confidence // 0')
  LLM=$(echo "$R1" | jq -r '.llm_used // .llm.used // false')
  TOK=$(echo "$R1" | jq -r '.llm.usage.tokens_total // .llm_tokens_total // 0')
  PASS1=
  if [[ "$BAND" == "advisory" ]]; then PASS1=1; fi
  if [[ -z "$PASS1" ]]; then echo "  FAIL: confidence_band expected advisory, got: $BAND"; FAIL=1; fi
  if awk -v c="$CONF" 'BEGIN { exit (c+0 > 0.75) ? 1 : 0 }' 2>/dev/null; then echo "  FAIL: confidence must be <= 0.75, got: $CONF"; FAIL=1; fi
  if [[ "$LLM" != "true" ]]; then echo "  FAIL: llm_used expected true, got: $LLM"; FAIL=1; fi
  if [[ -n "$TOK" && "$TOK" != "null" && "$TOK" -gt 400 ]]; then
    echo "  FAIL: Total tokens must be < 400, got: $TOK"
    echo "  Report: prompt_tokens=$(echo "$R1" | jq -r '.llm.usage.tokens_prompt // .llm.usage.prompt_tokens // "n/a"') completion_tokens=$(echo "$R1" | jq -r '.llm.usage.tokens_completion // .llm.usage.completion_tokens // "n/a"') total_tokens=$TOK"
    FAIL=1
  fi
  if [[ $FAIL -eq 0 ]]; then echo "  PASS (confidence_band=$BAND, confidence=$CONF, llm_used=$LLM, tokens=$TOK)"; fi
else
  echo "  FAIL: Invalid JSON or non-2xx (e.g. 404). Response: $R1"
  FAIL=1
fi
echo ""

# ---- TEST 2 — Deterministic Match / No LLM ----
echo "--- TEST 2 — Deterministic Match (2018 Ford Mustang, product 8340087177459) ---"
R2=$($CURL -s -X POST "$ENDPOINT" -H "Content-Type: application/json" -d '{
  "product_id": 8340087177459,
  "vehicle": { "year": 2018, "make": "Ford", "model": "Mustang" }
}')
if echo "$R2" | jq -e . &>/dev/null; then
  BAND=$(echo "$R2" | jq -r '.confidence_band // empty')
  CONF=$(echo "$R2" | jq -r '.confidence // 0')
  LLM=$(echo "$R2" | jq -r '.llm_used // .llm.used // false')
  PASS2=1
  if [[ "$BAND" != "verified" ]]; then echo "  FAIL: confidence_band expected verified, got: $BAND"; PASS2=0; FAIL=1; fi
  if [[ "$CONF" != "1" ]]; then echo "  FAIL: confidence expected 1, got: $CONF"; PASS2=0; FAIL=1; fi
  if [[ "$LLM" == "true" ]]; then echo "  FAIL: llm_used must be false (deterministic), got: $LLM"; PASS2=0; FAIL=1; fi
  if [[ $PASS2 -eq 1 ]]; then echo "  PASS (confidence_band=$BAND, confidence=$CONF, llm_used=$LLM)"; fi
else
  echo "  FAIL: Invalid JSON. Response: $R2"
  FAIL=1
fi
echo ""

# ---- TEST 3 — Missing Year → invalid_input ----
echo "--- TEST 3 — Missing Year Validation (product 8382847287539) ---"
R3=$($CURL -s -X POST "$ENDPOINT" -H "Content-Type: application/json" -d '{
  "product_id": 8382847287539,
  "vehicle": { "make": "Ford", "model": "Mustang" }
}')
if echo "$R3" | jq -e . &>/dev/null; then
  STATUS=$(echo "$R3" | jq -r '.status // empty')
  if [[ "$STATUS" == "invalid_input" ]]; then
    echo "  PASS (status=invalid_input, no LLM call expected)"
  else
    echo "  FAIL: expected status=invalid_input, got: $STATUS"
    FAIL=1
  fi
else
  echo "  FAIL: Invalid JSON. Response: $R3"
  FAIL=1
fi
echo ""

# ---- TEST 4 — Engine Suppression (no engine in request) ----
echo "--- TEST 4 — Engine Suppression (2015 Ford Mustang, no engine, product 9052351496435) ---"
R4=$($CURL -s -X POST "$ENDPOINT" -H "Content-Type: application/json" -d '{
  "product_id": 9052351496435,
  "vehicle": { "year": 2015, "make": "Ford", "model": "Mustang" }
}')
if echo "$R4" | jq -e . &>/dev/null; then
  BAND=$(echo "$R4" | jq -r '.confidence_band // empty')
  RAW=$(echo "$R4" | jq -r '.llm.raw_text // ""'); SUMMARY=$(echo "$R4" | jq -r '.analysis_summary // .explanation.summary // ""')
  COMBINED="$RAW $SUMMARY"
  BAD=
  if echo "$COMBINED" | grep -qiE "V6|V8|2\.3L|5\.0L"; then BAD=1; fi
  if [[ -n "$BAD" ]]; then
    echo "  FAIL: Response must not mention V6, V8, 2.3L, 5.0L (no engine inference)"
    FAIL=1
  elif [[ "$BAND" != "advisory" ]]; then
    echo "  FAIL: confidence_band expected advisory, got: $BAND"
    FAIL=1
  else
    echo "  PASS (confidence_band=advisory, no engine inference)"
  fi
else
  echo "  FAIL: Invalid JSON. Response: $R4"
  FAIL=1
fi
echo ""

# ---- TEST 5 — Engine Provided (propagation) ----
echo "--- TEST 5 — Engine Provided (2.3L EcoBoost, product 9081652445427) ---"
R5=$($CURL -s -X POST "$ENDPOINT" -H "Content-Type: application/json" -d '{
  "product_id": 9081652445427,
  "vehicle": { "year": 2015, "make": "Ford", "model": "Mustang", "engine": "2.3L EcoBoost" }
}')
if echo "$R5" | jq -e . &>/dev/null; then
  DBG_ENG=$(echo "$R5" | jq -r '.debug_vehicle_engine // empty')
  BAND=$(echo "$R5" | jq -r '.confidence_band // empty')
  PASS5=1
  if [[ "$DBG_ENG" != "2.3L EcoBoost" ]]; then echo "  FAIL: debug_vehicle_engine expected \"2.3L EcoBoost\", got: $DBG_ENG"; PASS5=0; FAIL=1; fi
  if [[ "$BAND" == "verified" ]]; then echo "  FAIL: LLM must never return verified for this case"; PASS5=0; FAIL=1; fi
  if [[ $PASS5 -eq 1 ]]; then echo "  PASS (debug_vehicle_engine=2.3L EcoBoost, confidence_band=$BAND, engine only from request)"; fi
else
  echo "  FAIL: Invalid JSON. Response: $R5"
  FAIL=1
fi
echo ""

# ---- TEST 6 — VIN Deterministic (no LLM) ----
echo "--- TEST 6 — VIN Deterministic Lock (vin=1FA6P8THXP5102656, product 8339516915955) ---"
R6=$($CURL -s -X POST "$ENDPOINT&vin=1FA6P8THXP5102656" -H "Content-Type: application/json" -d '{ "product_id": 8339516915955 }')
if echo "$R6" | jq -e . &>/dev/null; then
  MODE=$(echo "$R6" | jq -r '.request_mode // empty')
  LLM=$(echo "$R6" | jq -r '.llm_used // .llm.used // false')
  if [[ "$MODE" != "vin" ]]; then echo "  FAIL: request_mode expected vin, got: $MODE"; FAIL=1; fi
  if [[ "$LLM" == "true" ]]; then echo "  FAIL: llm_used must be false for VIN path"; FAIL=1; fi
  if [[ "$MODE" == "vin" && "$LLM" != "true" ]]; then echo "  PASS (request_mode=vin, llm_used=$LLM, deterministic only)"; fi
else
  echo "  FAIL: Invalid JSON. Response: $R6"
  FAIL=1
fi
echo ""

# ---- TEST 7 — Token Ceiling (stress; may hit 400+ and unknown) ----
echo "--- TEST 7 — Token Ceiling Enforcement (2011 Ford Mustang, product 9052351496435) ---"
R7=$($CURL -s -X POST "$ENDPOINT" -H "Content-Type: application/json" -d '{
  "product_id": 9052351496435,
  "vehicle": { "year": 2011, "make": "Ford", "model": "Mustang" }
}')
if echo "$R7" | jq -e . &>/dev/null; then
  STATUS=$(echo "$R7" | jq -r '.status // empty')
  CONF=$(echo "$R7" | jq -r '.confidence // empty')
  BAND=$(echo "$R7" | jq -r '.confidence_band // empty')
  SUMMARY=$(echo "$R7" | jq -r '.analysis_summary // empty')
  TOK=$(echo "$R7" | jq -r '.llm.usage.tokens_total // .llm_tokens_total // 0')
  if [[ -n "$TOK" && "$TOK" != "null" && "$TOK" -gt 400 ]]; then
    if [[ "$STATUS" == "unknown" && "$BAND" == "advisory" && "$SUMMARY" == "Insufficient data to determine fitment." ]]; then
      echo "  PASS (tokens exceeded 400 → status=unknown, advisory, expected summary; server should log [OTTO TOKEN LIMIT EXCEEDED])"
    else
      echo "  FAIL: Tokens=$TOK > 400 but response should be status=unknown, confidence=0.5, advisory, analysis_summary='Insufficient data to determine fitment.'"
      echo "        got status=$STATUS confidence=$CONF band=$BAND summary=$SUMMARY"
      FAIL=1
    fi
  else
    echo "  PASS (tokens=$TOK <= 400; if tokens were >400, server must log [OTTO TOKEN LIMIT EXCEEDED])"
  fi
else
  echo "  FAIL: Invalid JSON. Response: $R7"
  FAIL=1
fi
echo ""

# ---- TEST 8 — Multi-Product Advisory Sweep ----
echo "--- TEST 8 — Multi-Product Advisory Sweep (2012 Ford Mustang across all 5 products) ---"
PRODUCTS=(8339516915955 8340087177459 8382847287539 9052351496435 9081652445427)
SWEEP_FAIL=0
for PID in "${PRODUCTS[@]}"; do
  R=$($CURL -s -X POST "$ENDPOINT" -H "Content-Type: application/json" -d "{
    \"product_id\": $PID,
    \"vehicle\": { \"year\": 2012, \"make\": \"Ford\", \"model\": \"Mustang\" }
  }")
  if ! echo "$R" | jq -e . &>/dev/null; then
    echo "  Product $PID: FAIL (invalid JSON)"
    SWEEP_FAIL=1
    continue
  fi
  LLM=$(echo "$R" | jq -r '.llm_used // .llm.used // false')
  CONF=$(echo "$R" | jq -r '.confidence // 0')
  BAND=$(echo "$R" | jq -r '.confidence_band // empty')
  TOK=$(echo "$R" | jq -r '.llm.usage.tokens_total // .llm_tokens_total // 0')
  BAD=0
  if [[ "$LLM" == "true" && "$CONF" == "1" ]]; then echo "  Product $PID: FAIL (llm_used=true AND confidence=1)"; BAD=1; fi
  if [[ "$LLM" == "true" && "$BAND" == "verified" ]]; then echo "  Product $PID: FAIL (llm_used=true AND confidence_band=verified)"; BAD=1; fi
  if [[ -n "$TOK" && "$TOK" != "null" && "$TOK" -gt 400 ]]; then
    echo "  Product $PID: FAIL (total_tokens=$TOK must be < 400)"
    echo "    prompt_tokens=$(echo "$R" | jq -r '.llm.usage.tokens_prompt // .llm.usage.prompt_tokens') completion_tokens=$(echo "$R" | jq -r '.llm.usage.tokens_completion // .llm.usage.completion_tokens') total_tokens=$TOK"
    BAD=1
  fi
  if [[ $BAD -eq 0 ]]; then echo "  Product $PID: PASS (llm_used=$LLM confidence=$CONF band=$BAND tokens=$TOK)"; fi
  if [[ $BAD -eq 1 ]]; then SWEEP_FAIL=1; FAIL=1; fi
done
echo ""

# ---- Summary ----
echo "=== Summary ==="
if [[ $FAIL -ne 0 ]]; then
  echo "One or more tests FAILED."
  exit 1
fi
echo "All tests PASSED. For advisory fallback: total tokens should be < 400 (ideal 280–350)."
echo "If any advisory call exceeded 400, check server logs for [OTTO TOKEN LIMIT EXCEEDED] and report prompt_tokens, completion_tokens, total_tokens, prompt char length for further compression."
exit 0
