tool

extends Area2D

class_name ElectricSocket

enum Direction { LEFT, RIGHT, UP, DOWN }
enum Flow { SOURCE, SINK, BIDIRECTIONAL }

export(Direction) var direction := Direction.DOWN setget set_direction

export(Array, NodePath) var connectionPaths := []
var connections := []

export(Color) var source_color
export(Color) var sink_color
export(Color) var bidirectional_color

export(Flow) var flow = Flow.SINK setget set_flow

onready var socket = $socket

var network = null

func _ready() -> void:
	socket.material = socket.material.duplicate()
	refresh_sprite()
	if Engine.editor_hint:
		return
	for connection in connectionPaths:
		add_connection(get_node(connection))

func add_connection(node: Node) -> void:
	var manager := node.get_node("PowerManager") as PowerManager
	manager.socket = self
	connections.append(manager)

func set_direction(dir) -> void:
	direction = dir
	refresh_sprite()

func set_flow(val) -> void:
	flow = val
	refresh_sprite()

func refresh_sprite() -> void:
	if socket == null:
		return
	match direction:
		Direction.DOWN:
			socket.region_rect.position = Vector2(0, 0)
		Direction.UP:
			socket.region_rect.position = Vector2(32, 0)
		Direction.LEFT:
			socket.region_rect.position = Vector2(32, 32)
		Direction.RIGHT:
			socket.region_rect.position = Vector2(0, 32)
	match flow:
		Flow.SOURCE:
			socket.material.set_shader_param("cable_color", source_color)
		Flow.SINK:
			socket.material.set_shader_param("cable_color", sink_color)
		Flow.BIDIRECTIONAL:
			socket.material.set_shader_param("cable_color", bidirectional_color)

func serialize():
	var connection_paths := []
	for conn in connections:
		connection_paths.append({ "path": get_path_to(conn), "powered": conn.powered })

	return {
		"direction": direction,
		"flow": flow,
		"connections": connection_paths
	}

func deserialize(data):
	set_direction(data["direction"])
	set_flow(data["flow"])
	for node in data["connections"]:
		var manager := get_node(node.path) as PowerManager
		manager.socket = self
		manager.powered = node.powered
		connections.append(manager)
