#!/bin/bash -xe

# basic reference point for things like filecache
#
# TODO(sdague): once we have a few of these I imagine the download
# step can probably be factored out to something nicer
TOP_DIR=$(cd $(dirname "$0")/.. && pwd)
FILES=$TOP_DIR/files
source $TOP_DIR/stackrc

# Package source and version, all pkg files are expected to have
# something like this, as well as a way to override them.
ELASTICSEARCH_VERSION=${ELASTICSEARCH_VERSION:-1.7.5}
ELASTICSEARCH_BASEURL=${ELASTICSEARCH_BASEURL:-https://download.elasticsearch.org/elasticsearch/elasticsearch}

# Elastic search actual implementation
function wget_elasticsearch {
    local file=${1}

    if [ ! -f ${FILES}/${file} ]; then
        wget $ELASTICSEARCH_BASEURL/${file} -O ${FILES}/${file}
    fi

    if [ ! -f ${FILES}/${file}.sha1.txt ]; then
        wget $ELASTICSEARCH_BASEURL/${file}.sha1.txt -O ${FILES}/${file}.sha1.txt
    fi

    pushd ${FILES};  sha1sum ${file} > ${file}.sha1.gen;  popd

    if ! diff ${FILES}/${file}.sha1.gen ${FILES}/${file}.sha1.txt; then
        echo "Invalid elasticsearch download. Could not install."
        return 1
    fi
    return 0
}

function download_elasticsearch {
    if is_ubuntu; then
        wget_elasticsearch elasticsearch-${ELASTICSEARCH_VERSION}.deb
    elif is_fedora || is_suse; then
        wget_elasticsearch elasticsearch-${ELASTICSEARCH_VERSION}.noarch.rpm
    fi
}

function configure_elasticsearch {
    # currently a no op
    :
}

function _check_elasticsearch_ready {
    # poll elasticsearch to see if it's started
    if ! wait_for_service 30 http://localhost:9200; then
        die $LINENO "Maximum timeout reached. Could not connect to ElasticSearch"
    fi
}

function start_elasticsearch {
    if is_ubuntu; then
        sudo /etc/init.d/elasticsearch start
        _check_elasticsearch_ready
    elif is_fedora; then
        sudo /bin/systemctl start elasticsearch.service
        _check_elasticsearch_ready
    elif is_suse; then
        sudo /usr/bin/systemctl start elasticsearch.service
        _check_elasticsearch_ready
    else
        echo "Unsupported architecture...can not start elasticsearch."
    fi
}

function stop_elasticsearch {
    if is_ubuntu; then
        sudo /etc/init.d/elasticsearch stop
    elif is_fedora; then
        sudo /bin/systemctl stop elasticsearch.service
    elif is_suse ; then
        sudo /usr/bin/systemctl stop elasticsearch.service
    else
        echo "Unsupported architecture...can not stop elasticsearch."
    fi
}

function install_elasticsearch {
    pip_install_gr elasticsearch
    if is_package_installed elasticsearch; then
        echo "Note: elasticsearch was already installed."
        return
    fi
    if is_ubuntu; then
        is_package_installed default-jre-headless || install_package default-jre-headless

        sudo dpkg -i ${FILES}/elasticsearch-${ELASTICSEARCH_VERSION}.deb
        sudo update-rc.d elasticsearch defaults 95 10
    elif is_fedora; then
        is_package_installed java-1.8.0-openjdk-headless || install_package java-1.8.0-openjdk-headless
        yum_install ${FILES}/elasticsearch-${ELASTICSEARCH_VERSION}.noarch.rpm
        sudo /bin/systemctl daemon-reload
        sudo /bin/systemctl enable elasticsearch.service
    elif is_suse; then
        is_package_installed java-1_8_0-openjdk-headless || install_package java-1_8_0-openjdk-headless
        zypper_install --no-gpg-checks ${FILES}/elasticsearch-${ELASTICSEARCH_VERSION}.noarch.rpm
        sudo /usr/bin/systemctl daemon-reload
        sudo /usr/bin/systemctl enable elasticsearch.service
    else
        echo "Unsupported install of elasticsearch on this architecture."
    fi
}

function uninstall_elasticsearch {
    if is_package_installed elasticsearch; then
        if is_ubuntu; then
            sudo apt-get purge elasticsearch
        elif is_fedora; then
            sudo yum remove elasticsearch
        elif is_suse; then
            sudo zypper rm elasticsearch
        else
            echo "Unsupported install of elasticsearch on this architecture."
        fi
    fi
}

# The PHASE dispatcher. All pkg files are expected to basically cargo
# cult the case statement.
PHASE=$1
echo "Phase is $PHASE"

case $PHASE in
    download)
        download_elasticsearch
        ;;
    install)
        install_elasticsearch
        ;;
    configure)
        configure_elasticsearch
        ;;
    start)
        start_elasticsearch
        ;;
    stop)
        stop_elasticsearch
        ;;
    uninstall)
        uninstall_elasticsearch
        ;;
esac