#!/bin/bash -e

set -u

. $APPSH_HOME/.app/lib/app-conf

pid_file=$APPSH_APPS/.app/var/pid/$APPSH_NAME-$APPSH_INSTANCE.pid 
bin=`get_conf $APPSH_APPS $APPSH_NAME $APPSH_INSTANCE app.bin`

cd $APPSH_APPS/$APPSH_NAME/$APPSH_INSTANCE/current

if [ -z "$bin" ]
then
  echo "Missing required configuration: app.bin." >&2
  exit 1
fi

if [ ! -r "$bin" ]
then
  echo "No such file: $bin" >&2
  exit 1
fi

chmod +x "$bin"

PID=
if [ -r $pid_file ]
then
  PID="`cat $pid_file`"
fi

do_status() {
  if [ -z "$PID" ]
  then
    echo stopped
  else
    if [ `ps -p "$PID" 2>/dev/null | wc -l` -gt 1 ]
    then
      echo running
    else
      echo crashed
    fi
  fi
}

method_start() {
  case `do_status` in
    running)
      echo "The application is already running as $PID."
      exit 1
      ;;
  esac

  $bin <&- 1<&- 2<&- &

  PID=$!
  echo "Application launched as $PID"
  echo $PID > $pid_file

  return 0
}

method_stop() {
  case `do_status` in
    stopped)
      echo "The application not running."
      exit 1
      ;;
    crashed)
      echo "The application crashed. Was running as $PID"
      # TODO: should this remove the PID file?
      # That makes it possible to run "stop" to stop "status" from showing "crashed"
      exit 1
      ;;
  esac

  signal="-9"
  echo -n "Sending kill $signal to $PID, waiting for shutdown"
  kill $signal $PID

  while [ "`do_status`" == "running" ]
  do
    sleep 1
    echo -n "."
  done

  echo " OK"
  rm -f $pid_file
  return 0
}

method_status() {
  case `do_status` in
    running)
      echo "$APPSH_NAME/$APPSH_INSTANCE is running as $PID"
      ;;
    stopped)
      echo "$APPSH_NAME/$APPSH_INSTANCE is not running"
      ;;
    crashed)
      echo "$APPSH_NAME/$APPSH_INSTANCE crashed. Was running as $PID"
      ;;
  esac
}

case "$APPSH_METHOD" in
  start)  method_start ;;
  stop)   method_stop ;;
  status) method_status ;;
  *)      exit 1 ;;
esac

exit $?