#!/bin/bash
# process-suspensions.sh — Suspende sitios con pago vencido y reactiva los que pagaron
# Cron: 0 8 * * * root /root/scripts/process-suspensions.sh >> /var/log/bewpro-suspensions.log 2>&1

set -uo pipefail

CONFIG_FILE="/root/scripts/.airtable.env"
[[ -f "$CONFIG_FILE" ]] && source "$CONFIG_FILE"

AIRTABLE_TOKEN="${AIRTABLE_TOKEN:-}"
AIRTABLE_BASE_ID="${AIRTABLE_BASE_ID:-}"
SUBS_TABLE="tblnpr52JhFBBi2Mg"   # Subscriptions
TODAY=$(date +%Y-%m-%d)

if [[ -z "$AIRTABLE_TOKEN" || -z "$AIRTABLE_BASE_ID" ]]; then
  echo "[$(date)] ERROR: Faltan vars de Airtable" >&2
  exit 1
fi

API_URL="https://api.airtable.com/v0/${AIRTABLE_BASE_ID}/${SUBS_TABLE}"

airtable_get() {
  local filter
  filter=$(python3 -c "import urllib.parse,sys; print(urllib.parse.quote(sys.argv[1]))" "$1")
  curl -s -H "Authorization: Bearer ${AIRTABLE_TOKEN}" "${API_URL}?filterByFormula=${filter}"
}

airtable_patch() {
  local rid="$1" payload="$2"
  curl -s -X PATCH \
    -H "Authorization: Bearer ${AIRTABLE_TOKEN}" -H "Content-Type: application/json" \
    -d "$payload" "${API_URL}/${rid}"
}

send_email() {
  local to="$1" subject="$2" body="$3"
  echo "$body" | mail -s "$subject" \
    -a "From: BewPro <noreply@bewpro.com>" \
    -a "Content-Type: text/plain; charset=UTF-8" \
    "$to" 2>/dev/null || true
}

echo ""
echo "========================================"
echo "  BEWPRO — Suspension Check: ${TODAY}"
echo "========================================"

########################################
# 1. SUSPENDER — Past_Due con grace expirada
########################################

echo ""
echo "[SUSPENDER] Buscando Past_Due con grace expirada..."

PAST_DUE_JSON=$(airtable_get "AND({Status}=\"Past_Due\",{Billing_Model}=\"Stripe\",IS_BEFORE({Grace_Period_End},TODAY()))")

python3 - "$PAST_DUE_JSON" <<'PYEOF'
import sys, json
raw = sys.argv[1]
data = json.loads(raw)
recs = data.get('records', [])
print(f"  Encontrados: {len(recs)}")
for r in recs:
    f = r['fields']
    print(f"  SUSPEND|{r['id']}|{f.get('Cpanel_User','')}|{f.get('Project','')}|{f.get('App_URL','')}")
PYEOF

SUSPEND_LIST=$(python3 -c "
import sys, json
data = json.loads(sys.argv[1])
for r in data.get('records', []):
    f = r['fields']
    cpanel = f.get('Cpanel_User', '')
    project = f.get('Project', '')
    app_url = f.get('App_URL', '')
    if cpanel:
        print(f\"{r['id']}|{cpanel}|{project}|{app_url}\")
" "$PAST_DUE_JSON")

if [[ -n "$SUSPEND_LIST" ]]; then
  while IFS='|' read -r RID CPANEL_USER PROJECT APP_URL; do
    echo ""
    echo "  Suspendiendo: ${PROJECT} (${CPANEL_USER})"

    # Suspender cuenta cPanel
    WHM_RESULT=$(whmapi1 suspendacct user="${CPANEL_USER}" reason="Pago vencido - BewPro" 2>&1)
    if echo "$WHM_RESULT" | grep -q "result: 1"; then
      echo "    cPanel: suspendido OK"

      # Actualizar Airtable
      PAYLOAD=$(python3 -c "
import json, sys
print(json.dumps({'fields': {'Status': 'Suspended', 'Suspended_Date': sys.argv[1]}}))
" "$TODAY")
      airtable_patch "$RID" "$PAYLOAD" > /dev/null

      echo "    Airtable: Status=Suspended"

      # Email al cliente (si tiene email en el proyecto)
      # TODO: agregar Email al subscription record para notificaciones
    else
      echo "    cPanel ERROR: $WHM_RESULT" >&2
    fi
  done <<< "$SUSPEND_LIST"
else
  echo "  Ninguno a suspender."
fi

########################################
# 2. AVISAR — Past_Due recientes (dentro del grace period)
########################################

echo ""
echo "[AVISAR] Buscando Past_Due en grace period..."

GRACE_JSON=$(airtable_get "AND({Status}=\"Past_Due\",{Billing_Model}=\"Stripe\",IS_AFTER({Grace_Period_End},TODAY()))")

GRACE_COUNT=$(python3 -c "import sys,json; print(len(json.loads(sys.argv[1]).get('records',[])))" "$GRACE_JSON")
echo "  En grace period: ${GRACE_COUNT}"

########################################
# 3. REACTIVAR — Active con Suspended_Date (pagaron)
########################################

echo ""
echo "[REACTIVAR] Buscando Suspended que volvieron a Active..."

# Stripe actualizará Status=Active cuando se procese el pago
# Este bloque reactiva el cPanel cuando Airtable ya está en Active pero cPanel sigue suspendido
REACTIVATE_JSON=$(airtable_get "AND({Status}=\"Active\",{Billing_Model}=\"Stripe\",{Suspended_Date}!=\"\")")

REACTIVATE_LIST=$(python3 -c "
import sys, json
data = json.loads(sys.argv[1])
for r in data.get('records', []):
    f = r['fields']
    cpanel = f.get('Cpanel_User', '')
    project = f.get('Project', '')
    if cpanel:
        print(f\"{r['id']}|{cpanel}|{project}\")
" "$REACTIVATE_JSON")

if [[ -n "$REACTIVATE_LIST" ]]; then
  while IFS='|' read -r RID CPANEL_USER PROJECT; do
    echo ""
    echo "  Reactivando: ${PROJECT} (${CPANEL_USER})"

    WHM_RESULT=$(whmapi1 unsuspendacct user="${CPANEL_USER}" 2>&1)
    if echo "$WHM_RESULT" | grep -q "result: 1"; then
      echo "    cPanel: reactivado OK"

      # Limpiar Suspended_Date en Airtable
      airtable_patch "$RID" '{"fields":{"Suspended_Date":null}}' > /dev/null
      echo "    Airtable: Suspended_Date limpiado"
    else
      echo "    cPanel ERROR: $WHM_RESULT" >&2
    fi
  done <<< "$REACTIVATE_LIST"
else
  echo "  Ninguno a reactivar."
fi

echo ""
echo "========================================"
echo "  Done: ${TODAY}"
echo "========================================"
