class_name StandardRoom
extends TileMap

const TILEMAP_LAYER = 0

@export_category("Room Openings")
@export var left: bool = false
@export var right: bool = false
@export var top: bool = false
@export var bottom: bool = false

@onready
var room_size: Vector2i = self.get_used_rect().size
@onready
var cell_size: Vector2i = self.tile_set.tile_size


func is_block() -> bool:
	if self.left or self.right or self.top or self.bottom:
		return false
	return true

func get_exits() -> Array[Vector2i]:
	var exits: Array[Vector2i] = []
	if self.left:
		exits.append(Vector2i.LEFT)
	if self.right:
		exits.append(Vector2i.RIGHT)
	if self.top:
		exits.append(Vector2i.UP)
	if self.bottom:
		exits.append(Vector2i.DOWN)
	return exits

func get_exit_pos(exit: Vector2i) -> Vector2i:
	var pos: Vector2i = Vector2i.ZERO
	if exit == Vector2i.LEFT:
		pos = Vector2i(0, self.room_size.y / 2)
	elif exit == Vector2i.RIGHT:
		pos = Vector2i(self.room_size.x - 1, self.room_size.y / 2)
	elif exit == Vector2i.UP:
		pos = Vector2i(self.room_size.x / 2, 0)
	elif exit == Vector2i.DOWN:
		pos = Vector2i(self.room_size.x / 2, self.room_size.y - 1)
	return pos

func copy_to_map(map: TileMap, pos: Vector2i) -> void:
	for x in range(self.room_size.x):
		for y in range(self.room_size.y):
			var tile = self.get_cell_source_id(TILEMAP_LAYER, Vector2i(x, y))
			if tile.tile_set:
				map.set_cell(TILEMAP_LAYER, Vector2i(pos.x + x, pos.y + y), tile.tile_id)
			else:
				map.set_cell(TILEMAP_LAYER, Vector2i(pos.x + x, pos.y + y), -1)

# Validate room by checking that the top left tile is at 0, 0 and all exits are valid
func _validate() -> bool:

	# Check of tiles where x is negative
	pass
	
	# Check for tiles where y is negative
	pass
	
	# If exit on left, check that the middle tile on the left is empty
	if self.left and self.get_cell_source_id(TILEMAP_LAYER, Vector2i(0, self.room_size.y / 2)) != -1:
		push_error("Room with exit on left must have empty middle tile on left")
		return false
	# If exit on right, check that the middle tile on the right is empty
	if self.right and self.get_cell_source_id(TILEMAP_LAYER, Vector2i(self.room_size.x - 1, self.room_size.y / 2)) != -1:
		push_error("Room with exit on right must have empty middle tile on right")
		return false
	# If exit on top, check that the middle tile on the top is empty
	if self.top and self.get_cell_source_id(TILEMAP_LAYER, Vector2i(self.room_size.x / 2, 0)) != -1:
		push_error("Room with exit on top must have empty middle tile on top")
		return false
	# If exit on bottom, check that the middle tile on the bottom is empty
	if self.bottom and self.get_cell_source_id(TILEMAP_LAYER, Vector2i(self.room_size.x / 2, self.room_size.y - 1)) != -1:
		push_error("Room with exit on bottom must have empty middle tile on bottom")
		return false
	
	return true
