extends ScrollContainer


## Отображает список помех в таблице.
const CellLineEdit = preload('res://table/ячейка-2.tscn')  ## Ячейка таблицы.
const TableHeader  = preload('res://table/header.tscn')    ## Ячейка заголовок таблицы.

const TABLE_HEADER       = [ TableHeader,   TableHeader,     TableHeader ,     TableHeader ]   ## Описание ряда заголовка.
const TABLE_ROW          = [ CellLineEdit,  CellLineEdit,    CellLineEdit ,    CellLineEdit ]  ## Описание ряда.
const TABLE_HEADERS_TEXT = ['№',       'Название',  'Пеленг',  'Состояние'  ]         ## Заголовки таблицы.
const TABLE_COLUMN_SIZE  = [ 65,            100,             90,             170  ]              ## Ширины колонок.

## Состояние выполнения сеанса помехи
const INTERFER_STATE = {
    0: 'Подготовка',
    1: 'Выполняется',
    2: 'Ошибка',
    3: 'Занято',
    4: 'Неисправность',
    5: '' }


## Названия помех
const INTERFER_NAMES = {
    'off': 'Откл',
    'mchm1': 'МЧМ-1',
    'srni1': 'СРН-И1',
    'srnm2': 'СРН-М2',
    'srngps': 'СРН-GPS',
    'pdm4': 'ПД-М4',
    'pdm2': 'ПД-М2',
    'lchm1': 'ЛЧМ-1',
    'lchm2': 'ЛЧМ-2',
    'pdm4s': 'ПД-М4С',
    'pdchm': 'ПД-ЧМ',
    'svi1': 'СВ-И1',
    'k1': 'K1',
    'svm2': 'СВ-М2',
    'ozp1': 'ОЗП-1',
    'eprls': 'ЕПРЛС',}


## Индексы колонок
const COLUMN_NUMBER = 0
const COLUMN_NAME = 1
const COLUMN_AOA = 2
const COLUMN_STATE = 3

var course = 0.0                        ## Курс корабля

func on_rto_threat_unsel(_th_id): $table.clear_rows_selected()


## Вызывается при нажатии указателем мыши на выбранный ряд.
func on_row_pressed(i_row: int):
    $table.clear_rows_selected()
    $table.set_row_selected(i_row, true)
    var ecm = $table.get_node_user_data(0, i_row)
    if interfer.thrs.has(ecm.ispp):
        signaller.emit_signal('rto_threat_sel', interfer.thrs[ecm.ispp])
    else:
        if interfer.fs.has(ecm.ispp):
            signaller.emit_signal('fs_selected', ecm)
        signaller.emit_signal('interfer_selected', ecm)


## Вызывается при выборе цели
func on_rto_threat_sel(th_id: int, table_index):
    var ecm_ispp = interfer.thrs.find_key(th_id)
    var ecm = null
    if ecm_ispp != null:
        var i_row = table_index[int(ecm_ispp)]
        ecm = $table.get_node_user_data(0, i_row)
        $table.clear_rows_selected()
        $table.set_row_selected(i_row, true)
    else:
        $table.clear_rows_selected()
    signaller.emit_signal('interfer_selected', ecm)


# Called when the node enters the scene tree for the first time.
func _ready():
    var table_index: = Dictionary()
    signaller.connect('interfer_new', Callable(self, 'on_interfer_new').bind(table_index))
    signaller.connect('interfer_off', Callable(self, 'on_interfer_off').bind(table_index))
    signaller.connect('rto_threat_unsel',  Callable(self, 'on_rto_threat_unsel'))
    signaller.connect('rto_threat_sel', Callable(self, 'on_rto_threat_sel').bind(table_index))
    interfer.connect('interfer_update', Callable(self, 'on_interfer_update').bind(table_index))
    interfer.connect('interfer_recommendate', Callable(self, 'on_interfer_recommendate'))
    $table.connect('row_pressed', Callable(self, 'on_row_pressed'))
    call_deferred('init_table')
    var unit_nav = network.get_unit_instance('навигация')
    unit_nav.connect('data_received', on_navi_data_received)


func init_table():
    $table.set_header(TABLE_HEADER)
    $table.set_header_text(TABLE_HEADERS_TEXT)
    $table.set_columns_min_size(TABLE_COLUMN_SIZE)
    $table.pin_header(self, get_parent())


func on_interfer_update(ecm, table_index):
    var row = map_th_to_row(ecm)
    if table_index.has(ecm.ispp):
        var i_row = table_index[ecm.ispp]
        $table.set_row_text(i_row, row)


func on_interfer_new(ecm, table_index):
    var row = map_th_to_row(ecm)
    if table_index.has(ecm.ispp):
        var i_row = table_index[ecm.ispp]
        $table.set_row_text(i_row, row)
    else:
        var i_row = $table.get_rows_count()
        $table.add_row(TABLE_ROW)
        $table.set_row_text(i_row, row)
        $table.set_row_editable(i_row, false)
        $table.set_node_user_data(0, i_row, ecm)
        table_index[ecm.ispp] = i_row
        # Будем надеяться, что отложенные вызовы производятся в том же порядке
        $table.call_deferred('clear_rows_selected')
        $table.call_deferred('set_row_selected', i_row, true)
    if not interfer.auto_enabled:
        signaller.emit_signal('interfer_selected', ecm)


func on_interfer_off(ecm, table_index):
    $table.remove_row(table_index[ecm.ispp])
    rehash(table_index)
    var sel_rows: Array
    $table.get_selected_rows(sel_rows)
    if not len(sel_rows):
        signaller.emit_signal('interfer_selected', null)


## Перестраивает индекс таблицы. Вызывать при удалении строки
func rehash(table_index: Dictionary):
    table_index.clear()
    var rows_count = $table.get_rows_count()
    for i_row in rows_count:
        var item = $table.get_node2(0, i_row)
        table_index[int(item.text)] = i_row


## Преобразует цель в строку таблицы
func map_th_to_row(ecm) -> Array:
    var row: = Array()
    row.resize(TABLE_ROW.size())
    row[COLUMN_NUMBER] = '%s' % ecm.ispp
    row[COLUMN_NAME] = ''
    if INTERFER_NAMES.has(ecm.krp):
        row[COLUMN_NAME] = '%s' % INTERFER_NAMES[ecm.krp]
    var aoa = ecm.kni + course
    if aoa > 360.0:
        aoa -= 360.0
    row[COLUMN_AOA] = '%5.1f' % aoa
    row[COLUMN_STATE] = ''
    if INTERFER_STATE.has(ecm.svk):
        row[COLUMN_STATE] = '%s' % INTERFER_STATE[ecm.svk]
    return row


func on_interfer_recommendate(ecm):
    var sel_rows: Array
    $table.get_selected_rows(sel_rows)
    if not len(sel_rows): return
    var sel_ecm = $table.get_node_user_data(0, sel_rows[0])
    if ecm == sel_ecm:
        signaller.emit_signal('interfer_selected', ecm)


func on_navi_data_received(data: Dictionary):
    course = data.get('k', 0.0)
