#!/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

# Login to get token
echo "🔹 1. Authenticating..."
LOGIN_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}" \
  --data-urlencode "client_id=nexus" \
  --data-urlencode "client_secret=secret")

TOKEN=$(echo "$LOGIN_RESP" | jq -r '.access_token')

if [ "$TOKEN" == "null" ] || [ -z "$TOKEN" ]; then
    echo "❌ Authentication failed"
    echo "$LOGIN_RESP"
    exit 1
fi
echo "✅ Authenticated."

# Cleanup Pre-existing
echo "🔹 2. Cleaning up..."
# We can't easily bulk delete, so we'll just ignore for now or rely on unique names if needed.
# But for pagination test, we just need *enough* records.

# Create 15 Accounts
echo "🔹 3. creating 15 Test Accounts..."
START_TIME=$(date +%s)
BATCH_PREFIX="PaginatedAccount_${START_TIME}"

for i in {1..15}; do
    curl -s -X POST "$BASE_URL/services/data/v63.0/sobjects/Account" \
      -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json" \
      -H "Origin: ${FRONTEND_ORIGIN}" \
      -d "{\"Name\": \"${BATCH_PREFIX}_${i}\"}" > /dev/null
done
echo "✅ Created 15 accounts."

# Query First Page
echo "🔹 4. Querying Page 1 (Limit 5)..."
QUERY="SELECT Id, Name FROM Account WHERE Name LIKE '${BATCH_PREFIX}%' ORDER BY Name"
ENCODED_QUERY=$(python3 -c "import urllib.parse; print(urllib.parse.quote(\"$QUERY\"))")

PAGE1=$(curl -s -G "$BASE_URL/services/data/v63.0/query" \
  --data-urlencode "q=$QUERY" \
  --data-urlencode "limit=5" \
  -H "Authorization: Bearer $TOKEN")

echo "$PAGE1" | jq . > page1.json

COUNT1=$(echo "$PAGE1" | jq '.records | length')
DONE1=$(echo "$PAGE1" | jq '.done')
NEXT1=$(echo "$PAGE1" | jq -r '.nextRecordsUrl')

echo "Page 1: Count=$COUNT1, Done=$DONE1"
if [ "$COUNT1" -ne 5 ]; then
    echo "❌ Page 1 count mismatch. Expected 5, got $COUNT1"
    exit 1
fi
if [ "$DONE1" != "false" ]; then
    echo "❌ Page 1 should NOT be done"
    exit 1
fi
if [ "$NEXT1" == "null" ]; then
    echo "❌ Page 1 missing nextRecordsUrl"
    exit 1
fi

# Follow Next URL
echo "🔹 5. Querying Page 2..."
# Extract path from nextRecordsUrl (it might contain domain or just path)
# Our backend returns full path string "/services/..."
# curl will need full URL
NEXT_URL="${BASE_URL}${NEXT1}"

PAGE2=$(curl -s "$NEXT_URL" -H "Authorization: Bearer $TOKEN")
echo "$PAGE2" | jq . > page2.json

COUNT2=$(echo "$PAGE2" | jq '.records | length')
DONE2=$(echo "$PAGE2" | jq '.done')
NEXT2=$(echo "$PAGE2" | jq -r '.nextRecordsUrl')

echo "Page 2: Count=$COUNT2, Done=$DONE2"
if [ "$COUNT2" -ne 5 ]; then
    echo "❌ Page 2 count mismatch. Expected 5, got $COUNT2"
    exit 1
fi
if [ "$DONE2" != "false" ]; then
    echo "❌ Page 2 should NOT be done"
    exit 1
fi

# Follow Third URL
echo "🔹 6. Querying Page 3 (Final)..."
NEXT_URL_2="${BASE_URL}${NEXT2}"
PAGE3=$(curl -s "$NEXT_URL_2" -H "Authorization: Bearer $TOKEN")
echo "$PAGE3" | jq . > page3.json

COUNT3=$(echo "$PAGE3" | jq '.records | length')
DONE3=$(echo "$PAGE3" | jq '.done')
NEXT3=$(echo "$PAGE3" | jq -r '.nextRecordsUrl')

echo "Page 3: Count=$COUNT3, Done=$DONE3"
if [ "$COUNT3" -ne 5 ]; then
    echo "❌ Page 3 count mismatch. Expected 5, got $COUNT3"
    exit 1
fi
if [ "$DONE3" != "true" ]; then
    echo "❌ Page 3 SHOULD be done"
    exit 1
fi
if [ "$NEXT3" != "null" ]; then
    echo "❌ Page 3 should NOT have nextRecordsUrl"
    exit 1
fi

echo "✅ PAGINATION VERIFIED SUCCESSFULLY"
