#!/bin/sh
#?
#? NAME
#?      $0 - simple wrapper to call  o-saft.pl or o-saft.tcl
#?
#? SYNOPSIS
#?      $0 [options] target
#?
#? DESCRIPTION
#?      Calls  o-saft.pl or o-saft.tcl  with all specified arguments.
#?      o-saft.pl's  output is piped to the command specified with the  -post=
#?      option. The program given there must be located in contrib/ directory,
#?      or must be found via  PATH  environment variable. The default is  cat,
#?      which means that all output is on  STDOUT.
#?
#? OPTIONS
#?      -h      got it
#       -help   got it
#?      -n      just show command to be executed
#?      -help=* grep for *  in 'o-saft.pl --help'
# TODO: should also grep in --help=commads and some other programs
#?      -list   list available programs in ./contrib/ directory
#?      -cli    start o-saft.pl  with remaining arguments; this is the default
#?      -cgi    start o-saft.cgi with remaining arguments
#?      -gui    start o-saft.tcl with remaining arguments
#       -tcl    alias for -gui
#?      -docker start o-saft-docker with remaining arguments
#?      -id=*   passed to o-saft-docker
#?      -tag=*  passed to o-saft-docker
#       -prg="program"
#               use program instead of  o-saft.pl; intended for debugging only
#?      -post="program [options]"
#?              program to pipe output of  o-saft.pl  to
#?      -colour alias for  -post=bunt.pl
#?      -blind  alias for  -post='bunt.pl -blind'
#?      --      pass all remaining arguments to  o-saft.pl  or  o-saft.tcl
#?
#? LIMITATIONS
#?      All option listed above must preceed options to be passed through.
#?      $0  must be install in the same directory as the tools it will call
#?          $0.pl  $0.cgi  $0.tcl
#?
#?      Option  +VERSION  prints version of this program  and not the version
#?      of  o-saft.pl .
#?
#?      Automatic detection of GUI mode fails, if the starter in the desktop's
#?      panel (or whatever functionality is used) uses a terminal.
#?
#? EXAMPLES
#?          $0 +cmd --option target
#?          $0 -post='bunt.pl'      ' +cmd --option target
#?          $0 -post='bunt.pl -blind' +cmd --option target
#?          $0 -colour                +cmd --option target  # same as above
#?          $0 -gui target
#           $0 -prd=yeast.pl  +cmd   target
#?
#?          $0 -docker +cmd --option target
#?          $0 -docker -post='bunt.pl'      ' +cmd --option target
#?          $0 -docker -post='bunt.pl -blind' +cmd --option target
#?          $0 -docker -gui target
#?
#?      Specify program to execute script (if hashbang in file fails):
#?          $0 -docker -post='perl contrib/bunt.pl' ' +cmd --option target
#?
# 
# Hacker's INFO
#       Uses options  -h  and  -post=  and not  --h  or  --help  or  --post  to
#       avoid conflicts with same option for  o-saft.pl .
#
#? VERSION
#?      @(#) o-saft 1.24 21/01/15 00:34:03
#?
#? AUTHOR
#?      17-dec-17 Achim Hoffmann
#?
# -----------------------------------------------------------------------------

