#!/bin/bash

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

# Проверяем права суперпользователя
if [[ $EUID -eq 0 ]]; then
        echo -e "Please run the script as a normal user, not as root."
        exit 1
fi

# Получаем имя приложения, запуск которого будем ожидать
APPLICATION_NAME="$1"
# Получаем время ожидания (в миллисекундах)
WAITING_TIME=$2

# Если не указано имя приложения, выходим с ошибкой
if [ -z "$APPLICATION_NAME" ]; then
    echo -e "Application name not specified!"
    exit 1
fi

# Если не указано время ожидания то установим его равным 10 секундам
if [ -z "$WAITING_TIME" ]; then
    WAITING_TIME=10000
fi

# Интерфейс DBus
EVENTS_INTERFACE='ru.astralinux.events'
# Получаемый сигнал перезапуска контейнера и запуска приложения (первый аргумент - имя приложения)
SIGNAL_RESTART_WAYDROID_CONTAINER_AND_LAUNCH='waydroid_restart_container_and_launch'

#================================================================================
# Функции
#================================================================================

## @calc
## @brief - Функция вычислит простое выражение (в том числе и с дробными числами)
## @param $1 - Выражение в формате строки. Например '10 / 3'
## @return Вернёт результат вычисления выражения
function calc() {
    local EXPRESSION="$1"
    echo $( echo "$EXPRESSION" | bc -l )
}

## @isTrue
## @brief - Функция вычислит простое логическое выражение (в том числе и с дробными числами)
## @param $1 - Выражение в формате строки. Например '10 >= 3'
## @return Вернёт признак истинности выражения
function isTrue() {
    local EXPRESSION="$1"
    [ $(calc "$EXPRESSION") -ne 0 ]
}

## @tick
## @brief - Функция вернёт количество миллисекунд от начала эпохи
## @return Вернёт количество миллисекунд от начала эпохи
function tick() {
    echo $(date +%s%N | cut -b1-13)
}

## @tock
## @brief - Функция вернёт разницу между текущим и полученным временем в миллисекундах от начала эпохи
## @param $1 - Количество миллисекунд от начала эпохи (Из функции tick)
## @return Вернёт разницу во времени в миллисекундах
function tock() {
    local tick_time=$1
    tock_time=$(tick)
    echo $(calc "$tock_time-$tick_time")
}

## getWindowMetadate
## @brief - Функция вернёт json метаданные окна приложения (или пустой json массив)
## @param $1 - Имя приложения
## @return Вернёт json метаданные окна приложения (или пустой json массив)
function getWindowMetadate() {
    local APP_NAME="$1"
    local json_val=$(dbus-send --session --dest='org.kde.KWin' --print-reply /WindowsRunner org.kde.krunner1.Match string:"$APP_NAME")
    echo "$json_val"
}

## isAppHaveWindow
## @brief - Функция проверит, существует ли у приложения окно
## @param $1 - Имя приложения
## @return Вернёт логическое значение существования окна приложения
function isAppHaveWindow() {
    local APP_NAME="$1"
    local regex='struct {'
    [[ "$(getWindowMetadate $APP_NAME)" =~ "$regex" ]]
}

## waydroidRestartAndLaunchApp
## @brief - Функция перезапустить waydroid и сразу же запустит приложение
## @param $1 - Имя приложения waydroid
function waydroidRestartAndLaunchApp() {
    local APP_NAME="$1"
    dbus-send --system --type=signal / $EVENTS_INTERFACE.$SIGNAL_RESTART_WAYDROID_CONTAINER_AND_LAUNCH string:"$APP_NAME"
}

## main
## @brief - Первичная функция
function main() {
    # Флаг обнаружения окна приложения
    local detected=0
    # Время начала ожидания
    local startTime=$(tick)
    # Запускаем ожидание
    while $(isTrue "$WAITING_TIME>$(tock $startTime)")
    do
        if $(isAppHaveWindow "$APPLICATION_NAME"); then
            # Окно приложения обнаружено
            detected=1
            break
        else
            # Окно приложения не обнаружено, ждём
            sleep 0.5
        fi
    done
    # Если мы так и не дождались окна приложения то шлём сигнал на перезапуск waydroid с повторным запуском приложения
    if [ $detected -eq 0 ]; then
        echo "Application $APPLICATION_NAME window not found! Restart..."
        waydroidRestartAndLaunchApp "$APPLICATION_NAME"
    fi
}

#================================================================================
main
exit 0
#================================================================================
