extends Node2D

var current_player: int = 0
var player_states := ["Circle", "Cross"]
var won := ""
var sequence_needed = 4
var _sequence = []
var enable_remove = true

@onready var gui := $GUI as Node2D
@onready var board := $Board as Board
@onready var nextPlayer := $GUI/NextPlayer as Sprite2D
@onready var wonPlayer := $GUI/WonPlayer as Sprite2D
@onready var diceButton := $GUI/DiceButton as Button
@onready var diceSprite = $GUI/DiceSprite as Sprite2D
@onready var player1Sprite = $GUI/Player1Sprite as Sprite2D
@onready var player2Sprite = $GUI/Player2Sprite as Sprite2D
@onready var ereignis = $GUI/Event as Label
@onready var sequenz = $GUI/Sequenz as Label
@onready var schnick = $Schnick
@onready var numbers = $Numbers as TileMap

# Called when the node enters the scene tree for the first time.
func _ready():
	current_player = 0
	sequence_needed = 4
	board.reset()
	won = ""
	ereignis.text = "Ereignis: "
	sequenz.text = "Steine zum gewinnen: 4"
	wonPlayer.hide()
	nextPlayer.region_rect.position.x = current_player * 300
	nextPlayer.show()
	_update_dice_sprite(0)
	board.active = true


# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(_delta):
	if won == "":
		if Input.is_action_just_pressed("Click"):
			var grid_pos = board.gridpos_at_mouse()
			if enable_remove:
				print(grid_pos)
				board._clear_enemy_tile(grid_pos)
				enable_remove = false
			elif board.get_state(Vector2(grid_pos.x, 0)) == board.empty_state:
				var new_pos = board._calculate_drop_pos(grid_pos)
				if board.set_state(new_pos, player_states[current_player]):
					won = _check_win()
					if won=="":
						switch_player()
					else:
						print("Winner: ", won)
						wonPlayer.region_rect.position.x = player_states.find(won) * 300
						if won == player_states[0]:
							for tile in _sequence:
								board.set_cell(1, tile, 1, Vector2i(0, 2), 0)
						else:
							for tile in _sequence:
								board.set_cell(1, tile, 1, Vector2i(3, 2), 0)
						wonPlayer.show()
						nextPlayer.hide()
						board.active = false

func switch_player():
	current_player = 1 - current_player
	nextPlayer.region_rect.position.x = current_player * 300

func _on_restart_button_pressed():
	_ready()


var _checks = [
	[Vector2i(-1,0), Vector2i(1,0)],
	[Vector2i(0,-1), Vector2i(0,1)],      
	[Vector2i(-1,-1), Vector2i(1,1)],     
	[Vector2i(-1,1), Vector2i(1,-1)],
]


func _check_win() -> String:
	for cell in board.get_used_cells(board.layer_by_name[board.state_layer]):
		var state = board.get_state(cell)
		_sequence.clear()
		for check in _checks:
			for i in range(3):
				var same = true
				for j in range(sequence_needed):
					if board.get_state(cell + check[0] * (i + j)) != state:
						same = false
						break
					_sequence.append(Vector2i(cell + check[0] * (i + j)))
				if same:
					return state
	return ""


#Generiert die Zufallszahl von 1-6
func _roll_dice() -> int:
	var zahl = randi() % 6 + 1
	var animation_help
	var zahl_davor
	for i in range(6):
		if animation_help == zahl_davor:
			zahl_davor = randi() % 6 + 1
			_update_dice_sprite(zahl_davor)
			animation_help = zahl_davor
		
		await get_tree().create_timer(0.25).timeout
	_update_dice_sprite(zahl)
	print(zahl) #Debug ausgabe, später löschen 
	
	if zahl == 1:
		switch_to_schnick()
	return zahl

	

#Funktion um Knopf und Methode zu verbinden
func _on_dice_button_pressed():
	_roll_dice()


#Sucht sich für die entsprechende Augenzahl
#die X und Y-Koordinaten in der Tilemap
func _update_dice_sprite(result :int):
	diceSprite.region_rect.position.x = _get_dice_pos_x(result)
	diceSprite.region_rect.position.y = _get_dice_pos_y(result)


