extends Node

class_name GameInstance

signal state_received()

onready var ui = $CanvasLayer/ui
onready var world = $world
onready var systems = $systems
onready var netgame = $"/root/Multiplayer"

func _ready() -> void:
	randomize()
	ui.connect("command", world, "process_command")
	if netgame.hosting:
		world.load_map(netgame.get_current_map())
		world.map.current_ship_position = Vector2(randf() * 1e4, randf() * 1e4)
		world.map.current_ship_target = null
		rpc("spawn_player", 1)
	else:
		world.load_map(GameWorld.Map.EMPTY)
		rpc_id(1, "send_map")
		yield(self, "state_received")
		rpc_id(1, "ready_to_spawn")

master func send_map() -> void:
	var id = get_tree().get_rpc_sender_id()
	var map_data = world.map.serialize()
	var systems_data = systems.serialize()
	print("sending map data to ", id)
	rpc_id(id, "receive_data", {
		"map": map_data,
		"systems": systems_data
	})

puppet func receive_data(data: Dictionary) -> void:
	world.map.deserialize(data["map"])
	systems.deserialize(data["systems"])
	print("Received map data from master")
	emit_signal("state_received")

master func ready_to_spawn() -> void:
	var id = get_tree().get_rpc_sender_id()
	print(id, " is ready to spawn players")
	
	# Tell him everyone to spawn
	var players = $world/players.get_children()
	for player in players:
		rpc_id(id, "spawn_player", player.get_network_master())

	# Then spawn him as well
	rpc("spawn_player", id)

remotesync func spawn_player(id):
	world.spawn_player(id, multiplayer.get_network_unique_id() == id)

remotesync func process_command(cmd: UICommand):
	match cmd.cmd_type:
		UICommand.CommandType.SetShipTarget:
			world.map.current_ship_target = cmd.cmd_args[0]
