#!/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" >&-  &
}

wait_and_kill (){ # $1 is secs to sleep, $2 is PID to kill
    sleep $1 & X=$!
    echo $X
    wait $X 2>&- ; SLEPT_WELL=$?
    [ $SLEPT_WELL == 0 ] && kill $2 2>&-
}

# 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=$! 
        coproc HITMAN { 
            wait_and_kill  $WAIT_N_SEC  $ECHO_PID
            read  # this is to lock the coproc 
        }
        read SLEEP_PID 0<&${HITMAN[0]}
        wait $ECHO_PID 2>&- ; PIPE_STATUS_WAS=$?
        # at this point either our pipe started responding:
        if [ $PIPE_STATUS_WAS == 0 ] ; then
            kill $SLEEP_PID  2>&-
            echo goaway 1>&${HITMAN[1]} # to release the coproc lock
            wait $HITMAN_PID 2>&-
            cat "$MAIN_PIPE_NAME" & export CAT_PID=$!
            coproc TERMINATOR {
                wait_and_kill 2 $CAT_PID
                read  # this is to lock the coproc 
            }
            read SLEEP_PID 0<&${TERMINATOR[0]}
            wait $CAT_PID   2>&- ; 
            ANSWR_PIPE_STATUS_WAS=$?
            if [ $ANSWR_PIPE_STATUS_WAS != 0 ] ; then
                echo "PIPE_FAILED_TO_RESPOND"
            fi
            kill $SLEEP_PID  2>&-
            echo goaway 1>&${TERMINATOR[1]} # to release the coproc lock
            wait $TERMINATOR_PID 2>&-
        else # or it was killed:
            kill $SLEEP_PID  2>&-
            echo goaway 1>&${HITMAN[1]} # to release the coproc lock
            wait $HITMAN_PID 2>&-
            echo "PIPE_FAILED_TO_RESPOND"
        fi
    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 either our write to the pipe did not go through 
    # or we got wrong response;
    # 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