#!/bin/bash
set -euo pipefail

PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${PROJECT_ROOT}/scripts/runtime-env.sh"
nexus_export_runtime_env "${PROJECT_ROOT}"

BASE_URL="${BASE_URL:-${API_BASE_URL}}"
FRONTEND_ORIGIN="${FRONTEND_ORIGIN:-${FRONTEND_URL}}"
EMAIL="${EMAIL:-admin@test.com}"
PASSWORD="${PASSWORD:-${NEXUS_ADMIN_PASSWORD:-}}"
if [ -z "${PASSWORD:-}" ]; then
  echo "❌ PASSWORD env var is required. Export it before running this script." >&2
  exit 1
fi

echo "🔹 1. Authenticating..."
TOKEN_RESP=$(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=$EMAIL" \
  --data-urlencode "password=$PASSWORD")

TOKEN=$(echo $TOKEN_RESP | jq -r .access_token)

if [ "$TOKEN" == "null" ] || [ -z "$TOKEN" ]; then
  echo "❌ Authentication Failed: $TOKEN_RESP"
  exit 1
fi
echo "✅ Authenticated. Token: ${TOKEN:0:10}..."

echo "🔹 2. Verifying GET /parameterizedSearch (q=Strict)..."
GET_RESP=$(curl -s -X GET "$BASE_URL/services/data/v63.0/parameterizedSearch?q=Strict" \
  -H "Authorization: Bearer $TOKEN")

echo "$GET_RESP" | jq . > get_results.json

# Check for searchRecords
COUNT=$(echo "$GET_RESP" | jq '.searchRecords | length')
if [ "$COUNT" -gt 0 ]; then
  echo "✅ GET Parameterized Search Success: Found $COUNT records"
  echo "$GET_RESP" | jq '.searchRecords[0]'
else 
  echo "⚠️  GET Parameterized Search returned 0 records (Verify data exists?)"
  echo "Response: $GET_RESP"
fi

echo "🔹 3. Verifying POST /parameterizedSearch..."
POST_BODY='{
    "q": "Strict",
    "sobjects": [
        {"name": "Account"},
        {"name": "Contact"}
    ]
}'

POST_RESP=$(curl -s -X POST "$BASE_URL/services/data/v63.0/parameterizedSearch" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -H "Origin: ${FRONTEND_ORIGIN}" \
  -d "$POST_BODY")

echo "$POST_RESP" | jq . > post_results.json

COUNT_POST=$(echo "$POST_RESP" | jq '.searchRecords | length')
if [ "$COUNT_POST" -gt 0 ]; then
  echo "✅ POST Parameterized Search Success: Found $COUNT_POST records"
  echo "$POST_RESP" | jq '.searchRecords[0]'
else
  echo "⚠️  POST Parameterized Search returned 0 records"
  echo "Response: $POST_RESP"
fi

# Verify Structure Strictness
# Check for 'attributes' and PascalCase 'Id'
ATTR_CHECK=$(echo "$POST_RESP" | jq '.searchRecords[0] | has("attributes")')
ID_CHECK=$(echo "$POST_RESP" | jq '.searchRecords[0] | has("Id")')

if [ "$ATTR_CHECK" == "true" ] && [ "$ID_CHECK" == "true" ]; then
    echo "✅ STRICT ALIGNMENT CONFIRMED: 'attributes' and 'Id' present."
else
    echo "❌ STRICT ALIGNMENT FAILED: Check fields."
    echo "Has attributes: $ATTR_CHECK"
    echo "Has Id: $ID_CHECK"
    exit 1
fi

echo "🔹 4. Verifying POST Field Projection (Strict Support)..."
PROJ_BODY='{
    "q": "Strict",
    "sobjects": [
        {"name": "Account", "fields": ["Id", "Name"]},
        {"name": "Contact", "fields": ["Id", "Email"]}
    ]
}'

PROJ_RESP=$(curl -s -X POST "$BASE_URL/services/data/v63.0/parameterizedSearch" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -H "Origin: ${FRONTEND_ORIGIN}" \
  -d "$PROJ_BODY")

echo "$PROJ_RESP" | jq . > proj_results.json

# Logic: If we requested Email for Contact, it should be in the response (if empty string/null, key might still be there).
# Note: Go zero values might omit empty fields if omitempty is set. But typically fields map has keys.
COUNT_PROJ=$(echo "$PROJ_RESP" | jq '.searchRecords | length')
echo "✅ Projection Search Success: Found $COUNT_PROJ records"
echo "$PROJ_RESP" | jq '.searchRecords[] | select(.attributes.type == "Contact")'
