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

cygwin=false
case "`uname`" in
    CYGWIN*) cygwin=true;;
esac

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

# Export this as PIO_HOME
export PIO_HOME="${FWDIR}"

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

. ${FWDIR}/bin/semver.sh

if [ -z "$1" ]; then
  echo "Usage: pio-class <class> [<args>]" 1>&2
  exit 1
fi

# Warn if log4j.properties is not present
if [ ! -f "$PIO_CONF_DIR/log4j.properties" ]; then
  echo -e "\033[0;35mWarning: log4j.properties is missing from $PIO_CONF_DIR\033[0m"
fi

# Make sure the Apache Spark version meets the prerequisite if it is a binary
# distribution
MIN_SPARK_VERSION="2.0.2"
if [ -z "$SPARK_HOME" ]; then
  echo -e "\033[0;31mSPARK_HOME must be set in conf/pio-env.sh, or in the environment!\033[0m"
  exit 1
elif [ -r "$SPARK_HOME/RELEASE" ]; then
  SPARK_VERSION=`head -n 1 $SPARK_HOME/RELEASE | awk '{print $2}'`
  if [ -z "$SPARK_VERSION" ]; then
    echo -e "\033[0;35m$SPARK_HOME contains an empty RELEASE file. This is a known problem with certain vendors (e.g. Cloudera). Please make sure you are using at least $MIN_SPARK_VERSION.\033[0m"
  elif semverLT ${SPARK_VERSION} ${MIN_SPARK_VERSION}; then
    echo -e "\033[0;31mYou have Apache Spark $SPARK_VERSION at $SPARK_HOME which does not meet the minimum version requirement of $MIN_SPARK_VERSION.\033[0m"
    echo -e "\033[0;31mAborting.\033[0m"
    exit 1
  fi
else
  echo -e "\033[0;35m$SPARK_HOME is probably an Apache Spark development tree. Please make sure you are using at least $MIN_SPARK_VERSION.\033[0m"
fi

# Find the java binary
if [ -n "${JAVA_HOME}" ]; then
  RUNNER="${JAVA_HOME}/bin/java"
else
  if [ `command -v java` ]; then
    RUNNER="java"
  else
    echo -e "\033[0;31mJAVA_HOME is not set\033[0m" >&2
    exit 1
  fi
fi

# Compute classpath using external script
classpath_output=$(${FWDIR}/bin/compute-classpath.sh)
if [[ "$?" != "0" ]]; then
  echo "$classpath_output"
  exit 1
else
  CLASSPATH=${classpath_output}
fi

if [ -z $PIO_LOG_DIR ] ; then
  PIO_LOG_DIR=$PIO_HOME/log
  touch $PIO_LOG_DIR/pio.log > /dev/null 2>&1
  if [ $? != 0 ] ; then
    PIO_LOG_DIR=/var/log/predictionio
    touch $PIO_LOG_DIR/pio.log > /dev/null 2>&1
    if [ $? != 0 ] ; then
      PIO_LOG_DIR=$HOME
    fi
  fi
fi

export CLASSPATH
export JAVA_OPTS="$JAVA_OPTS -Dpio.log.dir=$PIO_LOG_DIR"

exec "$RUNNER" -cp "$CLASSPATH" $JAVA_OPTS "$@"
