REDIS_PORTS=(7379 7380 6379)
REDIS_UNIX_SOCKET_PREFIX="/tmp/redis_unix"
TWEMPROXY_PIDFILE="/tmp/twemproxy_backend_tests.pid"
POSTGRES_PIDFILE="/tmp/postgres_backend_tests.pid"

# helper for daemonizing processes from the shell
function daemonize {
    (nohup "$@" 0<&- &> /dev/null & echo $!) &
}

function kill_pidfile {
    local file="$1"
    kill_pid `cat "${file}"`
    rm -f "${file}"
}

function kill_pid {
    kill -TERM "${1}" 2> /dev/null & sleep 2
    kill -9 "${1}" 2> /dev/null
}

function start_redis {
    if [ -e /usr/local/bin/redis-server ]; then
	cmd="/usr/local/bin/redis-server"
    elif [ -e /usr/bin/redis-server ]; then
	cmd="/usr/bin/redis-server"
    else
	cmd="/opt/redis/bin/redis-server"
    fi
     for port in "${REDIS_PORTS[@]}"
    do
        $cmd --port "$port" --unixsocket "${REDIS_UNIX_SOCKET_PREFIX}.$port.sock" --unixsocketperm 775 --logfile "/tmp/redis.$port.log" --daemonize yes
    done
}

function stop_redis {
    local pids
    for port in "${REDIS_PORTS[@]}"; do
	kill_pid `ps aux | grep redis-server | grep "$port" | awk '{ print $2 }'` &
	pids[${port}]=$!
    done
    wait ${pids[*]}
}

function start_twemproxy {
    # try to locate the config dir
    local configdir
    local basedir="${SCRIPT_DIR:-$(pwd -P)}"
    if [ -r ${basedir}/config/twemproxy.yml ]; then
        configdir="${basedir}/config"
    elif [ -r ${basedir}/script/config/twemproxy.yml ]; then
        configdir="${basedir}/script/config"
    else
        configdir="/vagrant/script/config"
    fi
    /opt/twemproxy/sbin/nutcracker -m 512 -o /tmp/nutcracker-$(date +"%Y%m%d%H%M%S").log -p "${TWEMPROXY_PIDFILE}" -d -c ${configdir}/twemproxy.yml
}

function stop_twemproxy {
    kill_pidfile ${TWEMPROXY_PIDFILE}
}

function start_postgresql {
    daemonize sudo -u postgres sh -c '/usr/lib/postgresql/9.5/bin/pg_ctl -D /usr/local/pgsql/data start' > /dev/null
}

function stop_postgresql {
    sudo kill -TERM `sudo head -1 /usr/local/pgsql/data/postmaster.pid`
}

function start_services {
    start_postgresql
    start_redis
    start_twemproxy
}

function stop_services {
    local pids
    for fn in stop_redis stop_twemproxy stop_postgresql; do
	eval "${fn}" &
	pids[${fn}]=$!
    done
    wait ${pids[*]}
}

bundle_cmd() {
  local version="${1:-}"
  local version_spec="${version:+_${version}_}"
  echo "bundle ${version_spec}"
}

bundled_with() {
  local lockfile="${1:-${BUNDLE_GEMFILE:-Gemfile}.lock}"
  cat ${lockfile} | grep -A 1 "^BUNDLED WITH$" | tail -n 1 | sed -e 's/\s//g'
}

bundle_exec() {
  $(bundle_cmd $(bundled_with)) exec "$@"
}
