extends Control
class_name MainMenu


signal hosting_confirmed(player_name: String, player_color: Color, server_port: int)
signal connecting_confirmed(player_name: String, player_color: Color, server_address: String, server_port: int)


enum MenuStage {
	NAME_INPUT = 1,
	COLOR_PICKER = 2,
	SERVER_MENU = 3,
}

var current_stage: MenuStage:
	get:
		return current_stage
	set(value):
		if value == current_stage:
			return
		match current_stage:
			MenuStage.NAME_INPUT:
				deinit_name_input()
			MenuStage.COLOR_PICKER:
				deinit_color_picker()
			MenuStage.SERVER_MENU:
				deinit_server_menu()
		current_stage = value
		match value:
			MenuStage.NAME_INPUT:
				init_name_input()
			MenuStage.COLOR_PICKER:
				init_color_picker()
			MenuStage.SERVER_MENU:
				init_server_menu()


@onready var panel_parent: Container = $"VBoxContainer"


var player_name: String = ""
const name_input_scene = preload("res://scenes/player_name_input.tscn")
var name_input_instance: PlayerNameInput = null

func init_name_input():
	name_input_instance = name_input_scene.instantiate()
	name_input_instance.name_confirmed.connect(_on_name_confirmed)
	panel_parent.add_child(name_input_instance)

func deinit_name_input():
	name_input_instance.name_confirmed.disconnect(_on_name_confirmed)
	name_input_instance.queue_free()

func _on_name_confirmed(selected_name: String):
	player_name = selected_name
	current_stage = MenuStage.COLOR_PICKER


var player_color: Color = Color.WHITE
const color_picker_scene = preload("res://scenes/player_color_picker.tscn")
var color_picker_instance: PlayerColorPicker = null

func init_color_picker():
	color_picker_instance = color_picker_scene.instantiate()
	color_picker_instance.color_confirmed.connect(_on_color_confirmed)
	panel_parent.add_child(color_picker_instance)

func deinit_color_picker():
	color_picker_instance.color_confirmed.disconnect(_on_color_confirmed)
	color_picker_instance.queue_free()

func _on_color_confirmed(selected_color: Color):
	player_color = selected_color
	current_stage = MenuStage.SERVER_MENU


const server_menu_scene = preload("res://scenes/server_options_menu.tscn")
var server_menu_instance: ServerOptionsMenu = null

func init_server_menu():
	server_menu_instance = server_menu_scene.instantiate()
	server_menu_instance.hosting_confirmed.connect(_on_hosting_confirmed)
	server_menu_instance.connecting_confirmed.connect(_on_connecting_confirmed)
	panel_parent.add_child(server_menu_instance)

func deinit_server_menu():
	server_menu_instance.queue_free()

func _on_hosting_confirmed(port: int):
	hosting_confirmed.emit(player_name, player_color, port)

func _on_connecting_confirmed(address: String, port: int):
	connecting_confirmed.emit(player_name, player_color, address, port)


func _ready():
	current_stage = MenuStage.NAME_INPUT