class_name UFControl extends Node

signal update_uf_serviceability(status: int)

#region Константы и переменные
enum StatusIndex {SOCKETS = 0, IP_220_27B = 2}
enum STATE_VAL {NONE = 0, GOOD = 1, ERROR = 2}
var unit_uf: Object
var uf_status: Dictionary = {'УФ-онлайн': false, 'КЭМС-Б1': false, 'ЭМС-Б1': false, 'ЭМС-Б2': false, 'ИП220-27Б': false}

var _self_name: String
var _serviceability: int = STATE_VAL.NONE
var serviceability_uf: int:
    get:
        return _serviceability
    set(value):
        if value != _serviceability:
            _serviceability = value
            signaller.emit_signal('update_uf_serviceability', value)
#endregion

#region Инициализация
func _init(name_uf: String) -> void:
    _self_name = name_uf
    unit_uf = network.get_unit_instance(_self_name)
    unit_uf.connect('line_changed', on_line_changed)
    unit_uf.connect('data_received', on_data_received)
#endregion

#region Обработчики сигналов
func on_line_changed(status: Object) -> void:
    '''Обработка изменения состояния линии связи'''
    uf_status['УФ-онлайн'] = status.online
    update_serviceability()

func on_data_received(yau: Object) -> void:
    '''Обработка полученных данных от УФ'''
    var new_ems_status = control_ems(yau.status)
    var status_changed = false

    # Обновляем только ключи КЭМС/ЭМС, сохраняя 'УФ-онлайн'
    for key in ['КЭМС-Б1', 'ЭМС-Б1', 'ЭМС-Б2', 'ИП220-27Б']:
        var old_value = uf_status.get(key, false)
        var new_value = new_ems_status.get(key, false)

        if old_value != new_value:
            uf_status[key] = new_value
            status_changed = true

    if status_changed:
        update_serviceability()
#endregion

#region Статус и сервисабельность
func get_current_status() -> Dictionary:
    '''Получение текущего статуса (только для чтения)'''
    return uf_status.duplicate(true)

func is_operational() -> bool:
    '''Проверка, все ли системы работают нормально'''
    return serviceability_uf and uf_status.get('УФ-онлайн', false)


func update_serviceability() -> void:
    '''Обновление общего статуса сервисабельности'''
    var new_serviceability: int = STATE_VAL.GOOD

    # Проверяем онлайн-статус
    if uf_status.get('УФ-онлайн', false) == false:
        new_serviceability = STATE_VAL.NONE
    else:
        # Проверяем все статусы КЭМС/ЭМС
        for key in ['КЭМС-Б1', 'ЭМС-Б1', 'ЭМС-Б2', 'ИП220-27Б']:
            if uf_status.get(key, true) == false:
                new_serviceability = STATE_VAL.ERROR
                break
    # Новое значение через setter
    self.serviceability_uf = new_serviceability
#endregion

#region Вспомогательные методы
static func control_ems(status: Array) -> Dictionary:
    '''Анализ статусов КЭМС/ЭМС'''
    var status_dic: Dictionary = {}
    if status.is_empty() or status.size() < 3:
        return status_dic

    status_dic['КЭМС-Б1'] = bool((status[StatusIndex.SOCKETS] >> 0) & 1) and bool((status[StatusIndex.SOCKETS] >> 3) & 1)
    status_dic['ЭМС-Б1'] = bool((status[StatusIndex.SOCKETS] >> 1) & 1) and bool((status[StatusIndex.SOCKETS] >> 4) & 1)
    status_dic['ЭМС-Б2'] = bool((status[StatusIndex.SOCKETS] >> 2) & 1) and bool((status[StatusIndex.SOCKETS] >> 5) & 1)
    status_dic['ИП220-27Б'] = bool((status[StatusIndex.IP_220_27B] >> 6) & 1)
    return status_dic
#endregion
