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

SERVER_TYPE=""
TEST_RUN_COUNT=10
COMMAND_REPETITION_COUNT=100000
REDIS_HOST=localhost
REDIS_PORT=6379
FILE_PREFIX=""

while getopts ":f:rgt:c:h:p:" opt; do
  case ${opt} in
  r)
    SERVER_TYPE='redis'
    ;;
  g)
    SERVER_TYPE='geode'
    ;;
  f)
    FILE_PREFIX=${OPTARG}
    ;;
  t)
    TEST_RUN_COUNT=${OPTARG}
    ;;
  c)
    COMMAND_REPETITION_COUNT=${OPTARG}
    ;;
  h)
    REDIS_HOST=${OPTARG}
    ;;
  p)
    REDIS_PORT=${OPTARG}
    ;;
  \?)
    echo "Usage: ${0} -r (Redis) | -g (Geode) [-h host] [-p port] [-t (test run count)] [-c (command repetition count)]"
    exit 0
    ;;
  :)
    echo "Invalid option: $OPTARG requires an argument" 1>&2
    exit 1
    ;;
  esac
done

if [ -z ${SERVER_TYPE} ]; then
  echo "Please specify native Redis (-r) or Geode Redis (-g)"
  exit 1
fi

SCRIPT_DIR=$(
  cd $(dirname $0)
  pwd
)

function kill_geode() {
  pkill -9 -f ServerLauncher || true
  pkill -9 -f LocatorLauncher || true
  rm -rf server1
  rm -rf locator1
}

nc -zv ${REDIS_HOST} ${REDIS_PORT} 1>&2
SERVER_NOT_FOUND=$?

if [ ${SERVER_TYPE} == "geode" ]; then
  if [ ${SERVER_NOT_FOUND} -eq 0 ]; then
    echo "Redis server detected already running at port ${REDIS_PORT}}"
    echo "Please stop sever before running this script"
    exit 1
  fi

  GEODE_BASE=$(
    cd $SCRIPT_DIR/../../..
    pwd
  )

  cd $GEODE_BASE

  kill_geode

  ./gradlew devBuild installD

  GFSH=$PWD/geode-assembly/build/install/apache-geode/bin/gfsh

  $GFSH -e "start locator --name=locator1"

  $GFSH -e "start server
          --name=server1
          --log-level=none
          --locators=localhost[10334]
          --server-port=0
          --redis-port=6379
          --redis-bind-address=127.0.0.1"
else
  if [ ${SERVER_NOT_FOUND} -eq 1 ]; then
    echo "No Redis server detected on host '${REDIS_HOST}' at port '${REDIS_PORT}'"
    exit 1
  fi
fi

cd ${SCRIPT_DIR}

if [ -z ${FILE_PREFIX} ]; then
  ./benchmark.sh -h ${REDIS_HOST} -p ${REDIS_PORT} -t "${TEST_RUN_COUNT}" -c "${COMMAND_REPETITION_COUNT}"
else
  ./benchmark.sh -f ${FILE_PREFIX} -h ${REDIS_HOST} -p ${REDIS_PORT} -t "${TEST_RUN_COUNT}" -c "${COMMAND_REPETITION_COUNT}"
fi

if [ ${SERVER_TYPE} == "geode" ]; then
  kill_geode
  sleep 1 # Back to back runs need this delay or 'nc' doesn't detect shutdown correctly
fi
