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

usage() {
  cat <<'EOF'
Usage:
  pdf2pdfa.sh [options] INPUT.pdf

Convert a PDF to PDF/A by first converting PDF -> PS with pdftops,
then PS -> PDF/A with Ghostscript.

Options:
  -o, --output FILE       Output PDF/A file path
                          Default: INPUT_a.pdf

  --keep-ps              Keep intermediate .ps file
                          Default: delete it after conversion

  --ps-output FILE       Explicit intermediate .ps path
                          Default: INPUT.ps

  --color-model MODEL    Ghostscript process color model
                          Default: DeviceCMYK
                          Common values: DeviceCMYK, DeviceRGB, DeviceGray

  --policy N             PDF/A compatibility policy
                          Default: 1

  -h, --help             Show this help message

Examples:
  pdf2pdfa.sh document.pdf

  pdf2pdfa.sh -o document_pdfa.pdf document.pdf

  pdf2pdfa.sh --keep-ps document.pdf

  pdf2pdfa.sh --color-model DeviceRGB document.pdf
EOF
}

print_error() {
  echo "Error: $*" >&2
  #exit 1
}

die() {
  echo "Error: $*" >&2
  exit 1
}


require_cmd() {
  command -v "$1" >/dev/null 2>&1 || echo "Required command not found: $1" || usage
}

pdf_input=""
pdfa_output=""
ps_output=""
keep_ps=false
color_model="DeviceCMYK"
policy="1"

while [[ $# -gt 0 ]]; do
  case "$1" in
    -o|--output)
      [[ $# -ge 2 ]] || print_error "$1 requires a file path"
      pdfa_output="$2"
      shift 2
      ;;

    --ps-output)
      [[ $# -ge 2 ]] || print_error "$1 requires a file path"
      ps_output="$2"
      shift 2
      ;;

    --keep-ps)
      keep_ps=true
      shift
      ;;

    --color-model)
      [[ $# -ge 2 ]] || print_error "$1 requires a value"
      color_model="$2"
      shift 2
      ;;

    --policy)
      [[ $# -ge 2 ]] || print_error "$1 requires a value"
      policy="$2"
      shift 2
      ;;

    -h|--help)
      usage
      exit 0
      ;;

    --)
      shift
      break
      ;;

    -*)
      print_error "Unknown option: $1";
      usage;
      ;;

    *)
      if [[ -n "$pdf_input" ]]; then
        print_error "Only one input PDF may be provided"
      fi
      pdf_input="$1"
      shift
      ;;
  esac
done

[[ -n "$pdf_input" ]] || {
  usage >&2
  exit 1
}

[[ -f "$pdf_input" ]] || print_error "Input file does not exist: $pdf_input"

case "$pdf_input" in
  *.pdf|*.PDF) ;;
  *) print_error "Input file must be a PDF: $pdf_input" ;;
esac

require_cmd pdftops
require_cmd gs

base="${pdf_input%.*}"

if [[ -z "$ps_output" ]]; then
  ps_output="${base}.ps"
fi

if [[ -z "$pdfa_output" ]]; then
  pdfa_output="${base}_a.pdf"
fi

if [[ "$pdfa_output" == "$pdf_input" ]]; then
  print_error "Output file must not overwrite input file"
fi

cleanup() {
  if [[ "$keep_ps" == false && -f "$ps_output" ]]; then
    rm -f "$ps_output"
  fi
}
trap cleanup EXIT

echo "Converting PDF to PS:"
echo "  $pdf_input -> $ps_output"

pdftops "$pdf_input" "$ps_output"

echo "Converting PS to PDF/A:"
echo "  $ps_output -> $pdfa_output"

gs \
  -dPDFA \
  -dBATCH \
  -dNOPAUSE \
  -dNOOUTERSAVE \
  -sProcessColorModel="$color_model" \
  -sDEVICE=pdfwrite \
  -dPDFACompatibilityPolicy="$policy" \
  -sOutputFile="$pdfa_output" \
  "$ps_output"

echo "Done:"
echo "  $pdfa_output"
