#!/bin/bash

#================================================================================
# Инициализация
#================================================================================

# Определяем местоположение скрипта
SCRIPT_PATH=$(dirname "$(readlink -f "$0")")
# Импортируем общие функции
source $SCRIPT_PATH/console_colors
source $SCRIPT_PATH/errors_func
source $SCRIPT_PATH/super_user_check
source $SCRIPT_PATH/astra-mobile-clean-and-lock-config
source $SCRIPT_PATH/astra-mobile-clean-functions

# Проверяем права суперпользователя
check_root_rights
# Работа функционала доступна только в режиме 'Advanced' и выше!
checkExecutionAllowed

# Получаем задаваемый режим
mode=$(echo $1 | tr '[:lower:]' '[:upper:]')
# Получаем команду
command=$(echo $2 | tr '[:lower:]' '[:upper:]')
# Зададим значение
value=$(echo $3 | tr '[:lower:]' '[:upper:]')

#================================================================================
# Константы
#================================================================================
# Режимы
declare IMPACT_SOFT_MODE='SOFT'
declare IMPACT_MEDIUM_MODE='MEDIUM'
declare IMPACT_HARD_MODE='HARD'
declare IMPACT_STATUS_MODE='STATUS'
declare IMPACT_HELP_MODE='HELP'

# Команды мягкого режима
declare SOFT_ACTIVE_COMMAND='ACTIVE'
declare SOFT_ACTIVE_ON_PARAM='ON'
declare SOFT_ACTIVE_OFF_PARAM='OFF'

declare SOFT_INFORMATION_SYSTEM_COMMAND='IS'
declare SOFT_INFORMATION_SYSTEM_ON_PARAM='ON'
declare SOFT_INFORMATION_SYSTEM_OFF_PARAM='OFF'

declare SOFT_SENSITIVITY_COMMAND='SENSITIVITY'

# Команды среднего режима
declare MEDIUM_ACTIVE_COMMAND='ACTIVE'
declare MEDIUM_ACTIVE_ON_PARAM='ON'
declare MEDIUM_ACTIVE_OFF_PARAM='OFF'

declare MEDIUM_WITHOUTLOGIN_COMMAND='WITHOUTLOGIN'
declare MEDIUM_LOGINATTEMPT_COMMAND='LOGINATTEMPT'

# Команды жёсткого режима
declare HARD_ACTIVE_COMMAND='ACTIVE'
declare HARD_ACTIVE_ON_PARAM='ON'
declare HARD_ACTIVE_OFF_PARAM='OFF'

declare HARD_WITHOUTLOGIN_COMMAND='WITHOUTLOGIN'
declare HARD_LOGINATTEMPT_COMMAND='LOGINATTEMPT'

#================================================================================
# Функции
#================================================================================
## is_int_numeric
## @brief - Функция проверит является ли значение целым беззнаковым числом
## @param $1 - Проверяемое значение
function is_int_numeric() {
    [[ $1 =~ ^[0-9]+$ ]]
}

## is_float_numeric
## @brief - Функция проверит является ли значение вещественным беззнаковым числом
## @param $1 - Проверяемое значение
function is_float_numeric() {
    [[ $1 =~ ^[0-9]+([.][0-9]+)?$ ]]
}

## in_sensitivity_range
## @brief - Функция проверит входит ли значение в диапазон чувствительности
## @param $1 - Проверяемое значение
function in_sensitivity_range() {
    local VALUE="$1"
    local MIN=$(iniGetLightModeMinSensitivity)
    local MAX=$(iniGetLightModeMaxSensitivity)

    if ! $(is_int_numeric "$VALUE") && ! $(is_float_numeric "$VALUE"); then
        [ 0 == 1 ]
    else
        [ $(echo "$VALUE >= $MIN" | bc) == $(echo "$VALUE <= $MAX" | bc) ]
    fi
}

