#!/bin/bash

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

# Определяем местоположение скрипта
SCRIPT_PATH=$(dirname "$(readlink -f "$0")")
# Импортируем общие функции
source $SCRIPT_PATH/simcontrol-constans

#================================================================================
# Константы
#================================================================================
# Параметры DBUS для SimControl
DBUS_SIMCONTROL_OBJECT='ru.astralinux.sim-control'
DBUS_SIMCONTROL_PATH='/SimControl'
DBUS_SIMCONTROL_INTERFACE='ru.astralinux.sim.control'
# Методы
DBUS_SIMCONTROL_METHOD_SET_ACTIVE='setActive'
DBUS_SIMCONTROL_METHOD_SET_MODE='setMode'
DBUS_SIMCONTROL_METHOD_ADD_SIM='addSim'
DBUS_SIMCONTROL_METHOD_DELETE_SIM='deleteSim'
DBUS_SIMCONTROL_METHOD_APPLAY='applayControl'
# Свойства
DBUS_SIMCONTROL_PROPERTY_ACTIVE='active'
DBUS_SIMCONTROL_PROPERTY_MODE='mode'
DBUS_SIMCONTROL_PROPERTY_SIM_LIST='simList'


#==============================================================================
# Type cast properties
#==============================================================================
## getBool
## @brief - Функция преобразования вывода DBUS к Bool
function getBool() {
    echo $@ | awk -F ' ' '{$1=""; $2=""; print $0}'
}

## getInt32
## @brief - Функция преобразования вывода DBUS к Int32
function getInt32() {
    echo $@ | awk -F ' ' '{$1=""; $2=""; print $0}'
}

## getUInt32
## @brief - Функция преобразования вывода DBUS к UInt32
function getUInt32() {
    echo $@ | awk -F ' ' '{$1=""; $2=""; print $0}'
}

## getString
## @brief - Функция преобразования вывода DBUS к String
function getString() {
    echo $@ | awk -F ' ' '{$1=""; print $0}'
}

## getArray
## @brief - Функция преобразования вывода DBUS к массиву
function getArray() {
    local ARRAY=( $(echo $@ | sed 's/.*\[ //;s/\ ].*//;') )
    echo ${ARRAY[@]}
}

#==============================================================================
# DBus
#==============================================================================
## dbusGetProperty
## @brief - Функция запроса свойства DBUS
## @param $1 - Имя объект DBUS
## @param $2 - Путь в объекте DBUS
## @param $3 - Вызываемый интерфейс
## @param $4 - Запрашиваемое свойство
## @return Вернёт свойство в формате DBUS (требуется преобразование)
function dbusGetProperty() {
    local DEST_OBJECT=$1
    local DBUS_OBJECT_PATH=$2
    local INTERFACE_NAME=$3
    local PROPERTY_NAME=$4

    local Property=$(dbus-send --system \
            --print-reply=literal \
            --dest=$DEST_OBJECT \
            $DBUS_OBJECT_PATH org.freedesktop.DBus.Properties.Get \
            string:"$INTERFACE_NAME" \
            string:"$PROPERTY_NAME"
    )

    echo $Property
}

## dbusCallMethod
## @brief - Функция вызовет метод DBUS
## @param $1 - Имя объект DBUS
## @param $2 - Путь в объекте DBUS
## @param $3 - Вызываемый метод
## @param $4 - Параметры
## @return Вернёт результат вызова метода
function dbusCallMethod() {
    local DEST_OBJECT=$1
    local INTERFACE_PATH=$2
    local METHOD_NAME=$3
    local ARG1=$4
    local ARG2=$5
    local ARG3=$6

    Result=$(dbus-send --system \
            --dest=$DEST_OBJECT \
            --type=method_call \
            --print-reply \
            $INTERFACE_PATH \
            $METHOD_NAME \
            $ARG1 \
            $ARG2 \
            $ARG3
    )

    echo $Result
}

#==============================================================================
# Функции
#==============================================================================
## simControlDBusGetProperty
## @brief - Функция запроса свойства SimControl
## @param $1 - Запрашиваемое свойство
function simControlDBusGetProperty() {
    echo $(dbusGetProperty "$DBUS_SIMCONTROL_OBJECT" "$DBUS_SIMCONTROL_PATH" "$DBUS_SIMCONTROL_INTERFACE" "$1")
}

