#!/usr/bin/env bash

set -uo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"

DRY_RUN=false
KEEP_AIRTABLE=false
AUTO_CONFIRM=false
CPANEL_USER=""

usage() {
  cat <<'EOF'
Uso:
  ./scripts/delete-project.sh <cpanel_user> [--dry-run] [--keep-airtable] [--yes]

Opciones:
  --dry-run        Muestra qué se borraría sin ejecutar cambios.
  --keep-airtable  Borra solo la cuenta cPanel, mantiene Airtable.
  --yes            No pide confirmación interactiva.
  -h, --help       Muestra esta ayuda.
EOF
}

while (($#)); do
  case "$1" in
    --dry-run)
      DRY_RUN=true
      shift
      ;;
    --keep-airtable)
      KEEP_AIRTABLE=true
      shift
      ;;
    --yes)
      AUTO_CONFIRM=true
      shift
      ;;
    -h|--help)
      usage
      exit 0
      ;;
    -*)
      echo "Opción no reconocida: $1" >&2
      usage
      exit 1
      ;;
    *)
      if [[ -z "$CPANEL_USER" ]]; then
        CPANEL_USER="$1"
      else
        echo "Parámetro inesperado: $1" >&2
        usage
        exit 1
      fi
      shift
      ;;
  esac
done

if [[ -z "$CPANEL_USER" ]]; then
  echo "Debes indicar el usuario cPanel." >&2
  usage
  exit 1
fi

if [[ -f "${PROJECT_ROOT}/.env" ]]; then
  # shellcheck disable=SC1091
  source "${PROJECT_ROOT}/.env"
fi

AIRTABLE_TOKEN="${AIRTABLE_TOKEN:-}"
AIRTABLE_BASE_ID="${AIRTABLE_BASE_ID:-}"
AIRTABLE_PROJECTS_TABLE="${AIRTABLE_SUBSCRIPTIONS_TABLE:-}"
AIRTABLE_SUBS_TABLE="${AIRTABLE_SUBSCRIPTIONS_TRACKING_TABLE:-tblnpr52JhFBBi2Mg}"

API_BASE=""
if [[ -n "$AIRTABLE_TOKEN" && -n "$AIRTABLE_BASE_ID" ]]; then
  API_BASE="https://api.airtable.com/v0/${AIRTABLE_BASE_ID}"
fi

urlencode() {
  python3 - "$1" <<'PYEOF'
import sys
import urllib.parse
print(urllib.parse.quote(sys.argv[1], safe=""))
PYEOF
}

extract_project_info() {
  python3 - "$1" <<'PYEOF'
import json
import sys

raw = sys.argv[1]
try:
    data = json.loads(raw)
except Exception:
    print("|")
    raise SystemExit(0)

records = data.get("records", [])
if not records:
    print("|")
    raise SystemExit(0)

record = records[0]
record_id = record.get("id", "")
name = record.get("fields", {}).get("Name", "")
print(f"{record_id}|{name}")
PYEOF
}

extract_subscription_ids() {
  python3 - "$1" <<'PYEOF'
import json
import sys

raw = sys.argv[1]
try:
    data = json.loads(raw)
except Exception:
    raise SystemExit(0)

for rec in data.get("records", []):
    rid = rec.get("id")
    if rid:
        print(rid)
PYEOF
}

airtable_get() {
  local table="$1"
  local formula="$2"
  local max_records="${3:-}"
  local encoded_formula
  encoded_formula="$(urlencode "$formula")"
  local url="${API_BASE}/${table}?filterByFormula=${encoded_formula}"
  if [[ -n "$max_records" ]]; then
    url="${url}&maxRecords=${max_records}"
  fi
  curl -sS -H "Authorization: Bearer ${AIRTABLE_TOKEN}" "$url"
}

airtable_delete_record() {
  local table="$1"
  local record_id="$2"
  curl -sS -X DELETE \
    -H "Authorization: Bearer ${AIRTABLE_TOKEN}" \
    "${API_BASE}/${table}/${record_id}" > /dev/null
}

