#!/bin/bash

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

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

#================================================================================
# Константы
#================================================================================
# Маркер переключателя
SWITCH_MARK='_SWMRK_'

# Параметры DBUS для CommunicationSwitchs
DBUS_COMSWITCHS_OBJECT='ru.astralinux.communication-switchs'
DBUS_COMSWITCHS_PATH='/CommunicationSwitchs'
DBUS_COMSWITCHS_INTERFACE='ru.astralinux.communication.switchs'

DBUS_SWITCH_PATH="/CommunicationSwitchs/$SWITCH_MARK"
DBUS_SWITCH_INTERFACE="ru.astralinux.communication.switchs.$SWITCH_MARK"

# Методы
DBUS_COMSWITCHS_METHOD_APPLAY='applayControl'
DBUS_SWITCH_METHOD_SETBLOKING='setBlocking'
# Свойства
DBUS_SWITCH_PROPERTY_AVAILABLE='available'
DBUS_SWITCH_PROPERTY_BLOKING='blocking'


#==============================================================================
# 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
}

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

## switchGetProperty
## @brief - Функция запроса свойства "переключателя"
## @param $1 - Имя "переключателя"
## @param $2 - Запрашиваемое свойство
function switchGetProperty() {
    local SWITCH_NAME="$1"
    local PROPERTY_NAME="$2"

    local SWITCH_PATH="${DBUS_SWITCH_PATH/$SWITCH_MARK/$SWITCH_NAME}"
    local SWITCH_INTERFACE="${DBUS_SWITCH_INTERFACE/$SWITCH_MARK/$(echo $SWITCH_NAME | tr '[:upper:]' '[:lower:]')}"

    echo $(dbusGetProperty "$DBUS_COMSWITCHS_OBJECT" "$SWITCH_PATH" "$SWITCH_INTERFACE" "$PROPERTY_NAME")
}

## switchCallMethod
## @brief - Функция вызовет метод "переключателя"
## @param $1 - Имя "переключателя"
## @param $2 - Вызываемый метод
## @param $3-5 - Параметры
## @return Вернёт результат вызова метода
function switchCallMethod() {
    local SWITCH_NAME="$1"
    local METHOD_NAME="$2"

    local SWITCH_PATH="${DBUS_SWITCH_PATH/$SWITCH_MARK/$SWITCH_NAME}"
    local SWITCH_INTERFACE="${DBUS_SWITCH_INTERFACE/$SWITCH_MARK/$(echo $SWITCH_NAME | tr '[:upper:]' '[:lower:]')}"

    echo $(dbusCallMethod "$DBUS_COMSWITCHS_OBJECT" "$SWITCH_PATH" "$SWITCH_INTERFACE.$METHOD_NAME" "$3" "$4" "$5")
}

#==============================================================================
## switchGetAvailable
## @brief - Функция вернёт признак доступности "переключателя"
## @param $1 - Имя "переключателя"
## @return Вернёт признак доступности "переключателя"
function switchGetAvailable() {
    local SWITCH_NAME="$1"
    echo $(getBool $(switchGetProperty "$SWITCH_NAME" "$DBUS_SWITCH_PROPERTY_AVAILABLE"))
}

## switchGetBloking
## @brief - Функция вернёт признак активности блокировки "переключателя"
## @param $1 - Имя "переключателя"
## @return Вернёт признак активности блокировки "переключателя"
function switchGetBloking() {
    local SWITCH_NAME="$1"
    echo $(getBool $(switchGetProperty "$SWITCH_NAME" "$DBUS_SWITCH_PROPERTY_BLOKING"))
}

## switchSetBloking
## @brief - Функция задаст активность блокировки "переключателя"
## @param $1 - Имя "переключателя"
## @param $2 - Значение блокировки "переключателя"
## @return Вернёт признак успешности операции
function switchSetBloking() {
    local SWITCH_NAME="$1"
    local BLOKING="$2"
    local response=$(switchCallMethod "$SWITCH_NAME" "$DBUS_SWITCH_METHOD_SETBLOKING" "boolean:$BLOKING")
    [[ "$response" =~ 'boolean true' ]] && return $SUCCESS_CODE || return $ERROR_CODE
}
