#!/usr/bin/env bash
# Fetches all results from Google Places API (New) for a text query.
# Handles pagination via nextPageToken automatically.
#
# Usage:
#   ./google-places.sh "temples in usa"
#   ./google-places.sh "indian restaurants in new york"
#   ./google-places.sh "temples in usa" --key YOUR_API_KEY
#   ./google-places.sh "temples in usa" --refresh
#
# Output: data/google_places/<slug>/all_places.json

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
DATA_DIR="$SCRIPT_DIR/../data/google_places"

# --- Config ---
API_KEY="${GOOGLE_PLACES_API_KEY:-}"
ENDPOINT="https://places.googleapis.com/v1/places:searchText"
PAGE_SIZE=20
FIELD_MASK="places.id,places.displayName,places.formattedAddress,places.location,places.rating,places.userRatingCount,places.websiteUri,places.primaryTypeDisplayName,places.regularOpeningHours,places.internationalPhoneNumber"
REFRESH=false
QUERY=""

# --- Arg parsing ---
while [[ $# -gt 0 ]]; do
  case "$1" in
    --key)    API_KEY="$2"; shift 2 ;;
    --refresh) REFRESH=true; shift ;;
    *)        QUERY="$1"; shift ;;
  esac
done

if [[ -z "$QUERY" ]]; then
  echo "Usage: $0 \"<search query>\" [--key API_KEY] [--refresh]"
  echo "  Set GOOGLE_PLACES_API_KEY env var to avoid passing --key each time"
  exit 1
fi

if [[ -z "$API_KEY" ]]; then
  echo "Error: API key required. Pass --key YOUR_KEY or set GOOGLE_PLACES_API_KEY env var."
  exit 1
fi

# Slug: lowercase, spaces → underscores, strip special chars
SLUG=$(echo "$QUERY" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9 ]//g' | tr ' ' '_' | sed 's/__*/_/g')
OUT_DIR="$DATA_DIR/$SLUG"

if [[ "$REFRESH" == true && -d "$OUT_DIR" ]]; then
  rm -rf "$OUT_DIR"
fi
mkdir -p "$OUT_DIR"

echo "=== Google Places pipeline ==="
echo "Query: $QUERY"
echo "Output: $OUT_DIR"
echo ""

# --- Fetch pages ---
page=1
next_token=""
all_places="[]"

while true; do
  FILE="$OUT_DIR/$(printf 'page_%03d.json' "$page")"

  if [[ ! -f "$FILE" ]]; then
    echo "  Fetching page $page..."

    # Build request body
    if [[ -z "$next_token" ]]; then
      BODY=$(jq -n --arg q "$QUERY" --argjson ps "$PAGE_SIZE" \
        '{textQuery: $q, pageSize: $ps}')
    else
      BODY=$(jq -n --arg q "$QUERY" --argjson ps "$PAGE_SIZE" --arg tok "$next_token" \
        '{textQuery: $q, pageSize: $ps, pageToken: $tok}')
    fi

    curl -sf -X POST \
      -H "Content-Type: application/json" \
      -H "X-Goog-Api-Key: $API_KEY" \
      -H "X-Goog-FieldMask: $FIELD_MASK,nextPageToken" \
      -d "$BODY" \
      "$ENDPOINT" > "$FILE"
  else
    echo "  page $page — cached"
  fi

  # Extract nextPageToken for next iteration
  next_token=$(jq -r '.nextPageToken // empty' "$FILE")

  page=$((page + 1))
  [[ -z "$next_token" ]] && break
  sleep 0.5
done

TOTAL_PAGES=$((page - 1))
echo ""
echo "Fetched $TOTAL_PAGES page(s). Merging → $OUT_DIR/all_places.json"

# Merge all pages into one flat array
jq -s '[.[].places // [] | .[]]' "$OUT_DIR"/page_*.json > "$OUT_DIR/all_places.json"

TOTAL=$(jq 'length' "$OUT_DIR/all_places.json")
echo "Done — $TOTAL places saved to $OUT_DIR/all_places.json"
