#!/usr/bin/env 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.
#

# Convenience script for stopping all default dependent services in a single
# node scenario.

# Figure out where PredictionIO is installed
export PIO_HOME="$(cd `dirname $0`/..; pwd)"

. ${PIO_HOME}/bin/load-pio-env.sh

SOURCE_TYPE=$PIO_STORAGE_REPOSITORIES_METADATA_SOURCE
SOURCE_TYPE=$SOURCE_TYPE$PIO_STORAGE_REPOSITORIES_EVENTDATA_SOURCE
SOURCE_TYPE=$SOURCE_TYPE$PIO_STORAGE_REPOSITORIES_MODELDATA_SOURCE

# PredictionIO Event Server
echo "Stopping PredictionIO Event Server..."
PIDFILE=${PIO_HOME}/eventserver.pid
if [ -e ${PIDFILE} ]; then
  cat ${PIDFILE} | xargs kill
  rm ${PIDFILE}
fi

# HBase
if [ `echo $SOURCE_TYPE | grep -i hbase | wc -l` != 0 ] ; then
  echo "Stopping HBase..."
  if [ -n "$PIO_STORAGE_SOURCES_HBASE_HOME" ]; then
    $PIO_STORAGE_SOURCES_HBASE_HOME/bin/stop-hbase.sh
  fi
fi

# Elasticsearch
if [ `echo $SOURCE_TYPE | grep -i elasticsearch | wc -l` != 0 ] ; then
  echo "Stopping Elasticsearch..."
  PIDFILE=${PIO_HOME}/es.pid
  if [ -e ${PIDFILE} ]; then
    cat ${PIDFILE} | xargs kill
    rm ${PIDFILE}
  fi
fi

#PGSQL
if [ `echo $SOURCE_TYPE | grep -i pgsql | wc -l` != 0 ] ; then
  if [ -n "$PIO_STORAGE_SOURCES_PGSQL_TYPE" ]; then
    OS=`uname`
    if [[ "$OS" = "Darwin" ]]; then
      pg_cmd=`which pg_ctl`
      if [[ "$pg_cmd" != "" ]]; then
        pg_ctl -D /usr/local/var/postgres stop -s -m fast
      fi
    elif [[ "$OS" = "Linux" ]]; then
      sudo service postgresql stop
    else
      echo -e "\033[1;31mYour OS $OS is not yet supported for automatic postgresql startup:(\033[0m"
      echo -e "\033[1;31mPlease do a manual shutdown!\033[0m"
      exit 1
    fi
  fi
fi
