extends Node
@onready var countdown: Label = $MenuDisplay/countdown
@onready var btn_fullscreen = $MenuDisplay/btn_fullscreen
@onready var btn_save_whitelist= $MenuDisplay/btn_save_whitelist
var keywhitelist
#var playeroverridecolors

var keyHolddownQueue = {}

const KEY_HOLDDOWN_TO_ENTER_TIME=500 #in milliseconds

func _ready():
	removeAssignedKeys()
	Gamestate.removeAllPlayers()
	$Timer.stop()
	
	btn_fullscreen.button_pressed=DisplayServer.window_get_mode(0)==DisplayServer.WINDOW_MODE_FULLSCREEN #toogle fullscreen switch to correct init state
	
	btn_fullscreen.button_pressed=ConfigFileHandler.get_video_setting("fullscreen")
	Gamestate.setRemoveCarsTimeout(ConfigFileHandler.get_general_setting("remove_cars_timeout"))
	Gamestate.setAutomaticMapChangeAfter(ConfigFileHandler.get_general_setting("automatic_map_change_after"))
	
	keywhitelist=ConfigFileHandler.get_keywhitelist_setting() #empty list if disabled
	btn_save_whitelist.disabled=keywhitelist.size()>0 #whitelist enabled, then disable save whitelist button
	btn_save_whitelist.visible=!keywhitelist.size()>0
	print("Loaded Keywhitelist="+str(keywhitelist))
	Gamestate.setColorwheelstepByPlayernum(keywhitelist.size())
	
	
	#playeroverridecolors=ConfigFileHandler.get_playeroverridecolors_setting()
	#print("playeroverridecolors="+str(playeroverridecolors))
	
	#Preload players to set colors
	if keywhitelist.size()>0: #add whitelisted players if whitelist enabled and remove them afterwards
		var i=0
		for k in keywhitelist:
			Gamestate.addPlayer(k,ConfigFileHandler.get_playeroverridecolor_setting(i))
			i+=1
			
		Gamestate.removeAllPlayers()
		
	

func assignKeys():
	var i=0
	for playerkey in Gamestate.getPlayerkeys():
		InputMap.add_action(Gamestate.userinput_prefix+str(i))
		var ev = InputEventKey.new()
		ev.keycode=playerkey
		InputMap.action_add_event(Gamestate.userinput_prefix+str(i), ev)
		i+=1
		
func removeAssignedKeys():
	for action in InputMap.get_actions():
		if action.get_basename().begins_with(Gamestate.userinput_prefix):
			print("Removed Action "+str(action.get_basename()))
			InputMap.erase_action(action)
	
func _unhandled_key_input(event: InputEvent) -> void:
	var currentmsecs=Time.get_ticks_msec()
	
	if event is InputEventKey:
		if keywhitelist.has(event.keycode) or keywhitelist.size()<1: #is key whitelisted?
			if event.is_pressed() and not keyHolddownQueue.has(event.keycode) and not Gamestate.getPlayerkeys().has(event.keycode): #key just pressed and not already added
				keyHolddownQueue[event.keycode]=currentmsecs
			if event.is_released() and keyHolddownQueue.has(event.keycode):
				keyHolddownQueue.erase(event.keycode)
				
			if event.is_pressed() and Gamestate.getPlayerkeys().has(event.keycode): #key pressed and player already added
				$MenuDisplay.update_playerlist(Gamestate.players,event.keycode,"blink")


func _on_timer_timeout() -> void: #Start Game
	print("Game starting")
	get_tree().change_scene_to_file("res://scenes/game.tscn")
	$Timer.stop()
	assignKeys()
	
	
func _process(delta: float) -> void:
	var currentmsecs=Time.get_ticks_msec()
	
	for queuedKey in keyHolddownQueue:
		if currentmsecs-keyHolddownQueue[queuedKey]>KEY_HOLDDOWN_TO_ENTER_TIME: #and pressed long enough
			keyHolddownQueue.erase(queuedKey)
		
			#if keywhitelist.has(event.keycode) or keywhitelist.size()<1: #is key whitelisted?
			print("Key added. keycode:"+str(queuedKey))
			var addedID=Gamestate.addPlayer(queuedKey)
				
			$MenuDisplay.update_playerlist(Gamestate.players,queuedKey,"explode")
			
			
			if addedID!=-1: #player was added
				if len(Gamestate.getPlayerkeys())>=1: 
					$Timer.start()
				else:
					$Timer.stop()
	
	
	if $Timer.is_stopped() or $Timer.time_left>3.5:
		$MenuDisplay.updateCountdown(-1) #do not display countdown
	else:
		$MenuDisplay.updateCountdown(round($Timer.time_left)) #update countdown time
	
	
func _input(ev):
	#if ev is InputEventKey and 
	if Input.is_action_just_pressed("ui_cancel"):
		get_tree().quit()


func _on_btn_fullscreen_toggled(toggled_on: bool) -> void:
	if toggled_on:
		DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN)
	else:
		DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)
	ConfigFileHandler.save_video_setting("fullscreen", toggled_on)


func _on_rounds_selection_item_selected(index: int) -> void:
	if not $Timer.is_stopped(): #only restart
		$Timer.start()

func _on_map_container_map_changed() -> void:
	if not $Timer.is_stopped(): #only restart
		$Timer.start()


func _on_button_pressed() -> void:
	if len(Gamestate.getPlayerkeys())>=1: 
		var _playerkeys=Gamestate.getPlayerkeys()
		print("Keys ="+str(_playerkeys))
		ConfigFileHandler.save_keywhitelist_setting(_playerkeys)