## simControlDBusCallMethod
## @brief - Функция вызовет метод SimControl
## @param $1 - Вызываемый метод
## @param $2-4 - Параметры
## @return Вернёт результат вызова метода
function simControlDBusCallMethod() {
    local METHOD_NAME=$1
    echo $(dbusCallMethod "$DBUS_SIMCONTROL_OBJECT" "$DBUS_SIMCONTROL_PATH" "$DBUS_SIMCONTROL_INTERFACE.$METHOD_NAME" "$2" "$3" "$4")
}

## simControlGetActive
## @brief - Функция вернёт признак активности контроля сим-карт
## @return Вернёт признак активности контроля сим-карт
function simControlGetActive() {
    echo $(getBool $(simControlDBusGetProperty "$DBUS_SIMCONTROL_PROPERTY_ACTIVE"))
}

## simControlSetActive
## @brief - Функция задаст признак активности контроля сим-карт
## @param $1 - Новое значение активности контроля сим-карт
function simControlSetActive() {
    local VALUE="$1"
    simControlDBusCallMethod "$DBUS_SIMCONTROL_METHOD_SET_ACTIVE" "boolean:$VALUE" > /dev/null
}

## simControlGetMode
## @brief - Функция вернёт режим работы контроля сим-карт
## @return Вернёт режим работы контроля сим-карт
function simControlGetMode() {
    echo $(getInt32 $(simControlDBusGetProperty "$DBUS_SIMCONTROL_PROPERTY_MODE"))
}

## simControlSetMode
## @brief - Функция задаст режим работы контроля сим-карт
## @param $1 - Новое значение режим работы контроля сим-карт
function simControlSetMode() {
    local VALUE="$1"
    simControlDBusCallMethod "$DBUS_SIMCONTROL_METHOD_SET_MODE" "int32:$VALUE" > /dev/null
}

## simControlAddSim
## @brief - Функция добавит сим-карту в список контроля
## @param $1 - Имя сим-карты
## @param $2 - ICCID сим-карты
function simControlAddSim() {
    local SIM_NAME="$1"
    local SIM_ICCID="$2"

    local response=$(simControlDBusCallMethod "$DBUS_SIMCONTROL_METHOD_ADD_SIM" "string:$SIM_NAME" "string:$SIM_ICCID")
    [[ "$response" =~ 'boolean true' ]] && return 0 || return 1
}

## simControlDeleteSim
## @brief - Функция добавит сим-карту из списока контроля
## @param $1 - ICCID сим-карты
function simControlDeleteSim() {
    local SIM_ICCID="$1"

    local response=$(simControlDBusCallMethod "$DBUS_SIMCONTROL_METHOD_DELETE_SIM" "string:$SIM_ICCID")
    [[ "$response" =~ 'boolean true' ]] && return 0 || return 1
}

## dbusGetSimList
## @brief - Функция вернёт список сим-карт
## @return Вернёт список сим-карт
function simControlGetSimList() {
#     # Получаем перечень контролируемых sim-карт в виде сырой строки из SIMNAME1:SIMICCID1;SIMNAME2:SIMICCID2;... между разделителями ""
#     local Str=$(echo $(iniGetValue '%General' 'SimList' '""' "$SIMCONTROL_CONFIG_PATH") | cut -d'"' -f 2)
#     # sed "s/ /_/g" - Заменим проблы на _
#     # sed 's/;/\n/g' - Разделем на элементы, разделитель ';'
#     # Поместим в массив Array
#     local Array=( $(echo $Str | sed "s/ /_/g" | sed "s/;/\n/g") )
#     echo ${Array[@]}

    local result=()
    local line=$(getArray $(simControlDBusGetProperty "$DBUS_SIMCONTROL_PROPERTY_SIM_LIST"))

    local regex='\S[^:]*:\w*'
    # Покастрока включает соответствие шаблону
    while [[ ${line} =~ (${regex}) ]]; do
        # sed "s/ /_/g" - Заменим проблы на _
        local str=$(echo "${BASH_REMATCH[1]}" | sed "s/ /_/g")
        result[${#result[*]}]="$str"
            line=${line##*${BASH_REMATCH[1]}}
    done

    echo ${result[@]}
}

## simControApplay
## @brief - Функция применит контроль сим-карт с текущими настройками
function simControApplay() {
    simControlDBusCallMethod "$DBUS_SIMCONTROL_METHOD_APPLAY" > /dev/null
}
