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

usage() {
  cat <<'EOF'
Usage:
  manage-queue.sh list [--json]
  manage-queue.sh delete <queue-id>
  manage-queue.sh hold <queue-id>
  manage-queue.sh release <queue-id>
  manage-queue.sh requeue <queue-id>
EOF
}

require_root() {
  if [[ $EUID -ne 0 ]]; then
    echo "Run as root." >&2
    exit 1
  fi
}

validate_queue_id() {
  [[ "$1" =~ ^[A-Za-z0-9]{1,64}$ ]] || {
    echo "Invalid queue ID." >&2
    exit 1
  }
}

list_queue() {
  if [[ ${1:-} == "--json" ]]; then
    postqueue -j | python3 -c 'import json, sys; print(json.dumps([json.loads(line) for line in sys.stdin if line.strip()]))'
    return 0
  fi
  postqueue -p
}

require_root

# postsuper writes to /var/spool/postfix and must escape the app's read-only
# mount namespace when invoked from the panel/API (see libenv.sh).
case "${1:-}" in
  delete|hold|release|requeue)
    limristem_mail_escape_write_namespace LIMRISTEM_MAIL_QUEUE_WORKER limristem-mail-queue "$@"
    ;;
esac

command=${1:-}
case "$command" in
  list)
    shift
    list_queue "${1:-}"
    ;;
  delete)
    validate_queue_id "${2:?queue id required}"
    postsuper -d "${2:?queue id required}"
    ;;
  hold)
    validate_queue_id "${2:?queue id required}"
    postsuper -h "${2:?queue id required}"
    ;;
  release)
    validate_queue_id "${2:?queue id required}"
    postsuper -H "${2:?queue id required}"
    ;;
  requeue)
    validate_queue_id "${2:?queue id required}"
    postsuper -r "${2:?queue id required}"
    ;;
  *)
    usage >&2
    exit 1
    ;;
esac
