#!/bin/bash
# CUPS backend: verae — virtual printer "Verae Timestamping" (Linux)
# Discovery (no args): advertise device URI verae:/
# Job: spool PDF and run verae-print as the job user (digests only).
set -euo pipefail

LOG_ROOT="${CUPS_SERVERROOT:-/var/log/cups}"
BACKEND_LOG="${LOG_ROOT}/verae-backend.log"

log() {
  echo "$(date -u +%Y-%m-%dT%H:%MZ) $*" >>"$BACKEND_LOG" 2>/dev/null || true
}

if [[ $# -eq 0 ]]; then
  echo 'direct verae:/ "Verae Timestamping" "Verae Timestamping — digests-only stamp"'
  exit 0
fi

JOB_ID="${1:-}"
JOB_USER="${2:-}"
JOB_TITLE="${3:-document}"
JOB_FILE="${6:-}"

VERAE_PRINT="${VERAE_PRINT_BIN:-/usr/local/bin/verae-print}"
CHANNEL="${VERAE_PRINT_CHANNEL:-zapier}"

if [[ -n "$JOB_USER" && -d "/home/$JOB_USER" ]]; then
  SPOOL_BASE="/home/$JOB_USER/.local/share/verae/print-spool"
  OUT_DIR="/home/$JOB_USER/Documents/Verae Timestamps"
else
  SPOOL_BASE="/var/spool/verae/${JOB_USER:-unknown}"
  OUT_DIR="/tmp/VeraeTimestamps"
fi

mkdir -p "$SPOOL_BASE"
chmod 700 "$SPOOL_BASE" 2>/dev/null || true

SAFE_TITLE=$(echo "$JOB_TITLE" | tr -cd 'A-Za-z0-9._ -' | head -c 80)
SAFE_TITLE=${SAFE_TITLE:-document}
WORK="$SPOOL_BASE/job-${JOB_ID}-$$"
mkdir -p "$WORK"

INPUT="$WORK/input.dat"
if [[ -n "$JOB_FILE" && -f "$JOB_FILE" ]]; then
  cp "$JOB_FILE" "$INPUT"
else
  cat >"$INPUT"
fi

PDF="$WORK/${SAFE_TITLE}.pdf"
if [[ "$(head -c 4 "$INPUT")" == "%PDF" ]]; then
  cp "$INPUT" "$PDF"
else
  # Best-effort: keep bytes; stamp accepts PDF/HTML
  cp "$INPUT" "$PDF"
fi

log "job=$JOB_ID user=$JOB_USER title=$JOB_TITLE pdf=$PDF channel=$CHANNEL"

run_as_user() {
  if [[ -n "$JOB_USER" && "$JOB_USER" != "root" ]] && command -v runuser >/dev/null 2>&1; then
    runuser -u "$JOB_USER" -- "$@"
  elif [[ -n "$JOB_USER" && "$JOB_USER" != "root" ]] && command -v su >/dev/null 2>&1; then
    su - "$JOB_USER" -c "$(printf '%q ' "$@")"
  else
    "$@"
  fi
}

mkdir -p "$OUT_DIR" 2>/dev/null || true
if run_as_user "$VERAE_PRINT" stamp -channel "$CHANNEL" -out-dir "$OUT_DIR" -skip-setup "$PDF"; then
  log "job $JOB_ID ok → $OUT_DIR"
  exit 0
fi
log "job $JOB_ID stamp failed"
exit 1