echo ""
echo "========================================"
echo "  DELETE PROJECT: ${CPANEL_USER}"
echo "========================================"
echo ""

if [[ -f "/var/cpanel/users/${CPANEL_USER}" ]]; then
  USER_EXISTS=true
  echo "  cPanel account: EXISTS"
else
  USER_EXISTS=false
  echo "  cPanel account: NOT FOUND"
fi

PROJECT_ID=""
PROJECT_NAME=""
SUB_IDS=()

if [[ -n "$API_BASE" && -n "$AIRTABLE_PROJECTS_TABLE" ]]; then
  PROJECT_JSON="$(airtable_get "$AIRTABLE_PROJECTS_TABLE" "{Cpanel_User}=\"${CPANEL_USER}\"" "1")"
  PROJECT_INFO="$(extract_project_info "$PROJECT_JSON")"
  PROJECT_ID="${PROJECT_INFO%%|*}"
  PROJECT_NAME="${PROJECT_INFO#*|}"

  if [[ -n "$PROJECT_ID" ]]; then
    echo "  Airtable Project: ${PROJECT_NAME:-?} (${PROJECT_ID})"
    SUBS_JSON="$(airtable_get "$AIRTABLE_SUBS_TABLE" "SEARCH(\"${PROJECT_NAME}\",{Project})")"
    while IFS= read -r rid; do
      [[ -n "$rid" ]] && SUB_IDS+=("$rid")
    done < <(extract_subscription_ids "$SUBS_JSON")
    echo "  Airtable Subscriptions: ${#SUB_IDS[@]} record(s)"
  else
    echo "  Airtable Project: NOT FOUND (searching by Cpanel_User=${CPANEL_USER})"
  fi
else
  echo "  Airtable: NOT CONFIGURED"
fi

echo ""

if [[ "$DRY_RUN" == "true" ]]; then
  echo "DRY RUN — nothing deleted."
  [[ "$USER_EXISTS" == "true" ]] && echo "  Would delete: cPanel account '${CPANEL_USER}'"
  [[ -n "$PROJECT_ID" ]] && echo "  Would delete: Airtable Project ${PROJECT_ID}"
  for sub_id in "${SUB_IDS[@]}"; do
    echo "  Would delete: Airtable Subscription ${sub_id}"
  done
  exit 0
fi

if [[ "$AUTO_CONFIRM" != "true" ]]; then
  read -r -p "Delete everything for '${CPANEL_USER}'? [y/N]: " reply
  if [[ ! "$reply" =~ ^[Yy]$ ]]; then
    echo "Cancelled."
    exit 0
  fi
fi

if [[ "$USER_EXISTS" == "true" ]]; then
  echo "  Deleting cPanel account..."
  REMOVE_OUTPUT="$(/scripts/removeacct "${CPANEL_USER}" --force 2>&1)"
  REMOVE_EXIT=$?
  if [[ $REMOVE_EXIT -eq 0 ]]; then
    if [[ -d "/home/${CPANEL_USER}" ]]; then
      rm -rf "/home/${CPANEL_USER}"
    fi
    echo "  ✓ cPanel account deleted"
  else
    echo "  ✗ Failed: ${REMOVE_OUTPUT}" >&2
  fi
fi

if [[ "$KEEP_AIRTABLE" != "true" && -n "$API_BASE" ]]; then
  for sub_id in "${SUB_IDS[@]}"; do
    airtable_delete_record "$AIRTABLE_SUBS_TABLE" "$sub_id"
    echo "  ✓ Subscription deleted: ${sub_id}"
  done

  if [[ -n "$PROJECT_ID" ]]; then
    airtable_delete_record "$AIRTABLE_PROJECTS_TABLE" "$PROJECT_ID"
    echo "  ✓ Project deleted: ${PROJECT_ID}"
  fi
fi

echo ""
echo "  Project '${CPANEL_USER}' deleted completely."
