#!/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-userfilesdel-constants
source $SCRIPT_PATH/astra-mobile-userfilesdel-config
source $SCRIPT_PATH/astra-mobile-userfilesdel-functions
# !!! Прямая зависимость от kcm_mobile_impactcontrol !!!
source $SCRIPT_PATH/astra-mobile-clean-functions

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

# Получаем команду
command=$(echo $1 | tr '[:lower:]' '[:upper:]')
# Зададим значение 1
param1=$(echo $2 | tr '[:lower:]' '[:upper:]')
# Зададим значение 2
param2=$3

#================================================================================
# Константы
#================================================================================
# Команад вывода подсказки
declare HELP_COMMAND='HELP'

# Команда вывода статуса
declare STATUS_COMMAND='STATUS'

# Команда активации
declare ACTIVE_COMMAND='ACTIVE'
declare ACTIVE_ON_PARAM='ON'
declare ACTIVE_OFF_PARAM='OFF'

# Команда защиты файлов администартора
declare ADMIN_PROTECTIONS_COMMAND='ADMINPROTECT'
declare ADMIN_PROTECTIONS_ON_PARAM='ON'
declare ADMIN_PROTECTIONS_OFF_PARAM='OFF'

# Команда режима проверки файла
declare MODE_COMMAND='MODE'
declare MODE_CREATION_TIME_PARAM='CREATION'
declare MODE_CHANGE_TIME_PARAM='CHANGE'
declare MODE_ACCESS_TIME_PARAM='ACCESS'

# Команда времени жизни
declare LIFETIME_COMMAND='LIFETIME'

# Команда белого списка
declare WHITELIST_COMMAND='WHITELIST'
declare WHITELIST_ADD_PARAM='ADD'
declare WHITELIST_REMOVE_PARAM='REMOVE'
declare WHITELIST_DEFAULT_PARAM='DEFAULT'
declare WHITELIST_USER_PARAM='USER'
declare WHITELIST_ALL_PARAM='ALL'

# Превязка значения режима к команде
declare -A MODE_ARR=(
    [$MODE_CREATION_TIME_PARAM]=$WORK_MODE_CREATION_TIME
    [$MODE_CHANGE_TIME_PARAM]=$WORK_MODE_CHANGE_TIME
    [$MODE_ACCESS_TIME_PARAM]=$WORK_MODE_ACCESS_TIME
)

declare -A REV_MODE_ARR=(
    [${MODE_ARR[$MODE_CREATION_TIME_PARAM]}]=$MODE_CREATION_TIME_PARAM
    [${MODE_ARR[$MODE_CHANGE_TIME_PARAM]}]=$MODE_CHANGE_TIME_PARAM
    [${MODE_ARR[$MODE_ACCESS_TIME_PARAM]}]=$MODE_ACCESS_TIME_PARAM
)

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

## @showWhiteList
## @brief - Функция выведет содержимое белого списка пользователя
function showWhiteList() {
    local SHOWS="$1"
    local WHITE_LIST=()

    if [[ ! "$SHOWS" =~ ^("$WHITELIST_DEFAULT_PARAM"|"$WHITELIST_USER_PARAM"|"$WHITELIST_ALL_PARAM")$ ]]; then SHOWS="$WHITELIST_ALL_PARAM"; fi

    echo -n "White List: "

    case "$SHOWS" in

        "$WHITELIST_DEFAULT_PARAM")
            echo "[default]"
            # Получаем дефолтный белый список
            WHITE_LIST=("${DEFAULT_WHITE_LIST[@]}")
        ;;

        "$WHITELIST_USER_PARAM")
            echo "[user]"
            # Получаем белый список пользователся
            iniGetUserWhiteList WHITE_LIST
        ;;

        "$WHITELIST_ALL_PARAM")
            echo "[all]"
            # Получаем белый список пользователся
            iniGetUserWhiteList WHITE_LIST
            # Формируем список исключений из константного системного и динамического пользовательского
            WHITE_LIST=("${DEFAULT_WHITE_LIST[@]}" "${WHITE_LIST[@]}")
        ;;

    esac

    for path in "${WHITE_LIST[@]}";
    do
        echo "$WHITE_LIST_PATH_PREFIX_MARK/$path"
    done
}

