#!/bin/bash

#==============================================================================
# Проверка единичной загрузки в оболочку bash
#==============================================================================
if [[ ! -v INI_READER_INCLUDE_ONCE ]]; then
        INI_READER_INCLUDE_ONCE=1
else
        return 0
fi
#==============================================================================
# Функции
#==============================================================================
## iniSectionExists
## @brief - Функция проверит существование секции ini файла
## @param $1 - Имя секции ini файла (без квадратных скобок)
## @param $2 - Путь к ini файлу
## @return Вернёт логическое значение (существует/не существует)
function iniSectionExists() {
    local SECTION="$1"
    local INI_PATH="$2"

    grep -Fxq "[$SECTION]" "$INI_PATH"
}

## iniValueExists
## @brief - Функция проверит существование значение в секции ini файла
## @param $1 - Имя секции ini файла (без квадратных скобок)
## @param $2 - Имя параметра (ключ)
## @param $3 - Путь к ini файлу
## @return Вернёт логическое значение (существует/не существует)
function iniValueExists() {
    local SECTION="$1"
    local KEY="$2"
    local INI_PATH="$3"

    local Value=""

    if [ -f "$INI_PATH" ]; then
        #   Принцип работы:
        #   Пропускаем строки до заданной секции;
        #   Читаем секцию до совпадения ключа;
        #   При совпадении выдаём значение и останавливаем перебор;
        #   При попадании в следующую секцию завершим поиск
        Value=$(awk -F '=' -v section="$SECTION" -v key="$KEY" '
            BEGIN { inSection = 0; }
            {
                if (!inSection) {
                    if ($0 == "["section"]") { inSection = 1; }
                } else {
                    if ($0 ~ /\[(.*?)\]/) {
                        exit 1
                    } else {
                        if ($1 == key) { print $2; exit 0; }
                    }
                }
            }' $INI_PATH
        )
    fi

    ! [[ -z $Value ]]
}

## iniGetValue
## @brief - Функция вернёт значение ключа в указанной секции ini файла
## @param $1 - Имя секции ini файла (без квадратных скобок)
## @param $2 - Имя параметра (ключ)
## @param $3 - Значение по умолчанию (Вернётся если ключ не удастся найти)
## @param $4 - Путь к ini файлу
## @return Вернёт значение указанного ключа или значение по умолчанию
function iniGetValue() {
    local SECTION="$1"
    local KEY="$2"
    local DEFAULT="$3"
    local INI_PATH="$4"

    local Value=""

    if [ -f "$INI_PATH" ]; then
        #   Принцип работы:
        #   Пропускаем строки до заданной секции;
        #   Читаем секцию до совпадения ключа;
        #   При совпадении выдаём значение и останавливаем перебор;
        #   При попадании в следующую секцию завершим поиск
        Value=$(awk -F '=' -v section="$SECTION" -v key="$KEY" '
            BEGIN { inSection = 0; }
            {
                if (!inSection) {
                    if ($0 == "["section"]") { inSection = 1; }
                } else {
                    if ($0 ~ /\[(.*?)\]/) {
                        exit 1
                    } else {
                        if ($1 == key) { print $2; exit 0; }
                    }
                }
            }' $INI_PATH
        )
    fi

    if [[ -z $Value ]]; then echo $DEFAULT; else echo $Value; fi
}

## iniSetValue
## @brief - Функция задаст значение ключа в указанной секции ini файла
## @param $1 - Имя секции ini файла (без квадратных скобок)
## @param $2 - Имя параметра (ключ)
## @param $3 - Значение параметра
## @param $4 - Путь к ini файлу
## @return Вернёт значение указанного ключа или значение по умолчанию
function iniSetValue() {
    local SECTION="$1"
    local KEY="$2"
    local VALUE="$3"
    local INI_PATH="$4"

    # Создадим файл если его нет
    if ! [ -f "$INI_PATH" ]; then
        touch "$INI_PATH"
    fi

    if ! $(iniSectionExists "$SECTION" "$INI_PATH"); then
        # В файле нет указанной секции. Добавим и её и значение в конец
        echo -e "[$SECTION]\n$KEY=$VALUE" >> "$INI_PATH"
    else
        if $(iniValueExists "$SECTION" "$KEY" "$INI_PATH"); then
            # Значение в секции существует

            #   Принцип работы:
            #   Заменить до конца строки строку
            #   Встречающуюся после [$SECTION] но перед следующим [
            #   Начинающаяся с $KEY=
            #   Значением $KEY=$VALUE
            sed -i "/^\[$SECTION\]$/,/^\[/ s#^$KEY=.*#$KEY=$VALUE#" "$INI_PATH"
        else
            # Значение в секции не существует

            #   Принцип работы:
            #   Вставим строку $KEY=$VALUE сразу после секции [$SECTION]
            sed -i "/\[$SECTION\]/a $KEY=$VALUE" "$INI_PATH"
        fi
    fi
}
#==============================================================================