## showHelp
## @brief - Функция выведет вспомогательную информацию на экран
function showHelp() {
    local SCRIPT_NAME="$(basename $0)"
    echo "============================================================"
    echo -e ${Cyan}"Synopsis${Color_Off}"
    echo "============================================================"
    echo "# $SCRIPT_NAME {$IMPACT_SOFT_MODE | $IMPACT_MEDIUM_MODE | $IMPACT_HARD_MODE | $IMPACT_STATUS_MODE | $IMPACT_HELP_MODE} [COMMAND] [ARGUMENTS...]"
    echo ""
    echo "Show this help:"
    echo "# $SCRIPT_NAME $IMPACT_HELP_MODE"
    echo ""
    echo "============================================================"
    echo -e "${Green}Soft mode${Color_Off}"
    echo "============================================================"
    echo "Example of activating soft mode:"
    echo "# $SCRIPT_NAME $IMPACT_SOFT_MODE $SOFT_ACTIVE_COMMAND {$SOFT_ACTIVE_ON_PARAM | $SOFT_ACTIVE_OFF_PARAM}"
    echo ""
    echo "Example of activating an exit from information systems when locking the screen:"
    echo "# $SCRIPT_NAME $IMPACT_SOFT_MODE $SOFT_INFORMATION_SYSTEM_COMMAND {$SOFT_INFORMATION_SYSTEM_ON_PARAM | $SOFT_INFORMATION_SYSTEM_OFF_PARAM}"
    echo ""
    echo "Example of setting sensitivity (value before $(iniGetLightModeMinSensitivity) and $(iniGetLightModeMaxSensitivity)) to external impact:"
    echo "# $SCRIPT_NAME $IMPACT_SOFT_MODE $SOFT_SENSITIVITY_COMMAND [numeric value]"
    echo ""
    echo "============================================================"
    echo -e "${Yellow}Medium mode${Color_Off}"
    echo "============================================================"
    echo "Example of activating medium mode:"
    echo "# $SCRIPT_NAME $IMPACT_MEDIUM_MODE $MEDIUM_ACTIVE_COMMAND {$MEDIUM_ACTIVE_ON_PARAM | $MEDIUM_ACTIVE_OFF_PARAM}"
    echo ""
    echo "Example of setting the time after which user data will be deleted:"
    echo "# $SCRIPT_NAME $IMPACT_MEDIUM_MODE $MEDIUM_WITHOUTLOGIN_COMMAND [unix timestamp value]"
    echo ""
    echo "Example of setting the number of login attempts after which user data will be deleted:"
    echo "# $SCRIPT_NAME $IMPACT_MEDIUM_MODE $MEDIUM_LOGINATTEMPT_COMMAND [numeric value]"
    echo ""
    echo "============================================================"
    echo -e "${Red}Hard mode${Color_Off}"
    echo "============================================================"
    echo "Example of activating hard mode:"
    echo "# $SCRIPT_NAME $IMPACT_HARD_MODE $HARD_ACTIVE_COMMAND {$HARD_ACTIVE_ON_PARAM | $HARD_ACTIVE_OFF_PARAM}"
    echo ""
    echo "Example of setting the time after which user data will be deleted:"
    echo "# $SCRIPT_NAME $IMPACT_HARD_MODE $HARD_WITHOUTLOGIN_COMMAND [unix timestamp value]"
    echo ""
    echo "Example of setting the number of login attempts after which user data will be deleted:"
    echo "# $SCRIPT_NAME $IMPACT_HARD_MODE $HARD_LOGINATTEMPT_COMMAND [numeric value]"
    echo ""
    echo "============================================================"
    echo -e "${Blue}Stautus${Color_Off}"
    echo "============================================================"
    echo "Example of show status:"
    echo "# $SCRIPT_NAME $IMPACT_STATUS_MODE {$IMPACT_SOFT_MODE | $IMPACT_MEDIUM_MODE | $IMPACT_HARD_MODE} [COMMAND]"
    echo "============================================================"
}

