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

LOCAL_BASE_URL="${LOCAL_BASE_URL:-http://127.0.0.1:20128}"
CLOUD_BASE_URL="${CLOUD_BASE_URL:-https://routiform.com/v1}"
MODEL="${MODEL:-kr/claude-sonnet-4.5}"
STREAM_MODE="${STREAM_MODE:-false}"
MAX_RETRIES="${MAX_RETRIES:-6}"
RETRY_DELAY_SECONDS="${RETRY_DELAY_SECONDS:-3}"
TIMEOUT_SECONDS="${TIMEOUT_SECONDS:-45}"

LOCAL_KEYS_URL="${LOCAL_BASE_URL%/}/api/keys"
LOCAL_SYNC_URL="${LOCAL_BASE_URL%/}/api/sync/cloud"
CLOUD_CHAT_URL="${CLOUD_BASE_URL%/}/chat/completions"

echo "[1/5] Creating local API key"
KEY_NAME="cloud-e2e-$(date +%s)"
CREATE_RESP="$(curl -sS -m "${TIMEOUT_SECONDS}" -X POST "${LOCAL_KEYS_URL}" \
  -H 'Content-Type: application/json' \
  --data "{\"name\":\"${KEY_NAME}\"}")"

API_KEY="$(echo "${CREATE_RESP}" | jq -r '.key // empty')"
if [[ -z "${API_KEY}" || "${API_KEY}" == "null" ]]; then
  echo "FAIL: could not create local API key"
  echo "Response: ${CREATE_RESP}"
  exit 1
fi
echo "      Key created: ${API_KEY:0:12}...${API_KEY: -6}"

echo "[2/5] Enabling cloud mode"
ENABLE_CODE="$(curl -sS -m "${TIMEOUT_SECONDS}" -o /tmp/cloud_enable_e2e.json -w '%{http_code}' \
  -X POST "${LOCAL_SYNC_URL}" \
  -H 'Content-Type: application/json' \
  --data '{"action":"enable"}' || true)"
echo "      enable status: ${ENABLE_CODE}"
cat /tmp/cloud_enable_e2e.json; echo
if [[ ! "${ENABLE_CODE}" =~ ^2 ]]; then
  echo "FAIL: cloud enable failed"
  exit 1
fi

echo "[3/5] Running explicit sync"
SYNC_CODE="$(curl -sS -m "${TIMEOUT_SECONDS}" -o /tmp/cloud_sync_e2e.json -w '%{http_code}' \
  -X POST "${LOCAL_SYNC_URL}" \
  -H 'Content-Type: application/json' \
  --data '{"action":"sync"}' || true)"
echo "      sync status: ${SYNC_CODE}"
cat /tmp/cloud_sync_e2e.json; echo
if [[ ! "${SYNC_CODE}" =~ ^2 ]]; then
  echo "FAIL: cloud sync failed"
  exit 1
fi

build_payload() {
  local stream_flag="$1"
  cat <<JSON
{
  "model": "${MODEL}",
  "stream": ${stream_flag},
  "messages": [
    {"role":"user","content":"Reply with exactly: CLOUD_OK"}
  ],
  "max_tokens": 64
}
JSON
}

PAYLOAD="$(build_payload "${STREAM_MODE}")"

echo "[4/5] Testing cloud OpenAI-compatible endpoint with retry (stream=${STREAM_MODE})"
SUCCESS=0
for ATTEMPT in $(seq 1 "${MAX_RETRIES}"); do
  CODE="$(curl -sS -m "${TIMEOUT_SECONDS}" -o /tmp/cloud_chat_e2e.json -w '%{http_code}' \
    -X POST "${CLOUD_CHAT_URL}" \
    -H "Authorization: Bearer ${API_KEY}" \
    -H 'Content-Type: application/json' \
    --data "${PAYLOAD}" || true)"
  echo "      attempt ${ATTEMPT}/${MAX_RETRIES}: HTTP ${CODE}"
  cat /tmp/cloud_chat_e2e.json; echo

  if [[ "${CODE}" =~ ^2 ]]; then
    SUCCESS=1
    break
  fi

  sleep "${RETRY_DELAY_SECONDS}"
done

echo "[5/5] Result"
if [[ "${SUCCESS}" -eq 1 ]]; then
  echo "PASS: cloud endpoint accepted synced key"
  exit 0
fi

echo "Primary test failed. Trying fallback with stream=true to distinguish key/auth issues..."
PAYLOAD_STREAM_TRUE="$(build_payload "true")"
FALLBACK_CODE="$(curl -sS -m "${TIMEOUT_SECONDS}" -o /tmp/cloud_chat_e2e_fallback.json -w '%{http_code}' \
  -X POST "${CLOUD_CHAT_URL}" \
  -H "Authorization: Bearer ${API_KEY}" \
  -H 'Content-Type: application/json' \
  --data "${PAYLOAD_STREAM_TRUE}" || true)"
echo "      fallback stream=true HTTP ${FALLBACK_CODE}"
cat /tmp/cloud_chat_e2e_fallback.json; echo

if [[ "${FALLBACK_CODE}" =~ ^2 ]]; then
  echo "PARTIAL PASS: API key is valid and cloud works with stream=true; stream=false path appears broken upstream."
  exit 2
fi

echo "FAIL: cloud endpoint still failing after sync/retries (including stream=true fallback)"
exit 1