ich=${0##*/}
dir=${0%/*};    [ "$dir" = "$0" ] && dir="."    # $0 found via $PATH in .
prg=$dir/$ich.pl     # most likely ich=o-saft  ..
gui=$dir/$ich.tcl
cgi=$dir/$ich.cgi
dok=$dir/$ich-docker
    # all tools are prefix with the path $dir to avoid incomplete $PATH settings
    # then check (below) if tools exists, if not, remove path and rely on $PATH
[ ! -x "$prg" ] && prg=$ich.pl
[ ! -x "$gui" ] && gui=$ich.tcl
[ ! -x "$cgi" ] && cgi=$ich.cgi
[ ! -x "$dok" ] && dok=$ich-docker

contrib=$dir/contrib
try=
post="cat"      # default, avoids special handling if -post= missing
post_args=
    # aguments passed to post command, mainly used for -help=
such=
    # text to be searched for passed to post command, mainly used for -help=
mode=cli        # cli, cgi, gui
docker=0        # cli or gui mode; cannot use $mode because it is needed for docker too
docker_id=
docker_tag=

#dbx# echo "#################" >> /tmp/t.o-saft.log
#dbx# [ -t 0 ] &&echo 0 STDIN  >> /tmp/t.o-saft.log
#dbx# [ -t 1 ] &&echo 1 STDOUT >> /tmp/t.o-saft.log
#dbx# [ -t 2 ] &&echo 2 STDERR >> /tmp/t.o-saft.log

[ -t 0 ] || mode=gui    # no STDIN, assuming start from desktop, hence GUI

while [ $# -gt 0 ]; do
    case "$1" in
        -help | -h  | '-?')
            \sed -ne "s/\$0/$ich/g" -e '/^#?/s/#?//p' $0
            \cat <<EoT
 NOTE
    To get help for  o-saft.pl, please use:
        $0 --help
    or
        o-saft.pl --help

EoT
            exit 0
            ;;
        +VERSION)       echo "1.24"; exit 0; ;;
        -help=*)
            such="`expr "$1" ':' '-help=\(.*\)'`"
            args="--help"
            post=egrep
            post_args="--color -i -C 3 "
            ;;
        -list)
            for exe in $contrib/* ; do
                [ -d "$exe" ] && continue
                [ -x "$exe" ] && echo "$exe"
            done
            exit 0
            ;;
        -n      | --n)      try=echo    ; ;;
        -cgi    | --cgi)    mode=cgi    ; ;;
        -cli    | --cli)    mode=cli    ; ;;
        -gui    | --gui)    mode=gui    ; ;;
        -tcl    | --tcl)    mode=gui    ; ;;
        -docker | --docker) docker=1    ; ;;
        -id*)           docker_id="$1"  ; ;;
        -tag*)          docker_tag="$1" ; ;;
        -colour | --colour) post="$contrib/bunt.pl" ; ;;
        -color  | --color)  post="$contrib/bunt.pl" ; ;;
        -blind  | --blind)  post="$contrib/bunt.pl -blind" ; ;;
        -prg=*) prg="`expr "$1" ':' '-prg=\(.*\)'`" ; ;;  # for debugging only
        -post=*)
            post="`expr "$1" ':' '-post=\(.*\)'`" ;
            cmd=`echo "$post" | awk '{print $1}'`   # remove additional trailing arguments
            [ -x "$contrib/$cmd" ] && post="$contrib/$post"
            shift
            break
            ;;
        --post=*)
            post="`expr "$1" ':' '--post=\(.*\)'`" ;
            cmd=`echo "$post" | awk '{print $1}'`   # remove additional trailing arguments
            [ -x "$contrib/$cmd" ] && post="$contrib/$post"
            shift
            break
            ;;
        --) shift; break; ;;
        *)  break; ;;
    esac
    shift
done

# Note: using $* (instead of $@) does not contain parsed options
[ -n "$try" ] && echo "# docker=$docker, mode=$mode, post=$post, $*#"

# docker mode is special
if [ $docker -eq 1 ]; then
    if [ -n "$osaft_vm_build" ]; then
        echo "**WARNING: option -docker ignored inside VM; exit"
    else
        echo $dok $docker_id $docker_tag -$mode -post=$post $*
        [ -n "$try" ] && exit 0
             $dok $docker_id $docker_tag -$mode -post=$post $*
        exit $?
    fi
fi

# all other modes
case "$mode" in
    cgi) $try $cgi --cgi $* | $post  ; ;;
    gui) $try $gui --post="$post" $* ; ;;
    *)   echo "$prg $docker_id $docker_tag $* $args | $post $post_args  $such"
         [ -n "$try" ] && exit 0
         # some shell behave strange when quotes are needed (for $such here)
         # hence different command lines are needed wether $such is empty or not
         if [ -n "$such" ]; then
               $prg $docker_id $docker_tag $* $args | $post $post_args "$such"
         else
               $prg $docker_id $docker_tag $* $args | $post $post_args
         fi
         ;;
esac
exit 0


# NOTE: $gui
#       all parameters are passed to $gui, even they are not yet (2018) used
#       properly, but most likely treated as hostname
