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

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

# Импортируем общие функции
source $SCRIPT_PATH/astra-mobile-userfilesdel-constants
source $SCRIPT_PATH/astra-mobile-userfilesdel-config
# !!! Прямая зависимость от kcm_mobile_impactcontrol !!!
source $SCRIPT_PATH/astra-mobile-clean-functions

#================================================================================
# Функции
#================================================================================
## userWhiteListPathIndex
## @brief - Функция вернёт индекс записи в белом списке пользователя
## @param $1 - Искомый путь
## @return Вернёт индекс записи или -1
function userWhiteListPathIndex() {
    local IN_PATH="$1"
    local USER_WHITE_LIST=()
    iniGetUserWhiteList USER_WHITE_LIST

    local index=-1

    if [ ${#USER_WHITE_LIST[@]} != 0 ]; then
        for ((i=0; i < ${#USER_WHITE_LIST[@]}; ++i))
        do
            if [[ "$IN_PATH" == "${USER_WHITE_LIST[$i]}" ]]; then index=$i; break; fi
        done
    fi

    echo $index
}

## pathInUserWhiteList
## @brief - Функция проверит находится ли путь в белом списке пользователя
## @param $1 - Искомый путь
## @return Вернёт логическое значение
function pathInUserWhiteList() {
    local IN_PATH="$1"
    [[ $(userWhiteListPathIndex "$IN_PATH") -ne -1 ]]
}

## getFileCreationTime
## @brief - Функция вернёт время создания файла
## @param $1 - Путь к файлу
## @return Вернёт время создания файла [timestamp]
function getFileCreationTime() {
    local FILE_PATH="$1"
    local creationTime=0

    if [[ -f "$FILE_PATH" ]]; then
        local fileInode=$(ls -i "$FILE_PATH" | cut -d' ' -f1)
        local fileDevice="$(df $FILE_PATH | tail -1 | awk '{ print $1 }')"

        local data=$(debugfs -R 'stat <'"${fileInode}"'>' "${fileDevice}" 2>/dev/null)
        local regexp='ctime: 0[xX][0-9a-fA-F]+'

        if [[ $data =~ $regexp ]]; then
            creationTime=$(echo ${BASH_REMATCH[0]} | cut -d 'x' -f2)
            creationTime=$(date -d @"$((16#$creationTime))" +%s)
        fi
    fi

    echo "$creationTime"
}


## findFiles_UFS
## @brief - Функция поиска файлов (Реализация для user file del)
## @param $1 - Директория, в которой нужно искать
## @param $2 - Шаблон имени искомых файлов
## @param $3 - Заполняемый список файлов
function findFiles_UFS() {
    local FIND_PATH="$1"
    local FILE_NAME="$2"
    declare -n OUT_FILES_LIST=$3

    local OLDIFS=$IFS
    IFS=$ITEMS_DELIMER

    local DIR_FILES=()
    local LIFETIME_MINUTE=0
    let "LIFETIME_MINUTE = $(iniGetLifeTime) / 60"

    if [ $LIFETIME_MINUTE == 0 ]; then
        echo "File lifetime not set! Skip..."
    else
        case $(iniGetMode) in

            $WORK_MODE_CREATION_TIME)
#                DIR_FILES=( $(find "$FIND_PATH" -cmin +$LIFETIME_MINUTE -type f -name "$FILE_NAME" -print0 | tr "\0" "$ITEMS_DELIMER") )
                local nowTime=$(date +%s)

                local PATHS_BUFF=( $(find "$FIND_PATH" -type f -name "$FILE_NAME" -print0 | tr "\0" "$ITEMS_DELIMER") )

                for ((i=0; i < ${#PATHS_BUFF[@]}; ++i))
                do
                    local file="${PATHS_BUFF[$i]}"
                    local creationTime=$(getFileCreationTime "$file")
                    local timeDiffMinute=0
                    let "timeDiffMinute = $(($nowTime-$creationTime)) / 60"

                    if [[ $timeDiffMinute -gt $LIFETIME_MINUTE ]]; then
                        DIR_FILES[${#DIR_FILES[*]}]="$file"
                    fi
                done
            ;;

            $WORK_MODE_CHANGE_TIME)
                DIR_FILES=( $(find "$FIND_PATH" -mmin +$LIFETIME_MINUTE -type f -name "$FILE_NAME" -print0 | tr "\0" "$ITEMS_DELIMER") )
            ;;

            $WORK_MODE_ACCESS_TIME)
                DIR_FILES=( $(find "$FIND_PATH" -amin +$LIFETIME_MINUTE -type f -name "$FILE_NAME" -print0 | tr "\0" "$ITEMS_DELIMER") )
            ;;

        esac

        for File in ${DIR_FILES[@]}
        do
            OUT_FILES_LIST[${#OUT_FILES_LIST[*]}]="$File"
        done
    fi

    IFS=$OLDIFS
}

## processDirsSecDel_UFS
## @brief - Функция обработает директории, используя функционал SecDel (Реализация для user file del)
## @param $1 - Список директорий на обработку
function processDirsSecDel_UFS() {
    declare -n DIRS=$1

    if [ ${#DIRS[@]} -gt 0 ]; then
        local Files=()

        for Dir in "${DIRS[@]}"
        do
            if [ -d "$Dir" ]; then
                findFiles_UFS "$Dir" "*" Files
            fi
        done

        processFilesSecDel Files
    fi
}

## processDirsSecDel_UFS
## @brief - Функция обработает директории, используя функционал FSTrim (Реализация для user file del)
## @param $1 - Список директорий на обработку
function processDirsFSTrim_UFS() {
    declare -n DIRS=$1

    if [ ${#DIRS[@]} -gt 0 ]; then
        local Files=()

        for Dir in "${DIRS[@]}"
        do
            if [ -d "$Dir" ]; then
                findFiles_UFS "$Dir" "*" Files
            fi
        done

        processFilesFSTrim Files
    fi
}