## indexOf
## @brief - Функция вернёт индекс элемента в массиве
## @param $1 - Массив
## @param $2 - Искомый элемент
## @return Вернёт индек элемента или -1
function indexOf() {
    declare -n IN_DATA_ARRAY=$1
    local IN_VAL=$2
    local out_index=-1

    for index in ${!IN_DATA_ARRAY[@]}
    do
        if [ "${IN_DATA_ARRAY[$index]}" = "$IN_VAL" ]; then
            out_index=$index
            break;
        fi
    done

    echo $out_index
}

## userWhiteListAdd
## @brief - Функция добавит путь в белый список пользователя, если его там ещё нет
## @param $1 - Путь
function userWhiteListAdd() {
    local IN_PATH="$1"

    if $(pathInUserWhiteList "$IN_PATH"); then
        echo -e "${WARNING_TEXT} Alredy in user white list!"
    else
        local USER_WHITE_LIST=()
        iniGetUserWhiteList USER_WHITE_LIST

        USER_WHITE_LIST[${#USER_WHITE_LIST[@]}]="$IN_PATH"
        iniSetUserWhiteList USER_WHITE_LIST
    fi
}

## userWhiteListRemove
## @brief - Функция удалит путь из белого списка пользователя, если он там есть
## @param $1 - Путь
function userWhiteListRemove() {
    local IN_PATH="$1"

    if ! $(pathInUserWhiteList "$IN_PATH"); then
        echo -e "${WARNING_TEXT} Not in user white list!"
    else
        local USER_WHITE_LIST=()
        iniGetUserWhiteList USER_WHITE_LIST

        #USER_WHITE_LIST=( "${USER_WHITE_LIST[@]/$IN_PATH}" )

        local index=$(indexOf USER_WHITE_LIST "$IN_PATH")

        if [ $index -gt -1 ]; then
            unset "USER_WHITE_LIST[$index]"
            iniSetUserWhiteList USER_WHITE_LIST
        fi
    fi
}

## showHelp
## @brief - Функция выведет вспомогательную информацию на экран
function showHelp() {
    local SCRIPT_NAME="$(basename $0)"
    echo "============================================================"
    echo -e ${Cyan}"Synopsis${Color_Off}"
    echo "============================================================"
    echo "# $SCRIPT_NAME {$ACTIVE_COMMAND | $ADMIN_PROTECTIONS_COMMAND | $MODE_COMMAND | $LIFETIME_COMMAND | $WHITELIST_COMMAND | $STATUS_COMMAND | $HELP_COMMAND} [ARGUMENTS...]"
    echo ""
    echo "Show this help:"
    echo "# $SCRIPT_NAME $HELP_COMMAND"
    echo ""
    echo "Example of activating:"
    echo "# $SCRIPT_NAME $ACTIVE_COMMAND {$ACTIVE_ON_PARAM | $ACTIVE_OFF_PARAM}"
    echo ""
    echo "Example of activating administrators file protection:"
    echo "# $SCRIPT_NAME $ADMIN_PROTECTIONS_COMMAND {$ADMIN_PROTECTIONS_ON_PARAM | $ADMIN_PROTECTIONS_OFF_PARAM}"
    echo ""
    echo "Mode change example:"
    echo "# $SCRIPT_NAME $MODE_COMMAND {$MODE_CREATION_TIME_PARAM | $MODE_CHANGE_TIME_PARAM | $MODE_ACCESS_TIME_PARAM}"
    echo ""
    echo "Example of setting the file life time:"
    echo "# $SCRIPT_NAME $LIFETIME_COMMAND [unix timestamp value]"
    echo ""
    echo "Example of changing the white list:"
    echo "# $SCRIPT_NAME $WHITELIST_COMMAND {$WHITELIST_ADD_PARAM | $WHITELIST_REMOVE_PARAM} [/path/to/file]"
    echo ""
    echo "============================================================"
    echo -e "${Blue}Status${Color_Off}"
    echo "============================================================"
    echo "Example of show status:"
    echo "# $SCRIPT_NAME $STATUS_COMMAND {$ACTIVE_COMMAND | $ADMIN_PROTECTIONS_COMMAND | $MODE_COMMAND | $LIFETIME_COMMAND | $WHITELIST_COMMAND}"
    echo "============================================================"
}

## processActive
## @brief - Функция обработает активацию
## @return Вернёт признак успешности операции
function processActive() {
    local result=0

    # Обрабатываем активацию
    if [[ $param1 == $ACTIVE_ON_PARAM ]]; then
        echo -e "${PROCESS_TEXT} Activation..."
        iniSetActive 'true'
    elif [[ $param1 == $ACTIVE_OFF_PARAM ]]; then
        echo -e "${PROCESS_TEXT} Deactivation..."
        iniSetActive 'false'
    elif [[ ! -z $param1 ]]; then
        echoerr "${ERROR_TEXT} Incorrect parameter: $param1, value can only be $ACTIVE_ON_PARAM or $ACTIVE_OFF_PARAM!"
        result=1
    fi

    # В случаи если параметры корректны, вернём текущее\новое значение
    if [[ $result -eq 0 ]]; then echo -en "${STATUS_TEXT} "; showStatus "$ACTIVE_COMMAND"; fi

    return $result
}

## processAdminProtections
## @brief - Функция обработает защиту администраторов
## @return Вернёт признак успешности операции
function processAdminProtections() {
    local result=0

        # Обрабатываем активацию
    if [[ $param1 == $ADMIN_PROTECTIONS_ON_PARAM ]]; then
        echo -e "${PROCESS_TEXT} Activation..."
        iniSetAdminsProtections 'true'
    elif [[ $param1 == $ADMIN_PROTECTIONS_OFF_PARAM ]]; then
        echo -e "${PROCESS_TEXT} Deactivation..."
        iniSetAdminsProtections 'false'
    elif [[ ! -z $param1 ]]; then
        echoerr "${ERROR_TEXT} Incorrect parameter: $param1, value can only be $ADMIN_PROTECTIONS_ON_PARAM or $ADMIN_PROTECTIONS_OFF_PARAM!"
        result=1
    fi

    # В случаи если параметры корректны, вернём текущее\новое значение
    if [[ $result -eq 0 ]]; then echo -en "${STATUS_TEXT} "; showStatus "$ADMIN_PROTECTIONS_COMMAND"; fi

    return $result
}

## processMode
## @brief - Функция обработает режим работы
## @return Вернёт признак успешности операции
function processMode() {
    local result=0

    # Обрабатываем изменение режима
    if [[ "$param1" =~ ^($MODE_CREATION_TIME_PARAM|$MODE_CHANGE_TIME_PARAM|$MODE_ACCESS_TIME_PARAM)$ ]]; then
        echo -e "${PROCESS_TEXT} Setting mode..."
        iniSetMode ${MODE_ARR[$param1]}
    elif [[ ! -z $param1 ]]; then
        echoerr "${ERROR_TEXT} Incorrect parameter: $param1, value can only be $MODE_CREATION_TIME_PARAM or $MODE_CHANGE_TIME_PARAM or $MODE_ACCESS_TIME_PARAM!"
        result=1
    fi

    # В случаи если параметры корректны, вернём текущее\новое значение
    if [[ $result -eq 0 ]]; then echo -en "${STATUS_TEXT} "; showStatus "$MODE_COMMAND"; fi

    return $result
}

## processLifeTime
## @brief - Функция обработает время жизни файла
## @return Вернёт признак успешности операции
function processLifeTime() {
    local result=0

    # Обрабатываем изменение времени жизни
    if $(is_int_numeric "$param1"); then
        echo -e "${PROCESS_TEXT} Setting file life time..."
        iniSetLifeTime "$param1"
    elif [[ ! -z $param1 ]]; then
        echoerr "${ERROR_TEXT} Incorrect parameter: $param1, value must match unix timestamp!"
        result=1
    fi

    # В случаи если параметры корректны, вернём текущее\новое значение
    if [[ $result -eq 0 ]]; then echo -en "${STATUS_TEXT} "; showStatus "$LIFETIME_COMMAND"; fi

    return $result
}

## processWhiteList
## @brief - Функция обработает белый список
## @return Вернёт признак успешности операции
function processWhiteList() {
    local result=0
    # lower path
    local IN_PATH="$param2"

    # Обрабатываем белый список
    if [[ $param1 == $WHITELIST_ADD_PARAM ]]; then
        echo -e "${PROCESS_TEXT} Adding to the white list..."
        userWhiteListAdd "$IN_PATH"
    elif [[ $param1 == $WHITELIST_REMOVE_PARAM ]]; then
        echo -e "${PROCESS_TEXT} Removing from the white list..."
        userWhiteListRemove "$IN_PATH"
    elif [[ ! -z $param1 ]]; then
        echoerr "${ERROR_TEXT} Incorrect parameter: $param1, value can only be $WHITELIST_ADD_PARAM or $WHITELIST_REMOVE_PARAM!"
        result=1
    fi

    # В случаи если параметры корректны, вернём текущее\новое значение
    if [[ $result -eq 0 ]]; then echo -en "${STATUS_TEXT} "; showStatus "$WHITELIST_COMMAND" "$WHITELIST_USER_PARAM"; fi

    return $result
}

## showStatus
## @brief - Функция выведет текущий статус
## @param $1 - Команда (опционально)
function showStatus() {
    local COMMAND="$1"
    local PARAM="$2"

    if [[ "$COMMAND" != @($ACTIVE_COMMAND|$ADMIN_PROTECTIONS_COMMAND|$MODE_COMMAND|$LIFETIME_COMMAND|$WHITELIST_COMMAND) ]]; then
        COMMAND=''
        PARAM=''
    fi

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

    if [[ -z $COMMAND || $COMMAND == $ADMIN_PROTECTIONS_COMMAND ]]; then
        echo -n "Administrators file protections: "
        if $(iniGetAdminsProtections); then echo -e "${Green}is active${Color_Off}"; else echo -e "${Red}isn't active${Color_Off}"; fi
    fi

    if [[ -z $COMMAND || $COMMAND == $MODE_COMMAND ]]; then
        echo -e "Current mode: ${Blue}${REV_MODE_ARR[$(iniGetMode)]}${Color_Off}"
    fi

    if [[ -z $COMMAND || $COMMAND == $LIFETIME_COMMAND ]]; then
        echo -e "File life time: ${Blue}$(iniGetLifeTime)${Color_Off}"
    fi

    if [[ -z $COMMAND || $COMMAND == $WHITELIST_COMMAND ]]; then
        showWhiteList "$PARAM"
    fi
}

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

if [[ $command == $HELP_COMMAND ]]; then
    showHelp
elif [[ $command == $ACTIVE_COMMAND ]]; then
    processActive
    globalResult=$?
elif [[ $command == $ADMIN_PROTECTIONS_COMMAND ]]; then
    processAdminProtections
    globalResult=$?
elif [[ $command == $MODE_COMMAND ]]; then
    processMode
    globalResult=$?
elif [[ $command == $LIFETIME_COMMAND ]]; then
    processLifeTime
    globalResult=$?
elif [[ $command == $WHITELIST_COMMAND ]]; then
    processWhiteList
    globalResult=$?
elif [[ $command == $STATUS_COMMAND ]]; then
    showStatus "$param1" "$(echo $param2 | tr '[:lower:]' '[:upper:]')"
else
    echoerr "${ERROR_TEXT} Unknow command $command"
    globalResult=1
fi

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