@tool
class_name uarep_settings extends Node

## Настройки программы

var settings_program: Dictionary

var UnitProfiles: Dictionary[StringName, Array] = { \
    # < Название: [Протокол, [Параметры], Комментарий] >
    # < Название: Протокол, [Адрес, <Порт>|[, Порт], Широковещательное, Привязывать], Комментарий >
    'уарэп-яу07-частный': ['yau07rx', ['10.1.1.2', 50002, false, true], 'IP-адрес для приёма частных сообщений от ЯУ-07'],
    'уарэп-яу07-общий': ['yau07rx', ['*', 50000, true, true], 'IP-адрес для приёма широковещательных сообщений от ЯУ-07'],
    'уарэп-капсрпб': ['capsrpb', ['127.0.0.1', '127.0.0.1', 42023, 42022, false, true], 'IP-адрес для обмена сообщениями со службой \"МП550\" (СТЦ)'],
    'уарэп-трасса': ['trassa', ['192.168.11.34', '192.168.11.105', 50200, 10004, false, true], 'IP-адрес для обмена сообщениями с \"Трассой\"'],
    'уарэп-эмс': ['yau07tx', ['10.1.1.52', 50052, false, false], 'IP-адрес прибора УФ'],
    'уарэп-яу07-2в': ['yau07tx', ['10.1.1.22', 50022, false, false], 'IP-адрес прибора ПРД-В2'],
    'уарэп-яу07-2н': ['yau07tx', ['10.1.1.21', 50021, false, false], 'IP-адрес прибора ПРД-Н2'],
    'уарэп-яу07-2к': ['yau07tx', ['10.1.1.23', 50023, false, false], 'IP-адрес прибора ПРД-К2'],
    'уарэп-яу07-4в': ['yau07tx', ['10.1.1.42', 50042, false, false], 'IP-адрес прибора ПРД-В4'],
    'уарэп-яу07-4н': ['yau07tx', ['10.1.1.41', 50041, false, false], 'IP-адрес прибора ПРД-Н4'],
    'уарэп-яу07-4к': ['yau07tx', ['10.1.1.43', 50043, false, false], 'IP-адрес прибора ПРД-К4'],
    'уарэп-яу07-1в': ['yau07tx', ['10.1.1.12', 50012, false, false], 'IP-адрес прибора ПРД-В1'],
    'уарэп-яу07-1н': ['yau07tx', ['10.1.1.11', 50011, false, false], 'IP-адрес прибора ПРД-Н1'],
    'уарэп-яу07-1к': ['yau07tx', ['10.1.1.13', 50013, false, false], 'IP-адрес прибора ПРД-К1'],
    'уарэп-яу07-3в': ['yau07tx', ['10.1.1.32', 50032, false, false], 'IP-адрес прибора ПРД-В3'],
    'уарэп-яу07-3н': ['yau07tx', ['10.1.1.31', 50031, false, false], 'IP-адрес прибора ПРД-Н3'],
    'уарэп-яу07-3к': ['yau07tx', ['10.1.1.33', 50033, false, false], 'IP-адрес прибора ПРД-К3'],
    'навигация': ['navi', ['*', 60000, true, true ], 'IP-адрес на котором принимают сообщения от навигации'],

    # < Название: [протокол, [адрес, порт, широковещательное, привязывать], комментарий >
    'эмс-ведущий': ['iyems-rx', ['127.0.0.1', 61000, false, true], 'IP-адрес для приёма докладов от информационных ЭМС устройств'],
    'эмс-ор63': ['iyems-tx', ['127.0.0.1', 61001, false, false], 'IP-адрес для передачи команд информационному ЭМС устройству'],
    'эмс-454': ['iyems-tx', ['127.0.0.1', 61002, false, false], 'IP-адрес для передачи команд информационному ЭМС устройству'],
    'эмс-го': ['iyems-tx', ['127.0.0.1', 61003, false, false], 'IP-адрес для передачи команд информационному ЭМС устройству'],
    'эмс-рлс1': ['iyems-tx', ['127.0.0.1', 61004, false, false], 'IP-адрес для передачи команд информационному ЭМС устройству'],
    'эмс-рлс2': ['iyems-tx', ['127.0.0.1', 61005, false, false], 'IP-адрес для передачи команд информационному ЭМС устройству'],
    'эмс-ннвс': ['iyems-tx', ['127.0.0.1', 61006, false, false], 'IP-адрес для передачи команд информационному ЭМС устройству'],
    'эмс-изделие7': ['iyems-tx', ['127.0.0.1', 61007, false, false], 'IP-адрес для передачи команд информационному ЭМС устройству'],
    'эмс-изделие8': ['iyems-tx', ['127.0.0.1', 61008, false, false], 'IP-адрес для передачи команд информационному ЭМС устройству'],

    # < Название: Протокол, < Адрес, Порт получения >, Комментарий >
    'уарэп-5п28': ['5p28', ['127.0.0.1', 50000], 'IP-адрес комплекса 5П-28'],

    # < Название: Протокол, < Имя порта, Адрес modbus, Скорость, Чётность, Бит на символ, Стоп битов, Время на ожидание ответа в мкс >, Комментарий >
    'уарэп-щ3': ['mbcs', ['/dev/ttyUSB0', 7, 19200, 'N', 8, 1, 50000], 'Параметры клиента Modbus Serial'],

    # < Название: Протокол, < Имя порта, Адрес СПТ-25, Скорость, Чётность, Бит на символ, Стоп битов >, Комментарий >
    'уарэп-спт25-1': ['spt25', ['/dev/ttyUSB1', 0, 19200, 'N', 8, 1], 'Прибор СПТ-25 (G1)'],
    'уарэп-спт25-2': ['spt25', ['/dev/ttyUSB2', 0, 19200, 'N', 8, 1], 'Прибор СПТ-25 (G2)'],
    'уарэп-афсп-левый': [null, [], 'Прибор АФСП левого борта'],
    'уарэп-афсп-правый': [null, [], 'Прибор АФСП правого борта'],
    'уарэп-бпо-1': [null, [], 'Прибор БПО 1'],
    'уарэп-бпо-2': [null, [], 'Прибор БПО 2'],
    'уарэп-карта': [null, [], 'Сервер карты'],
}