## processSoftMode
## @brief - Функция обработает команды мягкого режима
function processSoftMode() {
    local result=0
    # Обрабатываем команду
    if [[ $command == $SOFT_ACTIVE_COMMAND ]]; then
        # Обрабатываем параметры команды активации
        if [[ $value == $SOFT_ACTIVE_ON_PARAM ]]; then
            echo -e "${PROCESS_TEXT} Soft mode activation..."
            initSetLightModeActive 'true'
        elif [[ $value == $SOFT_ACTIVE_OFF_PARAM ]]; then
            echo -e "${PROCESS_TEXT} Soft mode deactivation..."
            initSetLightModeActive 'false'
        elif [[ ! -z $value ]]; then
            echoerr "${ERROR_TEXT} Incorrect parameter: $value, value can only be $SOFT_ACTIVE_ON_PARAM or $SOFT_ACTIVE_OFF_PARAM!"
            result=1
        fi

    elif [[ $command == $SOFT_INFORMATION_SYSTEM_COMMAND ]]; then
        # Обрабатываем параметры команды выхода из информационных систем
        if [[ $value == $SOFT_INFORMATION_SYSTEM_ON_PARAM ]]; then
            echo -e "${PROCESS_TEXT} Logging out of information systems activation..."
            iniSetLightModeExitOnBlockScreen 'true'
        elif [[ $value == $SOFT_INFORMATION_SYSTEM_OFF_PARAM ]]; then
            echo -e "${PROCESS_TEXT} Logging out of information systems deactivation..."
            iniSetLightModeExitOnBlockScreen 'false'
        elif [[ ! -z $value ]]; then
            echoerr "${ERROR_TEXT} Incorrect parameter: $value, value can only be $SOFT_INFORMATION_SYSTEM_ON_PARAM or $SOFT_INFORMATION_SYSTEM_OFF_PARAM!"
            result=1
        fi

    elif [[ $command == $SOFT_SENSITIVITY_COMMAND ]]; then
        # Обрабатываем параметры команды установки чувствительности
        if $(in_sensitivity_range "$value"); then
            echo -e "${PROCESS_TEXT} Setting the sensitivity..."
            iniSetLightModeSensitivity "$value"
        elif [[ ! -z $value ]]; then
            echoerr "${ERROR_TEXT} Incorrect parameter: $value, value must be a number and be in the range [ $(iniGetLightModeMinSensitivity), $(iniGetLightModeMaxSensitivity) ]!"
            result=1
        fi
    else
        echoerr "${ERROR_TEXT} Unknow command: $command"
        result=1
    fi
    # В случаи если команда и параметры корректны, вернём текущее\новое значение
    if [[ $result -eq 0 ]]; then echo -en "${STATUS_TEXT} "; showStatus "$IMPACT_SOFT_MODE" "$command"; fi

    return $result
}

## processMediumMode
## @brief - Функция обработает команды среднего режима
function processMediumMode() {
    local result=0
    # Обрабатываем команду
    if [[ $command == $MEDIUM_ACTIVE_COMMAND ]]; then
        # Обрабатываем параметры команды активации
        if [[ $value == $MEDIUM_ACTIVE_ON_PARAM ]]; then
            echo -e "${PROCESS_TEXT} Medium mode activation..."
            initSetMiddleModeActive 'true'
        elif [[ $value == $MEDIUM_ACTIVE_OFF_PARAM ]]; then
            echo -e "${PROCESS_TEXT} Medium mode deactivation..."
            initSetMiddleModeActive 'false'
        elif [[ ! -z $value ]]; then
            echoerr "${ERROR_TEXT} Incorrect parameter: $value, value can only be $MEDIUM_ACTIVE_ON_PARAM or $MEDIUM_ACTIVE_OFF_PARAM!"
            result=1
        fi
    elif [[ $command == $MEDIUM_WITHOUTLOGIN_COMMAND ]]; then
        # Обрабатываем параметры времени без входа в систему
        if $(is_int_numeric "$value"); then
            echo -e "${PROCESS_TEXT} Setting user time without login..."
            iniSetMiddleModeTimeWithoutLogin "$value"
        elif [[ ! -z $value ]]; then
            echoerr "${ERROR_TEXT} Incorrect parameter: $value, value must match unix timestamp!"
            result=1
        fi
    elif [[ $command == $MEDIUM_LOGINATTEMPT_COMMAND ]]; then
        # Обрабатываем параметры количества попыток входа
        if $(is_int_numeric "$value"); then
            echo -e "${PROCESS_TEXT} Setting user login attempt count..."
            iniSetMiddleModeAttemptCount "$value"
        elif [[ ! -z $value ]]; then
            echoerr "${ERROR_TEXT} Incorrect parameter: $value, value can only be a positive integer!"
            result=1
        fi
    else
        echoerr "${ERROR_TEXT} Unknow command: $command"
        result=1
    fi
    # В случаи если команда и параметры корректны, вернём текущее\новое значение
    if [[ $result -eq 0 ]]; then echo -en "${STATUS_TEXT} "; showStatus "$IMPACT_MEDIUM_MODE" "$command"; fi

    return $result
}

