#!/usr/bin/env bash

# USE: server-control.sh "x^2+y^2"  25  filename.png
# where ``25'' is the size

export MAIN_PIPE_NAME="bystrotex.fifo"
export  TMP_PIPE_NAME="tmp-bystrotex.fifo"

# this_script texstring size filename

start_server (){
    AMKHLV_CLASSPATH="$AMKHLV_JAVA_PATH:$JLATEXMATH_JAR"
    java -classpath  "$AMKHLV_CLASSPATH" LaTeXServer "$MAIN_PIPE_NAME" >&-  &
}

# procedure to see if the pipe is responding:
check_server (){
    export WAIT_N_SEC=$1 
    if [ -p "$MAIN_PIPE_NAME" ] ; then
        echo HI > "$MAIN_PIPE_NAME" & export ECHO_PID=$! 
        mkfifo "$TMP_PIPE_NAME"
        ( 
            sleep $WAIT_N_SEC & X=$! 
            echo $X > "$TMP_PIPE_NAME" 
            wait $X ; SLEPT_WELL=$?
            [ $SLEPT_WELL == 0 ] && kill $ECHO_PID 2>&-
        ) &
        SLEEP_PID="$( cat "$TMP_PIPE_NAME" )"
        rm "$TMP_PIPE_NAME"
        wait $ECHO_PID ; PIPE_STATUS_WAS=$?
        # at this point either our pipe started responding:
            if [ $PIPE_STATUS_WAS == 0 ] ; then
                cat "$MAIN_PIPE_NAME"
            else # or it was killed:
                echo PIPE_FAILED_TO_RESPOND
            fi
        kill "$SLEEP_PID" 2>&-
    else
        mkfifo "$MAIN_PIPE_NAME" 
        echo PIPE_FAILED_TO_RESPOND
    fi
}

WAIT_SECONDS=3

while [ $WAIT_SECONDS ] ; do
    CHECK_RESULT="$( check_server $WAIT_SECONDS 2>&- )"
    if [ "$CHECK_RESULT" != LISTENING ] ; then 
    # at this point our write to the pipe did not go through 
    # try to restart our Java server (or perhaps start it for the first time):
        if [ $WAIT_SECONDS -lt 10 ] ; then
            rm "$MAIN_PIPE_NAME" ; mkfifo "$MAIN_PIPE_NAME" ; start_server 
            WAIT_SECONDS=11
            # (we have assumed that Java should be able to start in 11 seconds...)
        else
            WAIT_SECONDS=""
            echo 0
            echo "$CHECK_RESULT" 1>&2 ; exit 1
        fi
    else
        cat > "$MAIN_PIPE_NAME" <<SEND_TO_SERVER
$( echo "$1" | tr "\n\r" "  " )
$( echo "$2" | tr -d "\n\r" )
$( echo "$3" | tr -d "\n\r" )
SEND_TO_SERVER
        RESULT="$(cat "$MAIN_PIPE_NAME")"
        if [ "$( echo "$RESULT" | grep ERROR )" ] ; then
            echo 0
            echo "$RESULT" 1>&2 ; exit 1 
        else
            echo "$RESULT"
            echo OK 1>&2
        fi
        # now want to get out of the while loop and finish the program:
        WAIT_SECONDS=""
    fi
done