extends GridMap

const Tetromino = preload("res://Tetrominos/Tetromino.gd")
const ExplodingLine = preload("res://ExplodingLine/ExplodingLine.tscn")

const EMPTY_CELL = -1
const MINO = 0

export (int) var NB_LINES = 20
export (int) var NB_COLLUMNS = 10

var exploding_lines = []

func _ready():
	for y in range(NB_LINES):
		exploding_lines.append(ExplodingLine.instance())
		add_child(exploding_lines[y])
		exploding_lines[y].translation = Vector3(NB_COLLUMNS/2, y, 1)

func is_free_cell(position):
	return (
		0 <= position.x and position.x < NB_COLLUMNS
		and position.y >= 0
		and get_cell_item(position.x, position.y, 0) == GridMap.INVALID_CELL_ITEM
	)
	
func possible_positions(initial_positions, movement):
	var position
	var test_positions = []
	for i in range(4):
		position = initial_positions[i] + movement
		if is_free_cell(position):
			test_positions.append(position)
	if test_positions.size() == Tetromino.NB_MINOES:
		return test_positions
	else:
		return []
		
func lock(piece):
	for position in piece.positions():
		set_cell_item(position.x, position.y, 0, MINO)

func clear_lines():
	var nb_minoes
	var lines_cleared = 0
	for y in range(NB_LINES-1, -1, -1):
		nb_minoes = 0
		for x in range(NB_COLLUMNS):
			if get_cell_item(x, y, 0) == MINO:
				nb_minoes += 1
		if nb_minoes == NB_COLLUMNS:
			for y2 in range(y, NB_LINES+2):
				for x in range(NB_COLLUMNS):
					set_cell_item(x, y2, 0, get_cell_item(x, y2+1, 0))
			lines_cleared += 1
			exploding_lines[y].restart()
	return lines_cleared