#!/usr/bin/env sh
set -u
export LC_ALL=C

readonly THIS_PATH="$(readlink -e "$(dirname "$0")")"

readonly INSTALL_LOG_FILEPATH="${1}"
readonly INSTALL_LOG_FILEPATH_TMP="${INSTALL_LOG_FILEPATH}.tmp"

readonly PRODUCT_NAME='kesl'
readonly VAR_DIRECTORY='/var/opt/kaspersky/kesl/'
readonly SHARED_DIRECTORY='/opt/kaspersky/kesl/shared/'
readonly PACKAGE_CURRENT_DIRLINK='/var/opt/kaspersky/kesl/install-current'
readonly INI_FILEPATH='/var/opt/kaspersky/kesl/common/kesl.ini'
readonly SYSTEMD_SLEEP_DIRECTORY='/lib/systemd/system-sleep/'
readonly PM_UTILS_SLEEP_DIRECTORY='/etc/pm/sleep.d/'
readonly SYSTEMD_SLEEP_HOOK_FILENAME='kesl_hook.sh'
readonly PM_UTILS_SLEEP_HOOK_FILENAME='74_kesl_hook.sh'
readonly CONTROL_FILEPATH='/opt/kaspersky/kesl/bin/kesl-control'
readonly CONTROL_FILENAME='kesl-control'

Die()
{
    printf "\n%s: ERROR: %s\n\n" "$(basename "$0")" "$*" >&2
    exit 1
}

SaveToLog()
{
    echo "$1" >> "${INSTALL_LOG_FILEPATH_TMP}"
}

CreateSymlink()
{
    local lnk="${1:?}"
    local dst="${2:-${PACKAGE_CURRENT_DIRLINK%%/}$1}"

    if [ -h "${lnk}" ]; then
        unlink "${lnk}" || Die "cannot unlink symlink '${lnk}'"
    elif [ -f "${lnk}" ]; then
        unlink "${lnk}" || Die "cannot unlink file '${lnk}'"
    elif [ -d "${lnk}" ]; then
        rmdir "${lnk}" || Die "cannot remove directory '${lnk}'"
    fi

    ln -s "${dst}" "${lnk}" || Die "cannot create symlink '${lnk}' -> '${dst}'"

    SaveToLog "${lnk}"
}

CreateSymlinks()
{
    for f in "${THIS_PATH}/symlinks/"*; do
        local lnk
        while IFS='' read -r lnk; do
            CreateSymlink "${lnk}"
        done < "${f}"
    done
}

InstallControl()
{
    CreateSymlink "/usr/bin/${CONTROL_FILENAME}" "${PACKAGE_CURRENT_DIRLINK}${CONTROL_FILEPATH}"
}

InstallSleepHook()
{
    if [ -d "${SYSTEMD_SLEEP_DIRECTORY}" ]; then
        CreateSymlink "${SYSTEMD_SLEEP_DIRECTORY}${SYSTEMD_SLEEP_HOOK_FILENAME}" "${PACKAGE_CURRENT_DIRLINK}/${SHARED_DIRECTORY}${SYSTEMD_SLEEP_HOOK_FILENAME}"
    fi

    if [ -d "${PM_UTILS_SLEEP_DIRECTORY}" ]; then
        CreateSymlink "${PM_UTILS_SLEEP_DIRECTORY}${PM_UTILS_SLEEP_HOOK_FILENAME}" "${PACKAGE_CURRENT_DIRLINK}/${SHARED_DIRECTORY}${PM_UTILS_SLEEP_HOOK_FILENAME}"
    fi
}

Install()
{
    CreateSymlinks
    InstallControl
    InstallSleepHook
}

Main()
{
    : > "${INSTALL_LOG_FILEPATH_TMP}"

    Install

    mv "${INSTALL_LOG_FILEPATH_TMP}" "${INSTALL_LOG_FILEPATH}"
}

Main "$@"
exit $?