## processHardMode
## @brief - Функция обработает команды жёсткого режима
function processHardMode() {
    local result=0
    # Обрабатываем команду
    if [[ $command == $HARD_ACTIVE_COMMAND ]]; then
        # Обрабатываем параметры команды активации
        if [[ $value == $HARD_ACTIVE_ON_PARAM ]]; then
            echo -e "${PROCESS_TEXT} Hard mode activation..."
            initSetHardModeActive 'true'
        elif [[ $value == $HARD_ACTIVE_OFF_PARAM ]]; then
            echo -e "${PROCESS_TEXT} Hard mode deactivation..."
            initSetHardModeActive 'false'
        elif [[ ! -z $value ]]; then
            echoerr "${ERROR_TEXT} Incorrect parameter: $value, value can only be $HARD_ACTIVE_ON_PARAM or $HARD_ACTIVE_OFF_PARAM!"
            result=1
        fi
    elif [[ $command == $HARD_WITHOUTLOGIN_COMMAND ]]; then
        # Обрабатываем параметры времени без входа в систему
        if $(is_int_numeric "$value"); then
            echo -e "${PROCESS_TEXT} Setting user time without login..."
            iniSetHardModeTimeWithoutLogin "$value"
        elif [[ ! -z $value ]]; then
            echoerr "${ERROR_TEXT} Incorrect parameter: $value, value must match unix timestamp!"
            result=1
        fi
    elif [[ $command == $HARD_LOGINATTEMPT_COMMAND ]]; then
        # Обрабатываем параметры количества попыток входа
        if $(is_int_numeric "$value"); then
            echo -e "${PROCESS_TEXT} Setting user login attempt count..."
            iniSetHardModeAttemptCount "$value"
        elif [[ ! -z $value ]]; then
            echoerr "${ERROR_TEXT} Incorrect parameter: $value, value can only be a positive integer!"
            result=1
        fi
    else
        echoerr "${ERROR_TEXT} Unknow command: $command"
        result=1
    fi
    # В случаи если команда и параметры корректны, вернём текущее\новое значение
    if [[ $result -eq 0 ]]; then echo -en "${STATUS_TEXT} "; showStatus "$IMPACT_HARD_MODE" "$command"; fi

    return $result
}

