#!/bin/bash

# Debug mode: change to 'yes' to enable
DEBUG=${DEBUG-no}

function log() {
    [ "${DEBUG}" = "yes" ] && echo $* | logger -t "$0[$$]"
}

function logpipe() {
    [ "${DEBUG}" = "yes" ] && echo $* | logger -t "$0[$$]"
}

function trapINT() {
    log "trapINT()"
    [ "x$trp" = "x" ] &&  trp="yes" || return
    sleep 30 && { [ ! "${DEBUG}" = "yes" ] && rm -rf $uid; log "Cleanup complete"; } &
    exit
}

function stop() {
    log "Stop stop page";
    echo "stop" > $uid/999999999-page.pbm
}

function output_page() {
    # Converting page to JBIG format (parameters are very special for this printer!)
    pbmtojbg -p 72 -o 3 -m 0 -q < $page > $uid/raster.jbig

    # Taking image size
    jsize=`wc -c < $uid/raster.jbig`

    # Taking image dimensions
    x=($(identify -format "%w %h %[fx:mean] " $page))
    ##
    # The %[fx:mean] gives the average colour in the image which for
    # monochrome is the number of white pixels divided by the size
    #
    # So the formula gives the number of black pixels.  The final
    # /1 causes bc to round to the nearest integer because scale=0
    ##
    dots=$(echo "(${x[0]}*${x[1]}*(1-${x[2]}))/1"|bc)
    ##
    # FIX: toner cartridge runs out way too fast with this dots
    #      calculation above and once it decides it's empty, you
    #      can't force it to print.  So set dots to an artificially 
    #      low number
    dots=$(echo "$dots/10"|bc)

    # Flushing page header
    cat <<EOF
@PJL SET PAGESTATUS=START$e
@PJL SET COPIES=1$e
@PJL SET MEDIASOURCE=$mediasource$e
@PJL SET MEDIATYPE=PLAINRECYCLE$e
@PJL SET PAPER=$pagesize$e
@PJL SET PAPERWIDTH=${x[0]}$e
@PJL SET PAPERLENGTH=${x[1]}$e
@PJL SET RESOLUTION=${resolution%x600}$e
@PJL SET IMAGELEN=$jsize$e
EOF

    cat $uid/raster.jbig

    # Flushing page footer
    # TODO: pixelcount for toner estimate
    cat <<EOF
@PJL SET DOTCOUNT=$dots$e
@PJL SET PAGESTATUS=END$e
EOF
}

function output_header() {
    cat <<EOF
%-12345X@PJL$e
@PJL SET TIMESTAMP=$ddate$e
@PJL SET FILENAME=Document$e
@PJL SET COMPRESS=JBIG$e
@PJL SET USERNAME=$user$e
@PJL SET COVER=OFF$e
@PJL SET HOLD=OFF$e
EOF
}

function output_footer() {
    cat <<EOF
@PJL EOJ$e
%-12345X
EOF
}

log "Called with cmdline: $0 $*"

trap "stop; trapINT" SIGINT SIGTERM SIGQUIT
#trap 'echo No' SIGINT SIGTERM SIGQUIT EXIT; 
# Username
user="$2"

# Page title (not used at this time, "Document" instead)
ptitle="$3"
my="$0"
options="$5"

pagesize="A4"
resolution="600"
mediasource="TRAY1"
for opt in $options; do
	case "$opt" in
		PageSize=*)
		pagesize="$(echo "${opt#PageSize=}" | tr a-z A-Z)"
		;;
	    	Resolution=*)
		resolution=${opt#Resolution=}
		resolution=${resolution%dpi}
		;;
		InputSlot=*)
		mediasource=${opt#InputSlot=}
		;;
	esac
done

# MS-style EOL
e=$(echo -en "\r")

# Printing date
ddate="`LC_ALL=en_US.UTF-8 date '+%Y/%m/%d %H:%M:%S'`"

# Temporary directory
uid="/tmp/pstoricohddst-gdi-`uuidgen`"
mkdir -p $uid
[ "${DEBUG}" = "yes" ] && exec >$uid/output.stream #> >(tee $uid/output.stream)

[ -x "$(which inotifywait)" ] && {
	log "Asynchronous variant"

	(
	stage="empty"
	inotifywait -q -m -r -e close_write --format '%f' $uid | grep --line-buffered 'page.pbm$' | while read page; do
	    log "Page submitted"
	    [ "$stage" = "empty" ] && {
		log "1st stage. Flushing PJL header"
		output_header
		stage="printing"
	    }
	    [ "$page" = "999999999-page.pbm" ] && { 
		log "Last stage. Flushing PJL footer"
		output_footer
		pid=`ps ax | grep $uid | grep -v grep | awk ' { print $1 } '`
		[ ! "x$pid" = "x" ] && kill $pid
		break
	    }
	    [ "$stage" = "printing" ] && {
		page=$uid/$page
		output_page
	    }
	done
	) &

	# Converting from PostScript to PostScript-monochrome, then to PBM image format (per page)
	#gs -sDEVICE=ps2write -sOutputFile=- -r$resolution -dQUIET -dBATCH -dNOPAUSE - | 
	gs -sDEVICE=pbmraw -sOutputFile=${uid}/%03d-page.pbm -r$resolution -dQUIET -dBATCH -dNOPAUSE -dNOSAFER -

	stop
	wait

	trapINT
} || {
	log "Synchronous variant"

	# Converting from PostScript to PostScript-monochrome, then to PBM image format (per page)
	log "Converting document to pages"
	gs -sDEVICE=ps2write -sOutputFile=- -r$resolution -dQUIET -dBATCH -dNOPAUSE - | gs -sDEVICE=pbmraw -sOutputFile=${uid}/%03d-page.pbm -r$resolution -dQUIET -dBATCH -dNOPAUSE -dNOSAFER -
	log "Conversion complete"

	output_header

	for page in ${uid}/*-page.pbm; do
	    output_page
	done

	# Flushing PJL footer
	output_footer

}

# only remove the output dir if not debugging
[ ! "${DEBUG}" = "yes" ] && rm -rf $uid;

exit 0
