#!/bin/bash

declare BrokerPid=
declare BrokerCfg=
declare TmpP4ROOT=$HMS_TEST_HOME/tmp/.p4root
declare -i Debug=1

function msg () { echo -e "$*"; }
function dbg () { [[ $Debug -eq 1 ]] || return; echo -e "DEBUG: $*" >&2; }
function cmd () { msg "Executing: $*"; $*; return $?; }
function bail () { msg "\nError: ${1:-Unknown Error}\n"; exit ${2:-1}; }

function get_broker_pid () {
   pid=$(ps -ef | grep "$P4BROKERBIN" | grep -v " grep " | \
      awk '{print $2}' | head -1)
   echo $pid
}

source ./env.sh
BrokerCfg="$HMS_TEST_HOME/broker.cfg"

case ${1:-status} in
   (start)
      if [[ -r "$BrokerCfg" ]]; then
         msg "Using existing $BrokerCfg."
      else
         msg "Generating $BrokerCfg from template."
         if ! sed -e "s:__HMS_SCRIPTS__:$HMS_SCRIPTS:g" -e "s:__P4PORT__:$P4PORT:g" -e "s:__P4BROKERPORT__:$P4BROKERPORT:g" -e "s:__HMS_TEST_HOME__:$HMS_TEST_HOME:g" "${BrokerCfg}.t" > "$BrokerCfg"; then
            bail "Failed to generate broker config."
         fi
      fi

      cd "$HMS_TEST_HOME" || bail "Failed to cd to $HMS_TEST_HOME."
      cmd "$P4BROKERBIN" -c "$BrokerCfg" -q -d

      # Start a helper p4d.  It does nothing, but needs to be running,
      # otherwise the broker can't do anything except a 'reject' or
      # 'redirect' action.
      unset P4JOURNAL P4AUDIT P4DEBUG P4CHANGE P4AUTH P4LOG
      rm -rf $TmpP4ROOT
      mkdir -p $TmpP4ROOT
      cmd p4d -r $TmpP4ROOT -p $P4PORT -q --daemonsafe --pid-file
   ;;

   (stop)
      if [[ -r "$TmpP4ROOT/server.pid" ]]; then
         msg "Killing helper p4d."
         cmd kill $(cat $TmpP4ROOT/server.pid)
      else
         msg Helper p4d was not running.
      fi

      BrokerPid=$(get_broker_pid)

      if [[ -n "$BrokerPid" ]]; then
         msg "Killing broker."
         cmd kill $BrokerPid

      else
         msg Broker was not running.
      fi

   ;;

   (status)
      if [[ -r "$TmpP4ROOT/server.pid" ]]; then
         msg "Helper p4d appears to be running."
      else
         msg "Helper p4d is not running."
      fi

      BrokerPid=$(get_broker_pid)

      if [[ -n "$BrokerPid" ]]; then
         msg Broker is running as pid $BrokerPid.
      else
         msg Broker is not running.
      fi
   ;;

   (clean)
      msg "Removing: $TmpP4ROOT"
      rm -rf "$TmpP4ROOT"
      msg "Removing: $BrokerCfg"
      rm -f "$BrokerCfg"
   ;;

   (*)
      msg "\nUsage:\n\t${0##*/} {start|stop|status}\n"
   ;;
esac
