#!/usr/bin/env bash
# cf-render.sh — Cloudflare Browser Rendering wrapper
# Usage:
#   cf-render.sh <url>                        # markdown (default)
#   cf-render.sh <url> markdown|json|content|screenshot|links|scrape|crawl
#   cf-render.sh <url> json '{"prompt":"Extract product pricing"}'
#   cf-render.sh <url> crawl '{"maxPages":10,"maxDepth":2}'
#
# Env: CF_BR_TOKEN, CF_BR_ACCOUNT (or reads from /home/clawd/secrets/cloudflare/)

set -euo pipefail

URL="${1:?Usage: cf-render.sh <url> [endpoint] [extra_json]}"
ENDPOINT="${2:-markdown}"
EXTRA="${3:-}"

CF_TOKEN="${CF_BR_TOKEN:-$(cat /home/clawd/secrets/cloudflare/api_token 2>/dev/null)}"
CF_ACCOUNT="${CF_BR_ACCOUNT:-$(cat /home/clawd/secrets/cloudflare/account_id 2>/dev/null)}"

if [[ -z "$CF_TOKEN" || -z "$CF_ACCOUNT" ]]; then
  echo "ERROR: Missing Cloudflare credentials" >&2
  exit 1
fi

BASE="https://api.cloudflare.com/client/v4/accounts/${CF_ACCOUNT}/browser-rendering"

# Build JSON body
if [[ -n "$EXTRA" ]]; then
  # Merge url into extra JSON
  BODY=$(echo "$EXTRA" | jq --arg url "$URL" '. + {url: $url}')
else
  BODY=$(jq -n --arg url "$URL" '{url: $url}')
fi

# Crawl endpoint uses POST to start, returns job ID
if [[ "$ENDPOINT" == "crawl" ]]; then
  # Start crawl job
  RESPONSE=$(curl -s -w "\n%{http_code}" \
    "${BASE}/crawl" \
    -H "Authorization: Bearer ${CF_TOKEN}" \
    -H "Content-Type: application/json" \
    -d "$BODY")
  
  HTTP_CODE=$(echo "$RESPONSE" | tail -1)
  BODY_RESP=$(echo "$RESPONSE" | sed '$d')
  
  if [[ "$HTTP_CODE" != "200" ]]; then
    echo "ERROR (HTTP $HTTP_CODE): $BODY_RESP" >&2
    exit 1
  fi
  
  # Extract job ID and poll
  JOB_ID=$(echo "$BODY_RESP" | jq -r '.result.id // .id // empty')
  if [[ -z "$JOB_ID" ]]; then
    echo "$BODY_RESP"
    exit 0
  fi
  
  echo "Crawl started: $JOB_ID" >&2
  
  # Poll for completion (max 60 attempts, 5s apart = 5 min)
  for i in $(seq 1 60); do
    sleep 5
    STATUS_RESP=$(curl -s \
      "${BASE}/crawl/${JOB_ID}" \
      -H "Authorization: Bearer ${CF_TOKEN}")
    
    STATUS=$(echo "$STATUS_RESP" | jq -r '.result.status // .status // "unknown"')
    echo "  Poll $i: $STATUS" >&2
    
    if [[ "$STATUS" == "complete" || "$STATUS" == "completed" ]]; then
      echo "$STATUS_RESP" | jq '.result'
      exit 0
    elif [[ "$STATUS" == "failed" || "$STATUS" == "error" ]]; then
      echo "ERROR: Crawl failed" >&2
      echo "$STATUS_RESP" | jq '.'
      exit 1
    fi
  done
  
  echo "TIMEOUT: Crawl still running after 5 min. Job ID: $JOB_ID" >&2
  exit 1
fi

# All other endpoints — simple POST
RESPONSE=$(curl -s -w "\n%{http_code}" \
  "${BASE}/${ENDPOINT}" \
  -H "Authorization: Bearer ${CF_TOKEN}" \
  -H "Content-Type: application/json" \
  -d "$BODY")

HTTP_CODE=$(echo "$RESPONSE" | tail -1)
BODY_RESP=$(echo "$RESPONSE" | sed '$d')

if [[ "$HTTP_CODE" == "429" ]]; then
  echo "Rate limited — waiting 3s and retrying..." >&2
  sleep 3
  RESPONSE=$(curl -s -w "\n%{http_code}" \
    "${BASE}/${ENDPOINT}" \
    -H "Authorization: Bearer ${CF_TOKEN}" \
    -H "Content-Type: application/json" \
    -d "$BODY")
  HTTP_CODE=$(echo "$RESPONSE" | tail -1)
  BODY_RESP=$(echo "$RESPONSE" | sed '$d')
fi

if [[ "$HTTP_CODE" != "200" ]]; then
  echo "ERROR (HTTP $HTTP_CODE): $BODY_RESP" >&2
  exit 1
fi

# Output result
SUCCESS=$(echo "$BODY_RESP" | jq -r '.success // empty')
if [[ "$SUCCESS" == "true" ]]; then
  echo "$BODY_RESP" | jq -r '.result'
else
  echo "$BODY_RESP"
fi