#X-Koordinaten der Augenzahlen in der Tilemap
func _get_dice_pos_x(result: int) -> int:
	match result:
		1: return 8
		2: return 108
		3: return 208
		4: return 308
		5: return 108
		6: return 208
	return 208


#Y-Koordinaten in der Tilemap
func _get_dice_pos_y(result: int) -> int:
	match result:
		1: return 308
		2: return 308
		3: return 308
		4: return 308
		5: return 410
		6: return 410
	return 410
	

	
#Nach dem Glücksradereignis wird die Siegesbedingung auf 5 gewinnt geändert
func _five_wins() -> void:
	print("5 Gewinnt aktiv") #Debug
	sequence_needed = 5

#Nach dem Glücksradereignis tauschen die Spieler die Symbole
func _change_symbols():
	print("tausch") #debug
	current_player = 1 - current_player
	nextPlayer.region_rect.position.x = current_player * 300
	var tempX = player1Sprite.region_rect.position.x
	var tempY = player1Sprite.region_rect.position.y
	player1Sprite.region_rect.position.x = player2Sprite.region_rect.position.x
	player1Sprite.region_rect.position.y = player2Sprite.region_rect.position.y
	player2Sprite.region_rect.position.x = tempX
	player2Sprite.region_rect.position.y = tempY
	
#Nach dem Glücksradereignis gewinnt der Spieler sofort
func _instant_win():
	won = player_states[current_player]
	print("Winner: ", won)
	wonPlayer.region_rect.position.x = player_states.find(won) * 300
	wonPlayer.show()
	nextPlayer.hide()
	board.active = false
	
func _instant_loose():
	current_player = 1 - current_player
	won = player_states[current_player]
	print("Winner: ", won)
	wonPlayer.region_rect.position.x = player_states.find(won) * 300
	wonPlayer.show()
	nextPlayer.hide()
	board.active = false

#Zum Testen der Events
func _on_test_pressed():
		switch_to_schnick()


func _spin_the_wheel(result: int) -> void:
	ereignis.text = "Ereignis: "
	if result <= 3:
		ereignis.text += "Instant win!"
		_instant_win()
	elif result <= 6:
		ereignis.text += "Instant loose!"
		_instant_loose()
	elif result <= 15:
		enable_remove = true
		ereignis.text += "Du darfst einen Stein entfernen!"
	elif result <= 30:
		ereignis.text += "Symboltausch!"
		_change_symbols()
	elif result <= 45:
		if sequence_needed == 5:
			print("lol")
			_spin_the_wheel(randi() % 100 + 1)
		else:
			ereignis.text += "Ab jetzt gilt 5 - Gewinnt!"
			sequenz.text = "Steine zum gewinnen: 5"
			_five_wins()
	elif result <= 65:
		var zeile_zum_loeschen = randi() % 6 + 1
		ereignis.text += "Zeile " + str(zeile_zum_loeschen) + " wird entfernt!"
		board.delete_column(zeile_zum_loeschen)
	elif result <= 85:
		var spalte_zum_loeschen = randi() % 6 + 1
		ereignis.text += "Spalte " + str(spalte_zum_loeschen) + " wird entfernt!"
		board.delete_row(spalte_zum_loeschen)
	elif result <= 100:
		ereignis.text += str(result)
		print("größer als 85")#Debug
		

#Am Glücksrad drehen
func _on_spin_the_wheel_pressed():
	var zahl = randi() % 100 + 1
	_spin_the_wheel(zahl)

func hide_schnick():
	schnick.hide()

func switch_to_schnick():
	board.hide()
	numbers.hide()
	gui.hide()
	schnick.show()

func switch_to_game():
	gui.show()
	numbers.show()
	board.show()

func _on_gewonnen_pressed():
	hide_schnick()
	switch_to_game()

func _on_verloren_pressed():
	switch_player()
	hide_schnick()
	switch_to_game()
