#!/usr/bin/env bash
# ============================================================
#  Cloudinary Folder Manager
#  Requiere: curl
# ============================================================

# ---------- Credenciales ----------
CLOUD_NAME="${CLOUDINARY_CLOUD_NAME:-dupf7vvwj}"
API_KEY="${CLOUDINARY_API_KEY:-413378447996456}"
API_SECRET="${CLOUDINARY_API_SECRET:-pslFZxYtoWaGWj4IcvGSb26r1hw}"

BASE_URL="https://api.cloudinary.com/v1_1/${CLOUD_NAME}"

# ---------- Colores ----------
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m'

check_deps() {
  if ! command -v curl &>/dev/null; then
    echo -e "${RED}Error: 'curl' no está instalado.${NC}"
    exit 1
  fi
}

# ---------- Listar folders raíz ----------
list_root_folders() {
  echo -e "\n${CYAN}${BOLD}Folders raíz:${NC}"
  response=$(curl -s -u "${API_KEY}:${API_SECRET}" "${BASE_URL}/folders")
  echo "$response" | grep -o '"path":"[^"]*"' | cut -d'"' -f4 | sort | nl -w3 -s') '
  if ! echo "$response" | grep -q '"path"'; then
    echo -e "${YELLOW}No se encontraron folders.${NC}"
    echo "Respuesta: $response"
  fi
}

# ---------- Listar subfolders ----------
list_subfolders() {
  local parent="${1:-}"
  if [[ -z "$parent" ]]; then
    read -rp "Nombre del folder padre: " parent
  fi
  echo -e "\n${CYAN}${BOLD}Subfolders de '${parent}':${NC}"
  response=$(curl -s -u "${API_KEY}:${API_SECRET}" "${BASE_URL}/folders/${parent}")
  echo "$response" | grep -o '"path":"[^"]*"' | cut -d'"' -f4 | sort | nl -w3 -s') '
}

# ---------- Eliminar assets de un folder (con paginación) ----------
# ---------- Esperar si hay rate limit ----------
# Recibe la respuesta de la API y pausa hasta el reset si detecta rate limit
wait_if_rate_limited() {
  local resp="$1"
  if echo "$resp" | grep -q "Rate Limit Exceeded"; then
    # Extraer timestamp "Try again on YYYY-MM-DD HH:MM:SS UTC"
    local reset_str
    reset_str=$(echo "$resp" | grep -o 'Try again on [0-9 :-]* UTC' | grep -o '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]')

    local wait_secs=3600  # fallback: esperar 1 hora
    if [[ -n "$reset_str" ]]; then
      local reset_epoch
      reset_epoch=$(date -d "${reset_str} UTC" +%s 2>/dev/null || date -j -f "%Y-%m-%d %H:%M:%S" "${reset_str}" +%s 2>/dev/null)
      local now_epoch
      now_epoch=$(date +%s)
      wait_secs=$(( reset_epoch - now_epoch + 10 ))  # +10s de margen
      [[ $wait_secs -lt 0 ]] && wait_secs=60
    fi

    local reset_local
    reset_local=$(date -d "${reset_str} UTC" 2>/dev/null || echo "${reset_str} UTC")
    echo -e "\n  ${YELLOW}⏳ Rate limit alcanzado. Esperando hasta ${reset_local} (${wait_secs}s)...${NC}"

    # Mostrar cuenta regresiva cada 60s
    while [[ $wait_secs -gt 0 ]]; do
      local mins=$(( wait_secs / 60 ))
      local secs=$(( wait_secs % 60 ))
      printf "\r  Reanudando en %02d:%02d...   " "$mins" "$secs"
      sleep 10
      wait_secs=$(( wait_secs - 10 ))
    done
    echo -e "\n  ${GREEN}Reanudando...${NC}"
    return 0  # hubo rate limit, el caller debe reintentar
  fi
  return 1  # no hubo rate limit
}

