class_name Diagram extends Sprite2D

const NUM_OF_RANGE = 7
const NUM_OF_DIRECTIONS = 4
var fs_default_colors: Array[Color]       ## Цвета по умолчанию для блоков ФС.

@export var SecZap: PackedScene

func _ready() -> void:
    signaller.connect('map_mode_changed', Callable(self, 'set_view_mode'))
    set_def_colors()


func sv(val: float) -> float: return val / ($строб.scale.x / 2.0) * 0.125

func set_canvas_rotation(val: float) -> void: material.set('shader_parameter/rotation', val)
func set_strob_visible(val: bool):   $строб.visible = val
func set_strob_center(val: Vector2): $строб.position = val
func set_strob_dir(val: float):      $строб.set_instance_shader_parameter('dir', val)
func set_strob_width(val: float):    $строб.set_instance_shader_parameter('width', val)
func set_strob_band(val: float):     $строб.set_instance_shader_parameter('band', val / 125.0)
func set_strob_radius(val: float):   $строб.set_instance_shader_parameter('radius', sv(val))
func set_strob_color(val: Color):    $строб.set_instance_shader_parameter('color', val)

func get_strob_center() -> Vector2: return $строб.position
func get_strob_visible() -> bool:   return $строб.visible
func get_strob_dir() -> float:      return $строб.get_instance_shader_parameter('dir')
func get_strob_width() -> float:    return $строб.get_instance_shader_parameter('width')
func get_strob_band() -> float:     return $строб.get_instance_shader_parameter('band') * 125.0
func get_strob_radius() -> float:   return $строб.get_instance_shader_parameter('radius') * 125.0
func get_strob_color() -> float:    return $строб.get_instance_shader_parameter('color')

func get_canvas_rotation() -> float: return material.get('shader_parameter/rotation')
func get_radius_outter()  -> float: return material.get('shader_parameter/radius_outter')
func get_radius_inner_0() -> float: return material.get('shader_parameter/radius_inner_0')
func get_radius_inner_1() -> float: return material.get('shader_parameter/radius_inner_1')

func set_band_colors(val: Array): material.set('shader_parameter/ant_band_c', val)


## Добавляет сектор запрета[br]
## [param id] - Индекс сектора запрета.[br]
## [param szv.x] - Центральная частота (198...546).[br]
## [param szv.w] - Ширина диапазона (198...546).[br]
## [param szv.y] - Угол центра (0...360).[br]
## [param szv.z] - Ширина по углу (0...360).[br]
func add_seczap(id: int, szv: Vector4):
    var seczap: = SecZap.instantiate()
    seczap.name = StringName('SECZAP%d' % id)
    seczap.position = $строб.position
    seczap.set_instance_shader_parameter('dir', szv.y - 90.0)
    seczap.set_instance_shader_parameter('width',  szv.z)
    seczap.set_instance_shader_parameter('band',   sv(szv.w))
    seczap.set_instance_shader_parameter('radius', sv(szv.x))
    add_child(seczap)


## Удаляет сектор запрета[br]
## [param id] - Индекс сектора запрета[br]
func remove_seczap(id: int):
    var seczap: = get_node_or_null('SECZAP%d' % id)
    if not seczap: return
    remove_child(seczap)
    seczap.queue_free()


## Изменяет сектор запрета[br]
## [param id] - Индекс сектора запрета[br]
## [param szv.x] - Центральная частота[br]
## [param szv.w] - Ширина диапазона[br]
## [param szv.y] - Угол центра[br]
## [param szv.z] - Ширина по углу[br]
func set_seczap(id: int, szv: Vector4):
    var seczap: = get_node('SECZAP%d' % id)
    seczap.set_instance_shader_parameter('dir', szv.y)
    seczap.set_instance_shader_parameter('width', szv.z)
    seczap.set_instance_shader_parameter('band',   sv(szv.w))
    seczap.set_instance_shader_parameter('radius', sv(szv.x))


func clear_all_seczap():
    for child in get_children():
        if child.name.begins_with("SECZAP"):
            remove_child(child)
            child.queue_free()


func set_seczap_color(id: int, color: Color):
    var seczap: = get_node('SECZAP%d' % id)
    seczap.set_instance_shader_parameter('color', color)


func set_view_mode(val: int):
    if val == 1:
        $строб.hide()
    else:
        $строб.show()
    material.set('shader_parameter/mode', val)


## Закрашивание по умолчанию блоков ФС цветами из настроек.
func set_def_colors():
    var color0: Color = ProjectSettings.get_setting('application/interfer/default_color0', Color(0.38, 0.47, 0.51, 1.0))
    var color1: Color = ProjectSettings.get_setting('application/interfer/default_color1', Color(0.39, 0.44, 0.50, 1.0))
    color0 *= Color(1.0, 1.0, 1.0, 0.0)
    color1 *= Color(1.0, 1.0, 1.0, 0.0)
    var col_arr: Array = [color0, color1]
    var col = false
    for i in NUM_OF_RANGE:
        for j in NUM_OF_DIRECTIONS:
            fs_default_colors.append(col_arr[int(col)])
            col = not col
        col = not col
    set_band_colors(fs_default_colors)
