#!/usr/bin/env bash

set -e

PROJECT_NAME=dm
BUILD_TYPE=Release
INSTALL_PATH=/usr/sbin

pop_directory()
{
    popd >/dev/null
}

push_directory()
{
    local DIRECTORY="$1"

    pushd "$DIRECTORY" >/dev/null
}

display_heading_message()
{
    echo
    echo "********************** $@ **********************"
    echo
}

display_message()
{
    echo "$@"
}

display_error()
{
    >&2 echo "$@"
}

display_help()
{
    display_message "Usage: ./deploy [OPTION]..."
    display_message "Manage the configure."
    display_message "Script options:"
    display_message "  --help                   Display usage, overriding script execution."
    display_message "  --install                Install $PROJECT_NAME (run as root)."
    display_message "  --update                 Update $PROJECT_NAME (run as root)."
    display_message "  --release                Release build (default)."
    display_message "  --debug                  Debug build."
    display_message "  --build-dir=<path>       Location of build files (default: $BUILD_DIR)."
    display_message ""
}

display_configuration()
{
    display_message "Configuration."
    display_message "--------------------------------------------------------------------"
    display_message "PROJECT_NAME         : $PROJECT_NAME"
    display_message "BUILD_TYPE           : $BUILD_TYPE"
    display_message "BUILD_DIR            : $BUILD_DIR"
    display_message "--------------------------------------------------------------------"
}

install_project()
{
    push_directory "$BUILD_DIR"

    display_heading_message "Install: $PROJECT_NAME"

    make install

    pop_directory
}

make_project()
{
    push_directory "$BUILD_DIR"

    display_heading_message "Make: $PROJECT_NAME"

    make

    pop_directory
}

update_project()
{
    display_heading_message "Update $PROJECT_NAME"

    if [[ -f /usr/bin/systemctl ]]; then
        display_heading_message "stop service $PROJECT_NAME"
        systemctl stop $PROJECT_NAME.service
    fi

    display_heading_message "copy $PROJECT_NAME to /usr/bin"

    push_directory "$BUILD_DIR"

    rm -rf /usr/sbin/$PROJECT_NAME
    cp $PROJECT_NAME /usr/sbin

    pop_directory

    if [[ -d /etc/$PROJECT_NAME/logs ]]; then
        display_heading_message "clear log files..."
        rm -rf /etc/$PROJECT_NAME/logs/*.log
    fi

    if [[ -d /var/log/$PROJECT_NAME ]]; then
        display_heading_message "clear log files..."
        rm -rf /var/log/$PROJECT_NAME/*.log
    fi

    if [[ -f /usr/bin/systemctl ]]; then
        display_heading_message "start service $PROJECT_NAME"
        systemctl start ${PROJECT_NAME}.service
    fi
}

# Parse command line options that are handled by this script.
#------------------------------------------------------------------------------
for OPTION in "$@"; do
    case $OPTION in
        # Standard script options.
        (--help)                DISPLAY_HELP="yes";;

        (--install)             MAKE_INSTALL="yes";;
        (--update)              BUILD_UPDATE="yes";;

        (--release)             BUILD_TYPE="Release";;
        (--debug)               BUILD_TYPE="Debug";;

        # Unique script options.
        (--build-dir=*)         BUILD_DIR="${OPTION#*=}";;
    esac
done

if ! [[ $BUILD_DIR ]]; then
    if [[ $BUILD_TYPE == Debug ]]; then
      BUILD_DIR=cmake-build-debug
    else
      BUILD_DIR=cmake-build-release
    fi
fi

# Configure.
#==============================================================================
if [[ $DISPLAY_HELP ]]; then
    display_help
else
    display_configuration

    if ! [[ $BUILD_UPDATE ]]; then
        if [[ $MAKE_INSTALL ]]; then
            install_project
        else
            make_project
        fi
    fi

    update_project
fi
