extends Node2D

@export var tile_set: TileSet
@export var player_map: Node2D
@export var player_tower_map: TileMapLayer
@export var opponent_map: Node2D
@export var opponent_tower_map: TileMapLayer
@export var map_size := Vector2i(10, 20)
@export var camera: Camera2D

var clicked: bool = false
var clicked_pos: Vector2


func _ready() -> void:
	player_tower_map.tile_set = tile_set
	opponent_tower_map.tile_set = tile_set
	player_tower_map.clear()
	opponent_tower_map.clear()
	MatchChannel.connect("on_match_update", on_match_update)


func _process(_delta: float) -> void:
	# gdlint:ignore = max-line-length
	var new_zoom := float(get_window().size.y) / float(map_size.y * tile_set.tile_size.y)
	camera.zoom = Vector2(new_zoom, new_zoom)
	var new_base_postion := get_window().size / 2 / new_zoom
	camera.position = new_base_postion

	self.position.x = new_base_postion.x - map_size.x * tile_set.tile_size.x
	opponent_map.position.x = map_size.x * tile_set.tile_size.x


func _input(_event) -> void:
	if Input.is_action_just_pressed("place"):
		clicked_pos = get_global_mouse_position()
		clicked = true


func _physics_process(_delta: float) -> void:
	if clicked:
		clicked = false
		var pos: Vector2i = world_to_game_pos(clicked_pos)
		if pos == Vector2i(-1, -1):
			return
		MatchChannel.send_request_place(pos.x, pos.y)


func on_match_update(msg: TowerPlacedMessage) -> void:
	if msg.map == TowerPlacedMessage.GamePlayerMaps.PLAYER:
		player_tower_map.set_cell(Vector2i(msg.x, msg.y), 1, Vector2i(0, 0))
	else:
		opponent_tower_map.set_cell(Vector2i(msg.x, msg.y), 1, Vector2i(0, 0))


func world_to_game_pos(world_pos: Vector2) -> Vector2i:
	if (
		world_pos.x < self.position.x
		|| world_pos.x > self.position.x + map_size.x * tile_set.tile_size.x
	):
		return Vector2i(-1, -1)
	return Vector2i(
		(world_pos.x - self.position.x) / tile_set.tile_size.x,
		world_pos.y / tile_set.tile_size.y,
	)