## showStatus
## @brief - Функция выведет текущий статус
function showStatus() {
    local MODE="$1"
    local COMMAND="$2"

    if [[ "$MODE" != @($IMPACT_SOFT_MODE|$IMPACT_MEDIUM_MODE|$IMPACT_HARD_MODE) ]]; then
        MODE=''
        COMMAND=''
    fi

    if [[ -z $MODE || $MODE == $IMPACT_SOFT_MODE ]]; then
        if [[ -z $COMMAND ]]; then
            echo "============================================================"
            echo -e "${Green}Soft mode${Color_Off}"
            echo "============================================================"
        fi

        if [[ -z $COMMAND || $COMMAND == $SOFT_ACTIVE_COMMAND ]]; then
            echo -n "Active: "
            if $(iniGetLightModeActive); then echo -e "${Green}is active${Color_Off}"; else echo -e "${Red}isn't active${Color_Off}"; fi
        fi

        if [[ -z $COMMAND || $COMMAND == $SOFT_INFORMATION_SYSTEM_COMMAND ]]; then
            echo -n "Logging out of information systems on screen lock "
            if $(iniGetLightModeExitOnBlockScreen); then echo -e "${Green}is active${Color_Off}"; else echo -e "${Red}isn't active${Color_Off}"; fi
        fi

        if [[ -z $COMMAND || $COMMAND == $SOFT_SENSITIVITY_COMMAND ]]; then
            echo -e "Current sensitivity: $(iniGetLightModeSensitivity) [Min: $(iniGetLightModeMinSensitivity) Max: $(iniGetLightModeMaxSensitivity)]"
        fi

        if [[ -z $MODE ]]; then echo ""; fi
    fi

    if [[ -z $MODE || $MODE == $IMPACT_MEDIUM_MODE ]]; then
        if [[ -z $COMMAND ]]; then
            echo "============================================================"
            echo -e "${Yellow}Medium mode${Color_Off}"
            echo "============================================================"
        fi

        if [[ -z $COMMAND || $COMMAND == $MEDIUM_ACTIVE_COMMAND ]]; then
            echo -n "Active: "
            if $(iniGetMiddleModeActive); then echo -e "${Green}is active${Color_Off}"; else echo -e "${Red}isn't active${Color_Off}"; fi
        fi

        if [[ -z $COMMAND || $COMMAND == $MEDIUM_WITHOUTLOGIN_COMMAND ]]; then
            local medium_twl=$(iniGetMiddleModeTimeWithoutLogin)
            echo -n "Usert time without login: "
            if [ $medium_twl -gt 0 ]; then echo -e "$medium_twl"; else echo -e "0 [${Red}disabled${Color_Off}]"; fi
        fi

        if [[ -z $COMMAND || $COMMAND == $MEDIUM_LOGINATTEMPT_COMMAND ]]; then
            local medium_lac=$(iniGetMiddleModeAttemptCount)
            echo -n "Usert login attempt count: "
            if [ $medium_lac -gt 0 ]; then echo -e "$medium_lac"; else echo -e "0 [${Red}disabled${Color_Off}]"; fi
        fi

        if [[ -z $MODE ]]; then echo ""; fi
    fi

    if [[ -z $MODE || $MODE == $IMPACT_HARD_MODE ]]; then
        if [[ -z $COMMAND ]]; then
            echo "============================================================"
            echo -e "${Red}Hard mode${Color_Off}"
            echo "============================================================"
        fi

        if [[ -z $COMMAND || $COMMAND == $HARD_ACTIVE_COMMAND ]]; then
            echo -n "Active: "
            if $(iniGetHardModeActive); then echo -e "${Green}is active${Color_Off}"; else echo -e "${Red}isn't active${Color_Off}"; fi
        fi

        if [[ -z $COMMAND || $COMMAND == $HARD_WITHOUTLOGIN_COMMAND ]]; then
            local hard_twl=$(iniGetHardModeTimeWithoutLogin)
            echo -n "Usert time without login: "
            if [ $hard_twl -gt 0 ]; then echo -e "$hard_twl"; else echo -e "0 [${Red}disabled${Color_Off}]"; fi
        fi

        if [[ -z $COMMAND || $COMMAND == $HARD_LOGINATTEMPT_COMMAND ]]; then
            local hard_lac=$(iniGetHardModeAttemptCount)
            echo -n "Usert login attempt count: "
            if [ $hard_lac -gt 0 ]; then echo -e "$hard_lac"; else echo -e "0 [${Red}disabled${Color_Off}]"; fi
        fi
    fi
}

#================================================================================
# main
#================================================================================
globalResult=0

if [[ $mode == $IMPACT_HELP_MODE ]]; then
    showHelp
elif [[ $mode == $IMPACT_SOFT_MODE ]]; then
    processSoftMode
    globalResult=$?
elif [[ $mode == $IMPACT_MEDIUM_MODE ]]; then
    processMediumMode
    globalResult=$?
elif [[ $mode == $IMPACT_HARD_MODE ]]; then
    processHardMode
    globalResult=$?
elif [[ $mode == $IMPACT_STATUS_MODE ]]; then
    showStatus "$command" "$value"
else
    echoerr "${ERROR_TEXT} Unknow mode: $mode"
    globalResult=1
fi

exit $globalResult
#================================================================================
