#!/bin/bash

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

# Определяем местоположение скрипта
SCRIPT_PATH=$(dirname "$(readlink -f "$0")")

# Импортируем общие функции
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

declare -a USERS

# Если список параметров пуст
if [[ -z "$@" ]]; then
    # Запросим список всех пользователей системы
    userList USERS
    echo "Clear all users home!"
else
    # Получаем список пользователей из параметров
    USERS=( $@ )
    echo "Clear users: [${USERS[@]}] home!"
fi

#================================================================================
# Функции
#================================================================================
## appendExclusionsForUser
## @brief - Функция добавит исключения для директории пользователя
## @param $1 - Путь к директории пользователя
function appendExclusionsForUser() {
    local IN_USER_HOME_DIR="$1"
    local EXCLUSIONS=()

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

    for ((i=0; i < ${#EXCLUSIONS[@]}; ++i))
    do
        exclusionsAdd "$IN_USER_HOME_DIR/${EXCLUSIONS[$i]}"
    done
}

## userIsAdmin
## @brief - Функция проверит, является ли пользователь администратором
## @return Вернёт признак того, что пользователь администратор
function userIsAdmin() {
    local IN_USER="$1"
    local isAdmin=0

    if [[ "$(groups $IN_USER)" =~ (' '|^)"$ADMINS_GROUP"(' '|$) ]]; then
        isAdmin=1
    fi

    [ $isAdmin == 1 ]
}

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

if ! $(iniGetActive); then
    echo -e "${WARNING_TEXT} Functionality not enabled!"
else
    # На всякий случай удалим список исключений
    exclusionsClear

    # Пустой список директорий для обработки через SecDel
    DirsToSecDel=()
    # Пустой список директорий для обработки через fstrim
    DirsToFsTrim=()

    # Обрабатываем данные для всех пользователей
    for User in ${USERS[@]}
    do
        # Пропустим системных пользователей
        if [ $(id -u "$User") -lt 1000 ]; then continue; fi

        # Если включена защита файлов администраторов и пользователь является администратором то просто пропустим его
        if $(iniGetAdminsProtections) && $(userIsAdmin "$User"); then continue; fi

        # Получим домашнюю директорию пользователя
        UserHomeDir="$(userGetHomeDir $User)"

        # Рассматриваем только пользователя с домашней директорией
        if [ -d "$UserHomeDir" ]; then
            # Получаем системный раздел, на котором находится директория пользователя
            DirDriveName=$(driveNameByPartition $(drivePartitionByPartFS "$UserHomeDir"))
            # Определяем режим обработки для раздела
            ProcessMode=$(useMode $DirDriveName)

            # Разделим директории для разных режимов обработки
            if [ $ProcessMode == $FSTRIM_MODE ]; then
                DirsToFsTrim[${#DirsToFsTrim[*]}]="$UserHomeDir"
            else
                DirsToSecDel[${#DirsToSecDel[*]}]="$UserHomeDir"
            fi

            # Добавим исключения для данного пользователя
            appendExclusionsForUser "$UserHomeDir"
        fi
    done

    # Обрабатываем директории соответствующим методом
    processDirsFSTrim_UFS DirsToFsTrim
    processDirsSecDel_UFS DirsToSecDel

    # Очищаем список исключений
    exclusionsClear
fi

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