## Параметры цели.
@export var ThreatParams = {
        'time_lost': 5000  ## Время после последнего обновления в мс, через которое цель считается потерянной.
     }


const FREQ_MAX:  = 6000.0
const FREQ_MIN:  = 400.0
const WIDTH_MAX: = 120.0
const WIDTH_MIN: = 5.0
const DUR_MAX: = 1000000.0
const PERIOD_MAX: = 1000000.0
const UM_MIN: = -5.0
const UM_MAX: = 55.0


func _ready() -> void:
    if Engine.is_editor_hint():
        return
    var settings_file = get_settings_file_path()
    var abs_path: = ProjectSettings.globalize_path(settings_file)
    log.info('Путь к файлу настроек: \"%s\"' % abs_path)
    var file: = FileAccess.open(settings_file, FileAccess.READ)
    if not file:
        log.error('Не удалось открыть файл настроек.')
        log.warning('Будут использованы настройики по умолчанию.')
        return
    var read: = file.get_as_text()
    file.close()
    var json_conv: = JSON.new()
    if Error.OK != json_conv.parse(read):
        var jse: = json_conv.get_error_message()
        var jsl: = json_conv.get_error_line()
        log.error('Не удалось разобрать файл настроек. Строка %d: \"%s\"' % [jsl, jse])
        log.warning('Будут использованы настройики по умолчанию.')
        return
    var json_data = json_conv.get_data()
    settings_program.merge(json_data, true)
    for key in settings_program:
        ProjectSettings.set_setting('application/config/%s' % key, settings_program[key])
    for key: StringName in UnitProfiles.keys():
        if not json_data.has(key):
            continue
        var vj = json_data[key]
        var vp = UnitProfiles[key][1]
        if vp.size() != vj.size():
            log.error('Не удалось прочитать настройки для \"%s\"' % key)
            continue
        var parse_ok: = true
        for i in vp.size():
            if tools.type_is_num(vj[i]) and tools.type_is_num(vp[i]):
                if typeof(vp[i]) == TYPE_INT:
                    vp[i] = int(vj[i])
                elif typeof(vp[i]) == TYPE_FLOAT:
                    vp[i] = float(vj[i])
            elif typeof(vp[i]) == typeof(vj[i]):
                vp[i] = vj[i]
            else:
                var tp: = type_string(typeof(vp[i]))
                var tj: = type_string(typeof(vj[i]))
                log.error('%s: ожидается тип \"%s\", но получен тип \"%s\" [%d]' % [key, tp, tj, i])
                parse_ok = false
                break
        if parse_ok:
            UnitProfiles[key][1].assign(vp)


## Возвращает полный путь к файлу с настройками
func get_settings_file_path() -> String:
    return ProjectSettings.get_setting(
        'application/config/settings_path',
        'user://settings.json')
