class Drawer:
	func reset() -> void:
		pass

	func set_pixel(_sprite: Image, _pos: Vector2, _new_color: Color) -> void:
		pass


class SimpleDrawer extends Drawer:
	func reset() -> void:
		pass


	func set_pixel(_sprite: Image, _pos: Vector2, _new_color: Color) -> void:
		_sprite.set_pixel(_pos.x, _pos.y, _new_color)


class PixelPerfectDrawer extends Drawer:
	const neighbours = [Vector2(0, 1), Vector2(1, 0), Vector2(-1, 0), Vector2(0, -1)]
	const corners = [Vector2(1, 1), Vector2(-1, -1), Vector2(-1, 1), Vector2(1, -1)]
	var last_pixels = [null, null]


	func reset():
		last_pixels = [null, null]


	func set_pixel(_sprite: Image, _pos: Vector2, _new_color: Color) -> void:
		last_pixels.push_back([_pos, _sprite.get_pixel(_pos.x, _pos.y)])
		_sprite.set_pixel(_pos.x, _pos.y, _new_color)

		var corner = last_pixels.pop_front()
		var neighbour = last_pixels[0]

		if corner == null or neighbour == null:
			return

		if _pos - corner[0] in corners and _pos - neighbour[0] in neighbours:
			_sprite.set_pixel(neighbour[0].x, neighbour[0].y, neighbour[1])
			last_pixels[0] = corner