#!/usr/bin/env bash
# EMAIL-CLEANING-005B upsert driver.
# Reads work/005b_upsert_batches.json; posts each batch to SendGrid; captures
# job_id; polls to completion; writes work/005b_upsert_log.jsonl.
set -euo pipefail
cd "$HOME/marketing.linderlake.com"
source ./0-config_var_setup.sh

BATCHES="work/005b_upsert_batches.json"
LOG="work/005b_upsert_log.jsonl"
: > "$LOG"

POLL_INTERVAL="${POLL_INTERVAL:-5}"
MAX_WAIT="${MAX_WAIT:-600}"

count=$(jq 'length' "$BATCHES")
echo "BATCHES=$count"

for i in $(seq 0 $((count - 1))); do
  payload="$(jq -c ".[$i]" "$BATCHES")"
  n_contacts="$(jq '.contacts | length' <<<"$payload")"
  n_lists="$(jq '.list_ids | length' <<<"$payload")"
  echo "=== BATCH[$i] contacts=$n_contacts lists=$n_lists ==="

  RESP="$(mktemp)"
  HTTP="$(curl --connect-timeout 10 --max-time 60 --retry 3 --retry-delay 2 \
    -sS -o "$RESP" -w '%{http_code}' \
    -X PUT 'https://api.sendgrid.com/v3/marketing/contacts' \
    -H "Authorization: Bearer $SENDGRID_API_KEY" \
    -H 'Content-Type: application/json' \
    --data-raw "$payload" || echo 000)"

  if [ "$HTTP" != "202" ]; then
    echo "ERROR PUT contacts batch=$i http=$HTTP"
    cat "$RESP"
    jq -n --argjson b "$payload" --arg http "$HTTP" --arg body "$(cat "$RESP")" '{phase:"upsert", batch:$b, http:$http, body:$body, error:true}' >> "$LOG"
    exit 1
  fi

  JOB_ID="$(jq -r '.job_id // .id // empty' "$RESP")"
  if [ -z "$JOB_ID" ]; then
    echo "ERROR no job_id in response"
    cat "$RESP"
    exit 1
  fi
  echo "  job_id=$JOB_ID"

  # Poll
  waited=0
  while :; do
    POLL="$(mktemp)"
    PH="$(curl --connect-timeout 10 --max-time 30 --retry 3 --retry-delay 2 \
      -sS -o "$POLL" -w '%{http_code}' \
      -H "Authorization: Bearer $SENDGRID_API_KEY" \
      "https://api.sendgrid.com/v3/marketing/contacts/imports/$JOB_ID" || echo 000)"
    STATUS="$(jq -r '.status // empty' "$POLL" 2>/dev/null)"
    if [ "$PH" != "200" ]; then
      echo "  poll http=$PH status=$STATUS waited=${waited}s"
    else
      echo "  poll status=$STATUS waited=${waited}s"
    fi
    case "$STATUS" in
      completed)
        REQ=$(jq -r '.results.requested_count // 0' "$POLL")
        CREATED=$(jq -r '.results.created_count // 0' "$POLL")
        UPDATED=$(jq -r '.results.updated_count // 0' "$POLL")
        ERRORS=$(jq -r '.results.errored_count // 0' "$POLL")
        echo "  requested=$REQ created=$CREATED updated=$UPDATED errored=$ERRORS"
        jq -n --argjson b "$payload" --arg job "$JOB_ID" --arg status "$STATUS" --slurpfile r "$POLL" \
          '{phase:"upsert", batch:$b, job_id:$job, status:$status, result:$r[0]}' >> "$LOG"
        break
        ;;
      errored|failed)
        echo "FAIL job_id=$JOB_ID status=$STATUS"
        cat "$POLL"
        jq -n --argjson b "$payload" --arg job "$JOB_ID" --arg status "$STATUS" --slurpfile r "$POLL" \
          '{phase:"upsert", batch:$b, job_id:$job, status:$status, result:$r[0], error:true}' >> "$LOG"
        exit 1
        ;;
    esac
    if [ "$waited" -ge "$MAX_WAIT" ]; then
      echo "TIMEOUT job_id=$JOB_ID waited=${waited}s"
      exit 1
    fi
    sleep "$POLL_INTERVAL"
    waited=$((waited + POLL_INTERVAL))
  done
done

echo "DONE_UPSERT"
