#!/bin/bash
# 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.
set -o errexit

bold=$(tput bold)
normal=$(tput sgr0)
c_name="heron-sandbox"

check_docker_install() {
  if ! [[ $(which docker) && $(docker --version) ]]; then
    echo "Docker is not currently installed on your system"
    exit 1
  fi
}

sandbox_start() {
  docker run -d -p 8889:8889 -p 9000:9000 --name=$c_name $1 > /dev/null
  echo "${bold}The Heron Sandbox is up and running ${normal}"
}

sandbox_ps() {
  docker ps -f name=$c_name
}

sandbox_clogs() {
  docker logs $c_name
}

sandbox_shell() {
  echo "${bold}Starting the Heron Sandbox shell${normal}"
  docker exec -it $c_name /bin/bash
  EXIT_CODE=$?
  if [ $EXIT_CODE -ne 0 ]; then
    echo "Unable to create a shell session for the container '$c_name'"
    exit 1
  fi
  echo "${bold}Terminating the Heron Sandbox shell${normal}"
}

sandbox_stop() {
  docker stop $c_name > /dev/null 2>&1
  EXIT_CODE=$?
  if [ $EXIT_CODE -ne 0 ]; then
    echo "Unable to stop the container '$c_name'"
    exit 1
  fi
  docker rm -f -v $c_name > /dev/null 2>&1
  EXIT_CODE=$?
  if [ $EXIT_CODE -ne 0 ]; then
    echo "Unable to remove the container '$c_name'"
    exit 1
  fi
  echo "${bold}The Heron Sandbox has been successfully shut down${normal}"
}

check_docker_install

case $1 in
  start)
    DOCKER_IMAGE=${2:-heron/heron:latest}
    sandbox_start $DOCKER_IMAGE
    ;;
  ps)
    sandbox_ps
    ;;
  clogs)
    sandbox_clogs
    ;;
  stop)
    sandbox_stop
    ;;
  shell)
    sandbox_shell
    ;;
  help|*)
    echo "  "
    echo "${bold}The Heron Sandbox CLI tool${normal}"
    echo "=========================="
    echo "  "
    echo "The Heron Sandbox is a version of Heron that runs inside of a single Docker container."
    echo "Example topologies are included inside the container as well, making the Heron Sandbox"
    echo "an ideal tool for initial experimentation with Heron."
    echo "  "
    echo "${bold}Starting and shutting down the Heron Sandbox${normal}"
    echo "  "
    echo "  ${bold}Start${normal} the Heron Sandbox:"
    echo "    $0 start"
    echo "  "

    echo "  ${bold}Shut down${normal} the Heron Sandbox:"
    echo "    $0 stop"
    echo "  "

    echo "  ${bold}Check${normal} if the Heron Sandbox is running:"
    echo "    $0 ps"
    echo "  "

    echo "${bold}Example topologies included with the Heron Sandbox${normal}"
    echo "  "
    echo "  Heron ${bold}Java API${normal} example topologies are available in:"
    echo "    /heron/examples/heron-api-examples.jar"
    echo "  "

    echo "  Heron ${bold}Java Streamlet API${normal} example topologies are available in:"
    echo "    /heron/examples/heron-streamlet-examples.jar"
    echo "  "

    echo "  Heron ${bold}Java ECO${normal} example topologies are available in:"
    echo "    /heron/examples/heron-eco-examples.jar"
    echo "  "

    echo "${bold}Experimenting with the examples in the Heron Sandbox${normal}"
    echo "  "
    echo "  First, ${bold}open a shell session${normal} to play with example topologies:"
    echo "    $0 shell"
    echo "  "
    echo "      ${bold}NOTE${normal}: Make sure Docker is running on your machine first. See instructions"
    echo "            here: https://docs.docker.com/machine/get-started"
    echo "  "

    echo "  Then you can ${bold}submit${normal} a topology via the shell:"
    echo "    heron submit sandbox /heron/examples/heron-api-examples.jar org.apache.heron.examples.api.ExclamationTopology exclamation"
    echo "  "

    echo "  You can ${bold}deactivate${normal} the topology via the shell as well:"
    echo "    heron deactivate sandbox exclamation"
    echo "  "

    echo "  To ${bold}activate${normal} a deactivated topology:"
    echo "    heron activate sandbox exclamation"
    echo "  "

    echo "  Finally, you can ${bold}kill${normal} a topology and remove it from the cluster:"
    echo "    heron kill sandbox exclamation"
    echo "  "

    exit 1
    ;;
esac
