#!/bin/bash -u

# set -x

# error message function (nested exit):
trap "exit 1" TERM
export ARB_SCRIPT_PID=$$
abort_script_with() {
    echo "`basename $0`: $@" 1>&2
    kill -s TERM $ARB_SCRIPT_PID
}

# find the installation path for this ARB (the ARBHOME)
get_arbhome() {
    # save cwd
    pushd . >/dev/null
    # full path of this script, but may be symlinked
    me="${BASH_SOURCE[0]}"
    # while me is symlink
    while [ -h "$me" ]; do
        # change to directory where symlink "$me" resides
        cd "$(dirname "$me")"
        # set $me to whatever $me links to
        me="$(readlink "$(basename "$me")")"
    done
    # me isn't a symlink, so the directory it resides in
    # must be the actual $ARBHOME/SH
    cd "$(dirname "$me")"
    # in $ARBHOME now
    cd ..
    echo -n "$PWD"
    # restore old cwd
    popd >/dev/null
}

# Add to the path variable named by $1 the component $2.  $3 must be
# "append" or "prepend" to indicate where the component is added.
addpath () {
    eval value=\"\$\{$1:-\}\"
    case "$value" in
	*:${2}:*|*:${2}|${2}:*|${2})
	    result="$value"
	    ;;
	"")
	    result="$2"
	    ;;
	*)
	    case "$3" in
		prepend)
		    result="$2:${value}"
		    ;;
		append)
		    result="${value}:$2"
		    ;;
		*)
		    abort_script_with "addpath expects param 'append' or 'prepend'"
		    ;;
	    esac
    esac
    eval "$1=\"$result\""
    unset result value
}

# convenience routine which appends a string to a path.
append () {
    if [ -n "${3:-}" ]; then
	    abort_script_with too many arguments to append: "\$3=$3"
    fi
    addpath "$1" "$2" append
}

# convenience routine which prepends a string to a path.
prepend () {
    if [ -n "${3:-}" ]; then
	    abort_script_with too many arguments to prepend: "\$3=$3"
    fi
    addpath "$1" "$2" prepend
}

if [ -z ${HOME:-} ]; then
    HOME=~
fi
export HOME

if [ -z ${DISPLAY:-} ]; then
    DISPLAY=:0
fi
export DISPLAY

# get absolute path to directory where this script resides
# (avoid use of readlink as it is missing on OSX)
ARBHOME_OF_SCRIPT="$(get_arbhome)"
ARB_SH="$ARBHOME_OF_SCRIPT/SH"
ARB_SCRIPT="$ARB_SH/arb"

export ARB_SH ARB_SCRIPT ARBHOME_OF_SCRIPT

if [ -n "${ARBHOME:-}" -a "${ARBHOME:-}" != "$ARBHOME_OF_SCRIPT" ]; then
    echo "Ignoring set ARBHOME '$ARBHOME' (overridden by explicit call of '$0')"
fi

# use ARBHOME defined by location of script (comment out for old behavior)
ARBHOME="$ARBHOME_OF_SCRIPT"

echo "Using ARBHOME='$ARBHOME'"

prepend PATH			"$ARBHOME/bin"
prepend LD_LIBRARY_PATH		"$ARBHOME/lib"
append  LD_LIBRARY_PATH		/usr/dt/lib
append  LD_LIBRARY_PATH		/usr/openwin/lib
append  LD_LIBRARY_PATH		"$ARBHOME/lib/addlibs"
prepend SHLIB_PATH		"$ARBHOME/lib"
append  SHLIB_PATH		"$ARBHOME/lib/addlibs"
append  PYTHONPATH      	"$ARBHOME/lib/python2.6"
append  PERl5LIB        	"$ARBHOME/lib/perl5"

# environment variables that this shell script sets/changes:
export LD_LIBRARY_PATH MANPATH PATH ARBHOME SHLIB_PATH
export PYTHONPATH PERL5LIB

# global envs:

export PWD HOME USER

if [ -x "$ARBHOME/bin/ghostview" ] ; then
  GS_LIB="$ARBHOME/DEPOT/ghostscript"
  export GS_LIB
fi

ARB_PID="$$"; export ARB_PID

if [ -z ${ARB_PROP:-} ]; then
    ARB_PROP="${HOME}/.arb_prop"
fi
echo "Using properties from $ARB_PROP"
if [ ! -d "${ARB_PROP}" ] ; then
  echo "Directory ${ARB_PROP} not found - creating ..."
  mkdir "${ARB_PROP}"
fi
export ARB_PROP

ARB_LOCAL_PTS="${HOME}/.arb_pts"
if [ ! -d "${ARB_LOCAL_PTS}" ] ; then
  echo "Directory ${ARB_LOCAL_PTS} not found - creating ..."
  mkdir "${ARB_LOCAL_PTS}"
fi

if [ -z ${ARBMACROHOME:-} ] ; then
  ARBMACROHOME="${ARB_PROP}/macros";
fi
if [ ! -d "${ARBMACROHOME}" ] ; then
  echo "Directory $ARBMACROHOME not found - creating ..."
  mkdir "${ARBMACROHOME}"
fi
export ARBMACROHOME

if [ -z "${ARBMACRO:-}" ] ; then
  ARBMACRO="$ARBHOME/lib/macros"
fi
if [ ! -d "${ARBMACRO}" ] ; then
  echo "Directory $ARBMACRO not found - creating ..."
  mkdir "${ARBMACRO}"
fi
export ARBMACRO

# set default command-tool used by ARB
ARB_XTERM=${ARB_XTERM:-xterm -sl 1000 -sb -geometry 150x60}
export ARB_XTERM
ARB_XCMD=${ARB_XCMD:-$ARB_XTERM -e}
export ARB_XCMD

# save LD_LIBRARY_PATH
ARB_LIBRARY_PATH="${LD_LIBRARY_PATH}"
export ARB_LIBRARY_PATH

case "${1:-}" in
  help|-h|--help)
    arb_ntree --help
    echo ""
    echo ""
    echo "arb - script to start arb"
    echo "Usage:"
    echo "       arb                  # startup arb intro window"
    echo "       arb [ntargs]         # start arb with arguments"
    echo "       arb shell            # startup arb environment, but do not run arb"
    echo "       arb help             # show help"
    echo "       arb trace [ntargs]   # trace arb (to detect errors)"
    echo ""
    echo "ntargs are any argument allowed to arb_ntree (see above)"
    echo ""
    echo ""
  ;;
  shell)
    echo "Opening an ARB shell"
    if [ -n "$SHELL" ]; then
        $SHELL
    else
        bash -i
    fi
    echo "ARB shell terminates"
  ;;
  trace)
    shift
    arb_launcher $ARBHOME/SH/arb_trace "$@"
  ;;
  *)
    echo "Please wait while the program ARB is starting ....."
    arb_launcher arb_ntree "$@"
esac