#!/usr/bin/env bash
#
# vim:et:ft=sh:sts=2:sw=2
#
#/**
# * Licensed to the Apache Software Foundation (ASF) under one
# * or more contributor license agreements.  See the NOTICE file
# * distributed with this work for additional information
# * regarding copyright ownership.  The ASF licenses this file
# * to you under the Apache License, Version 2.0 (the
# * "License"); you may not use this file except in compliance
# * with the License.  You may obtain a copy of the License at
# *
# *     http://www.apache.org/licenses/LICENSE-2.0
# *
# * Unless required by applicable law or agreed to in writing, software
# * distributed under the License is distributed on an "AS IS" BASIS,
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# * See the License for the specific language governing permissions and
# * limitations under the License.
# */
usage() {
    cat <<EOF
Usage: standalone <runtime> (up|down)
where runtime is one of:
    process          Run a standalone cluster in one process
    docker-compose   Run a standalone cluster in a docker-composed cluster
EOF
}

BINDIR=${BK_BINDIR:-"`dirname "$0"`"}

if [ $# -lt 2 ]
then
  echo "Error: no enough arguments provided."
  usage
  exit 1
fi

runtime=$1
shift
action=$1
shift

case $runtime in
  (process)
    ${BINDIR}/standalone.process $action $@
    ;;
  (docker-compose)
    DOCKER_COMPOSE=$(which docker-compose)
    if [ $? != 0 ]; then
      echo "Error: docker-compose is not found in ${PATH}." 1>&2
      usage
      exit 1
    else
      echo ${BINDIR}/standalone.docker-compose $action $@
      ${BINDIR}/standalone.docker-compose $action $@
    fi
    ;;
  (*)
    echo "Error: unknown runtime $command"
    usage
    exit 1
    ;;
esac
