extends TileMap

enum TileType {WALL = 2, BLANK = 3, HOLE = 4, STOP = 5}

const tileTable: Array = [TileType.BLANK,TileType.BLANK,TileType.WALL,TileType.HOLE,TileType.STOP]
var cellGraph: Array
var nextRow: int = -1

func _ready() -> void:
	generate(get_used_cells())
	
func generate(cells: Array):
	for cell in cells:
		var tile: int = tileTable[rand_range(0,tileTable.size())]
		set_cellv(cell,tile)
		
	for cell in cells:
		var cellGraphData: CellGraphData = CellGraphData.new()
		cellGraphData.cell = cell
		
		for x in range(-1,2):
			for y in range(-1,2):
				if (x == 0 && y == 0):
					continue
				var tile: int = get_cellv(cell)
				if (tile == TileType.WALL || tile == TileType.HOLE):
					continue
				var move: Vector2 = find_move(cell, Vector2(x,y))
				if (move == cell):
					continue
				var moveTile: int = get_cellv(move)
				if (moveTile == TileType.WALL || moveTile == TileType.HOLE): 
					continue
				cellGraphData.links.append(move)
		
		cellGraph.append(cellGraphData)

func map_pos(grid: Vector2) -> Vector2:
	return cell_size * grid

func find_move(from: Vector2, dir: Vector2) -> Vector2:
	var curPos: Vector2 = from
	var cont: bool = true
	
	while (cont):
		var nextPos: Vector2 = curPos + dir
				
		var nextCell: int = get_cellv(nextPos)
		if (nextCell == TileType.WALL): # wall
			return curPos
		elif (nextCell == TileType.STOP || nextCell == TileType.HOLE): # stop or hole
			return nextPos
		elif (nextCell == TileMap.INVALID_CELL):
			return nextPos
		else:
			curPos = nextPos
	
	return Vector2(-1,-1)
	
func _process(delta: float) -> void:
	position.y += delta * 3
	
	if (position.y > (cell_size.y * abs(nextRow))):
		print("Generating row " + String(nextRow))
		nextRow += 1
		var toGenerate: Array = []
		for x in range(get_used_rect().size.x):
			toGenerate.append(Vector2(x,-nextRow))
			
		generate(toGenerate)

class CellGraphData:
	var cell: Vector2
	var links: Array