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

GEARPUMP_PID_DIR=""                                 # Directory to store *.pid files to
DEFAULT_ENV_PID_DIR="/tmp"                          # Default directory to store *.pid files to

GEARPUMP_LOG_DIR=""
DEFAULT_ENV_LOG_DIR="/tmp/gear-logs"

if [ "$GEARPUMP_PID_DIR" = "" ]; then
    GEARPUMP_PID_DIR=${DEFAULT_ENV_PID_DIR}
fi

if [ "$GEARPUMP_LOG_DIR" = "" ]; then
    GEARPUMP_LOG_DIR=${DEFAULT_ENV_LOG_DIR}
fi

bin=`dirname "$0"`
SYMLINK_RESOLVED=`cd "$bin"; pwd -P`

# Define the main directory of the gearpump installation
export GEAR_ROOT_DIR=`dirname "$SYMLINK_RESOLVED"`
export GEAR_BIN_DIR="$GEAR_ROOT_DIR/bin"
export GEAR_CONF_DIR="$GEAR_ROOT_DIR/conf"

readMasters() {
    MASTERS_FILE="${GEAR_CONF_DIR}/masters"

    if [[ ! -f "${MASTERS_FILE}" ]]; then
        echo "No masters file. Please specify masters in 'conf/masters'."
        exit 1
    fi

    MASTERS=()
    MASTERPORTS=()

    while IFS='' read -r line || [[ -n "$line" ]]; do
        HOSTPORT=$( extractHostName $line)

        if [ -n "$HOSTPORT" ]; then
            HOST=$(echo $HOSTPORT | cut -f1 -d:)
            PORT=$(echo $HOSTPORT | cut -s -f2 -d:)
            MASTERS+=(${HOST})

            if [ -z "$PORT" ]; then
                MASTERPORTS+=(3000)
            else
                MASTERPORTS+=(${PORT})
            fi
        fi
    done < "$MASTERS_FILE"
}

readWorkers() {
    WORKERS_FILE="${GEAR_CONF_DIR}/workers"

    if [[ ! -f "$WORKERS_FILE" ]]; then
        echo "No workers file. Please specify workers in 'conf/workers'."
        exit 1
    fi

    WORKERS=()

    while IFS='' read -r line || [[ -n "$line" ]];
    do
        HOST=$( extractHostName $line)
        if [ -n "$HOST" ]; then
            WORKERS+=(${HOST})
        fi
    done < "$WORKERS_FILE"
}

readDashboard() {
    DASHBOARD_FILE="${GEAR_CONF_DIR}/dashboard"

    if [[ ! -f "$DASHBOARD_FILE" ]]; then
        echo "No dashboard file. Please specify dashboard in 'conf/dashboard'."
        return
    fi

    DASHBOARD=""

    while IFS='' read -r line || [[ -n "$line" ]];
    do
        HOST=$( extractHostName $line)
        if [ -n "$HOST" ]; then
            DASHBOARD=${HOST}
            break
        fi
    done < "$DASHBOARD_FILE"
}

# Auxilliary function which extracts the name of host from a line which
# also potentially includes topology information and the taskManager type
extractHostName() {
    # handle comments: extract first part of string (before first # character)
    HOST=`echo $1 | cut -d'#' -f 1`

    # Extract the hostname from the network hierarchy
    if [[ "$HOST" =~ ^.*/([0-9a-zA-Z.-]+)$ ]]; then
            HOST=${BASH_REMATCH[1]}
    fi

    echo $HOST
}