delete_assets() {
  local folder="$1"
  echo -e "  ${YELLOW}Eliminando assets en '${folder}'...${NC}"

  for rtype in image video raw; do
    local total=0
    local next_cursor=""

    while true; do
      local list_url="${BASE_URL}/resources/${rtype}?prefix=${folder}&max_results=500&type=upload"
      [[ -n "$next_cursor" ]] && list_url="${list_url}&next_cursor=${next_cursor}"

      local list_resp
      while true; do
        list_resp=$(curl -s -u "${API_KEY}:${API_SECRET}" "$list_url")
        wait_if_rate_limited "$list_resp" || break
      done

      local ids
      ids=$(echo "$list_resp" | grep -o '"public_id":"[^"]*"' | cut -d'"' -f4)

      if [[ -z "$ids" ]]; then
        break
      fi

      echo "$ids" | split -l 100 - /tmp/cld_batch_

      for batch_file in /tmp/cld_batch_*; do
        local qs=""
        while IFS= read -r pid; do
          local encoded
          encoded=$(python3 -c "import urllib.parse; print(urllib.parse.quote('${pid}', safe=''))" 2>/dev/null || echo "$pid")
          qs="${qs}public_ids[]=${encoded}&"
        done < "$batch_file"
        qs="${qs%&}"

        local del_resp
        while true; do
          del_resp=$(curl -s -X DELETE -u "${API_KEY}:${API_SECRET}" \
            "${BASE_URL}/resources/${rtype}/upload?${qs}")
          wait_if_rate_limited "$del_resp" || break
        done

        local deleted
        deleted=$(echo "$del_resp" | grep -o ':"deleted"' | wc -l)
        total=$((total + deleted))
        rm -f "$batch_file"
      done

      next_cursor=$(echo "$list_resp" | grep -o '"next_cursor":"[^"]*"' | cut -d'"' -f4)
      [[ -z "$next_cursor" ]] && break
    done

    [[ $total -gt 0 ]] && echo -e "  ${GREEN}[${rtype}] eliminados: ${total} assets${NC}"
  done

  sleep 1
}

# ---------- Eliminar folder ----------
delete_folder() {
  local folder="$1"
  local result
  while true; do
    result=$(curl -s -X DELETE -u "${API_KEY}:${API_SECRET}" "${BASE_URL}/folders/${folder}")
    wait_if_rate_limited "$result" || break
  done

  if echo "$result" | grep -q '"deleted"'; then
    echo -e "  ${GREEN}✔ Folder '${folder}' eliminado.${NC}"
  else
    local err
    err=$(echo "$result" | grep -o '"message":"[^"]*"' | cut -d'"' -f4)
    echo -e "  ${RED}✘ No se pudo eliminar '${folder}': ${err:-error desconocido}${NC}"
    echo "  Raw: $result"
  fi
}

# ---------- Flujo: borrar folder completo ----------
delete_folder_full() {
  read -rp "Path del folder a eliminar: " folder
  echo -e "\n${RED}${BOLD}⚠ Esto eliminará TODOS los assets y el folder '${folder}'.${NC}"
  read -rp "¿Confirmar? (escribí 'si' para continuar): " confirm
  [[ "$confirm" != "si" ]] && echo "Cancelado." && return
  delete_assets "$folder"
  delete_folder "$folder"
}

# ---------- Borrar múltiples folders ----------
delete_multiple() {
  list_root_folders
  echo -e "\n${YELLOW}Ingresá los paths separados por coma:${NC}"
  read -rp "> " raw_input

  IFS=',' read -ra folders <<< "$raw_input"

  echo -e "\n${RED}${BOLD}⚠ Se eliminarán ${#folders[@]} folder(s) y todos sus assets.${NC}"
  printf '  - %s\n' "${folders[@]}"
  read -rp "¿Confirmar? (escribí 'si' para continuar): " confirm
  [[ "$confirm" != "si" ]] && echo "Cancelado." && return

  for f in "${folders[@]}"; do
    f=$(echo "$f" | xargs)
    echo -e "\n${BOLD}Procesando: ${f}${NC}"
    delete_assets "$f"
    delete_folder "$f"
  done
  echo -e "\n${GREEN}Listo.${NC}"
}

# ---------- Menú principal ----------
main_menu() {
  while true; do
    echo -e "\n${BOLD}━━━ Cloudinary Folder Manager ━━━${NC}"
    echo "  1) Listar folders raíz"
    echo "  2) Listar subfolders de un folder"
    echo "  3) Eliminar un folder (assets + folder)"
    echo "  4) Eliminar múltiples folders"
    echo "  5) Salir"
    echo -ne "\nOpción: "
    read -r opt
    case "$opt" in
      1) list_root_folders ;;
      2) list_subfolders ;;
      3) delete_folder_full ;;
      4) delete_multiple ;;
      5) echo "Hasta luego."; exit 0 ;;
      *) echo -e "${RED}Opción inválida.${NC}" ;;
    esac
  done
}

check_deps
main_menu
