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

SENDGRID_API_KEY="${SENDGRID_API_KEY:?Falta SENDGRID_API_KEY}"
MYSQL_PASS="${MYSQL_PASS:?Falta MYSQL_PASS}"
PROTOTYPE_SINGLE_SEND_ID="${PROTOTYPE_SINGLE_SEND_ID:?Falta PROTOTYPE_SINGLE_SEND_ID}"

MYSQL_HOST="${MYSQL_HOST:-localhost}"
MYSQL_USER="${MYSQL_USER:-linder8_sendgrid_marketing}"
MYSQL_DB="${MYSQL_DB:-linder8_sendgrid_marketing}"

CAMPAIGN_NAME="${CAMPAIGN_NAME:-May Campaign}"
START_SEND_AT="${START_SEND_AT:?Falta START_SEND_AT. Ej: 2026-05-18 06:00:00}"
INTERVAL_MINUTES="${INTERVAL_MINUTES:-15}"
TIMEZONE="${TIMEZONE:-America/Chicago}"

WORKDIR="${WORKDIR:-/tmp/sendgrid_single_sends}"
RUN_ID="${RUN_ID:-}"

rm -rf "$WORKDIR"
mkdir -p "$WORKDIR"

need_cmd() {
  command -v "$1" >/dev/null || { echo "ERROR: falta $1"; exit 1; }
}

need_cmd curl
need_cmd jq
need_cmd mysql
need_cmd python3

echo "=== 1) VALIDANDO PROTOTIPO ==="

curl -sS "https://api.sendgrid.com/v3/marketing/singlesends/$PROTOTYPE_SINGLE_SEND_ID" \
  -H "Authorization: Bearer $SENDGRID_API_KEY" \
  > "$WORKDIR/prototype.json"

PROTO_NAME="$(jq -r '.name // empty' "$WORKDIR/prototype.json")"

if [[ -z "$PROTO_NAME" ]]; then
  echo "ERROR: no pude leer el Single Send prototipo:"
  cat "$WORKDIR/prototype.json" | jq .
  exit 1
fi

echo "Prototipo: $PROTO_NAME"

echo "=== 2) OBTENIENDO LISTAS DINÁMICAS ==="

if [[ -n "$RUN_ID" ]]; then
  WHERE_RUN="WHERE run_id='$RUN_ID'"
else
  WHERE_RUN="WHERE run_id = (SELECT run_id FROM dynamic_sendgrid_lists ORDER BY created_at DESC LIMIT 1)"
fi

LISTS_TSV="$WORKDIR/lists.tsv"

mysql --batch --raw --skip-column-names \
  -h "$MYSQL_HOST" \
  -u "$MYSQL_USER" \
  -p"$MYSQL_PASS" \
  "$MYSQL_DB" <<SQL > "$LISTS_TSV"
SELECT
  sendgrid_list_id,
  list_name,
  contact_count,
  run_id
FROM dynamic_sendgrid_lists
$WHERE_RUN
ORDER BY id;
SQL

TOTAL_LISTS="$(wc -l < "$LISTS_TSV" | tr -d ' ')"

if [[ "$TOTAL_LISTS" -eq 0 ]]; then
  echo "ERROR: no encontré listas dinámicas en dynamic_sendgrid_lists."
  exit 1
fi

echo "Listas a procesar: $TOTAL_LISTS"

echo "=== 3) CREANDO COPIAS Y PROGRAMANDO ==="

CREATED_TSV="$WORKDIR/single_sends_created.tsv"
echo -e "seq\tsingle_send_id\tsingle_send_name\tlist_id\tlist_name\tsend_at_utc\tcontact_count" > "$CREATED_TSV"

SEQ=0

while IFS=$'\t' read -r LIST_ID LIST_NAME CONTACT_COUNT LIST_RUN_ID; do
  SEQ=$((SEQ + 1))

  SINGLE_NAME="${CAMPAIGN_NAME} ${SEQ}"

  SEND_AT_UTC="$(
    python3 - "$START_SEND_AT" "$INTERVAL_MINUTES" "$SEQ" "$TIMEZONE" <<'PY'
import sys
from datetime import datetime, timedelta
from zoneinfo import ZoneInfo

start_str, interval, seq, tz_name = sys.argv[1], int(sys.argv[2]), int(sys.argv[3]), sys.argv[4]

start = datetime.strptime(start_str, "%Y-%m-%d %H:%M:%S").replace(tzinfo=ZoneInfo(tz_name))
send_time = start + timedelta(minutes=interval * (seq - 1))

print(send_time.astimezone(ZoneInfo("UTC")).strftime("%Y-%m-%dT%H:%M:%SZ"))
PY
  )"

  echo "[$SEQ/$TOTAL_LISTS] $SINGLE_NAME"
  echo "  Lista: $LIST_NAME"
  echo "  Send at UTC: $SEND_AT_UTC"

  DUP_RESP="$(
    curl -sS -X POST "https://api.sendgrid.com/v3/marketing/singlesends/$PROTOTYPE_SINGLE_SEND_ID" \
      -H "Authorization: Bearer $SENDGRID_API_KEY" \
      -H "Content-Type: application/json" \
      --data "$(jq -n --arg name "$SINGLE_NAME" '{name:$name}')"
  )"

  NEW_ID="$(echo "$DUP_RESP" | jq -r '.id // empty')"

  if [[ -z "$NEW_ID" ]]; then
    echo "ERROR duplicando Single Send:"
    echo "$DUP_RESP" | jq .
    exit 1
  fi

  PATCH_PAYLOAD="$WORKDIR/patch_${SEQ}.json"

  jq -n \
    --arg name "$SINGLE_NAME" \
    --arg list_id "$LIST_ID" \
    '{
      name: $name,
      send_to: {
        list_ids: [$list_id],
        segment_ids: [],
        all: false
      }
    }' > "$PATCH_PAYLOAD"

  PATCH_RESP="$(
    curl -sS -X PATCH "https://api.sendgrid.com/v3/marketing/singlesends/$NEW_ID" \
      -H "Authorization: Bearer $SENDGRID_API_KEY" \
      -H "Content-Type: application/json" \
      --data-binary "@$PATCH_PAYLOAD"
  )"

  PATCH_ID="$(echo "$PATCH_RESP" | jq -r '.id // empty')"

  if [[ -z "$PATCH_ID" ]]; then
    echo "ERROR actualizando Single Send $NEW_ID:"
    echo "$PATCH_RESP" | jq .
    exit 1
  fi

  SCHEDULE_RESP="$(
    curl -sS -X PUT "https://api.sendgrid.com/v3/marketing/singlesends/$NEW_ID/schedule" \
      -H "Authorization: Bearer $SENDGRID_API_KEY" \
      -H "Content-Type: application/json" \
      --data "$(jq -n --arg send_at "$SEND_AT_UTC" '{send_at:$send_at}')"
  )"

  SCHEDULE_STATUS="$(echo "$SCHEDULE_RESP" | jq -r '.status // empty')"

  if [[ "$SCHEDULE_STATUS" != "scheduled" ]]; then
    echo "ERROR programando Single Send $NEW_ID:"
    echo "$SCHEDULE_RESP" | jq .
    exit 1
  fi

  echo -e "${SEQ}\t${NEW_ID}\t${SINGLE_NAME}\t${LIST_ID}\t${LIST_NAME}\t${SEND_AT_UTC}\t${CONTACT_COUNT}" >> "$CREATED_TSV"

  sleep 2

done < "$LISTS_TSV"

echo "=== DONE JARVIS ==="
echo "Archivo creado: $CREATED_TSV"