#!/bin/bash
# E2E API Test Runner
# Usage: bash run_tests.sh [flow|negative|regression|all]

set -e

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BASE_URL="${NEXUSCRM_URL:-http://127.0.0.1:3001}"
TOKEN=""

# Authenticate
auth() {
  TOKEN=$(curl -s -X POST "$BASE_URL/services/oauth2/token" \
    -H "Content-Type: application/x-www-form-urlencoded" \
    --data-urlencode "grant_type=password" \
    --data-urlencode "username=${NEXUSCRM_USERNAME:-admin@test.com}" \
    --data-urlencode "password=${NEXUSCRM_PASSWORD:-${NEXUS_ADMIN_PASSWORD:-}}" \
    --data-urlencode "client_id=test-gosf-client" \
    --data-urlencode "client_secret=test-gosf-secret-123" \
    | python3 -c "import sys,json; print(json.load(sys.stdin).get('access_token',''))")
  if [ -z "$TOKEN" ]; then
    echo "ERROR: Auth failed, no token"
    exit 1
  fi
  echo "Auth OK"
}

# Make API call
api() {
  local method="$1"
  local path="$2"
  local data="$3"
  local extra="${4:-}"

  local cmd="curl -s -X $method $BASE_URL$path \
    -H 'Authorization: Bearer $TOKEN' \
    -H 'Content-Type: application/json'"
  [ -n "$data" ] && cmd="$cmd -d '$data'"
  [ -n "$extra" ] && cmd="$cmd $extra"

  eval "$cmd"
}

# Parse JSON field
jget() {
  echo "$1" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('$2',''))"
}

echo "=== NexusCRM E2E API Tests ==="
echo "Base URL: $BASE_URL"
auth

MODE="${1:-all}"

# --- Flow A: Lead to Cash ---
if [ "$MODE" = "flow" ] || [ "$MODE" = "all" ]; then
  echo ""
  echo "=== Flow A: Lead to Cash ==="

  # A1: Create Lead
  echo "[A1] Create Lead..."
  LEAD=$(api POST "/uiapi/records/Lead" '{"LastName":"Test Lead","Company":"Test Co","Email":"test@example.com","Status":"OPEN"}')
  LEAD_ID=$(jget "$LEAD" "id")
  echo "  Lead ID: $LEAD_ID"

  # A2: Create Account
  echo "[A2] Create Account..."
  ACCT=$(api POST "/uiapi/records/Account" '{"Name":"Test Account","Industry":"Technology"}')
  ACCT_ID=$(jget "$ACCT" "id")
  echo "  Account ID: $ACCT_ID"

  # A3: Create Opportunity
  echo "[A3] Create Opportunity..."
  OPP=$(api POST "/uiapi/records/Opportunity" "{\"Name\":\"Test Opp\",\"StageName\":\"PROSPECTING\",\"Amount\":50000,\"CloseDate\":\"2026-12-31\",\"AccountId\":\"$ACCT_ID\"}")
  OPP_ID=$(jget "$OPP" "id")
  echo "  Opportunity ID: $OPP_ID"

  # A4: Create Quote from Opportunity
  echo "[A4] Create Quote from Opportunity..."
  QUOTE=$(api POST "/uiapi/records/Quote" "{\"Name\":\"Test Quote\",\"OpportunityId\":\"$OPP_ID\",\"Status\":\"Draft\"}")
  QUOTE_ID=$(jget "$QUOTE" "id")
  echo "  Quote ID: $QUOTE_ID"

  # A5: Query Quote - verify Status populated
  echo "[A5] Verify Quote Status..."
  QUOTE_Q=$(api GET "/uiapi/records/Quote/$QUOTE_ID" "")
  QUOTE_STATUS=$(jget "$QUOTE_Q" "Status")
  echo "  Quote Status: $QUOTE_STATUS (expected: Draft or non-empty)"

  # A6: Create Order from Quote
  echo "[A6] Create Order from Quote..."
  ORDER=$(api POST "/uiapi/records/Order" "{\"AccountId\":\"$ACCT_ID\",\"QuoteId\":\"$QUOTE_ID\",\"EffectiveDate\":\"2026-04-15\",\"Status\":\"Draft\"}")
  ORDER_ID=$(jget "$ORDER" "id")
  echo "  Order ID: $ORDER_ID"

  echo ""
  echo "Flow A PASSED"
fi

# --- Negative Tests ---
if [ "$MODE" = "negative" ] || [ "$MODE" = "all" ]; then
  echo ""
  echo "=== Negative Tests ==="

  echo "[N1] Create empty Lead (expect 400)..."
  RESP=$(api POST "/uiapi/records/Lead" '{}' "-w" "\n%{http_code}")
  CODE=$(echo "$RESP" | tail -1)
  if [ "$CODE" = "400" ]; then
    echo "  PASS: Got 400"
  else
    echo "  FAIL: Got $CODE (expected 400)"
  fi

  echo "[N2] Create Lead without LastName (expect 400)..."
  RESP=$(api POST "/uiapi/records/Lead" '{"Company":"Test"}' "-w" "\n%{http_code}")
  CODE=$(echo "$RESP" | tail -1)
  if [ "$CODE" = "400" ]; then
    echo "  PASS: Got 400"
  else
    echo "  FAIL: Got $CODE (expected 400)"
  fi

  echo "[N3] Verify Status=OPEN mapping..."
  LEAD=$(api POST "/uiapi/records/Lead" '{"LastName":"Status Test","Company":"Co","Status":"OPEN"}')
  LEAD_ID=$(jget "$LEAD" "id")
  sleep 1
  LEAD_Q=$(api GET "/uiapi/records/Lead/$LEAD_ID" "")
  STATUS=$(jget "$LEAD_Q" "Status")
  if [ "$STATUS" = "OPEN" ]; then
    echo "  PASS: Status is OPEN"
  else
    echo "  FAIL: Status is '$STATUS' (expected OPEN)"
  fi

  echo "Negative tests DONE"
fi

echo ""
echo "=== All tests completed ==="
