print("Quarry length: ")
local l = tonumber(io.read())
print("Quarry width: ")
local w = tonumber(io.read())
print("Turtle Y: ")
local z0 = tonumber(io.read())
local listtype = 12
while(listtype ~= 1 and listtype ~= 0) do
	print("Whitelist y/n?")
	listtype = io.read()
	if(listtype == "yes" or listtype == "Yes" or listtype == "y" or listtype == "Y") then
		listtype = 1
	elseif(listtype == "no" or listtype == "No" or listtype == "n" or listtype == "N") then
		listtype = 0
	else
		print("Invalid answer, please type either yes or no")
	end
end
local x = 0
local y = 0
local z = 0
local rev = 1
local face = 0
local counter = 0
local fin = 3
trashtable = {}

print("Do you want to dig the whole chunk, y/n?")
local dummy = io.read()
if dummy == "n" or dummy == "N" or dummy == "no" or dummy == "No" then
	print("Layers to dig?")
 	fin = tonumber(io.read())
else fin = z0 end

fuel = turtle.getItemDetail(16).name

function refuel()
	local f = false
	if turtle.getFuelLevel() < 500 then 
		for i = 1,16 do
			fuelvar = false
			if not(turtle.getItemDetail(i) == nil) then
				if turtle.getItemDetail(i).name == fuel then
					fuelvar = true
				end
			end
			if fuelvar then
				turtle.select(i)
				while turtle.getItemCount() > 0 do
					turtle.refuel(1)
					if turtle.getFuelLevel() >= 500 then
						f = true
						turtle.select(1)
						break
					end
				end
			end
			if f then break end
		end
	end
end

function moveForward()
	refuel()
	while not turtle.forward() do
		turtle.dig()
	end
	if face == 0 then y=y+1 end
	if face == 1 then x=x+1 end
	if face == 2 then y=y-1 end
	if face == 3 then x=x-1 end 
end

function turn(num)
	if num == 1 then 
		turtle.turnRight()
		face = (face+1)%4
	elseif num == -1 then
		turtle.turnLeft()
		face = (face-1)%4
	end
end

local slot = 16

function trashlist()
	for i=1,15 do
		if turtle.getItemCount(i) > 0 then
			trashtable[i] = turtle.getItemDetail(i).name
		else
			slot = i
			break
		end
	end
	print("Item data saved")
	if(listtype == 0) then
		while face ~= 2 do turn(1) end
		for i=1,slot-1 do 
			turtle.select(i)
			turtle.drop()
		end
		turn(-1)
		turn(-1)
	end
	turtle.select(1)
end	

function dispense()
	while face ~= 2 do turn(-1) end
	for i=1,15 do
		turtle.select(i)
		print(i)
		if not turtle.refuel(0) then
			turtle.drop()
		else turtle.transferTo(16) turtle.drop()
		end
	end
end

function goHome(state)
	xp = x
	yp = y
	zp = z
	facep = face
	while y > 0 do	
		if face == 0 then turn(1) end
		if face == 1 then turn(1) end
		if face == 2 then moveForward() end
		if face == 3 then turn(-1) end
	end
	while x > 0 do
		if face == 0 then turn(-1) end
		if face == 1 then turn(-1) end
		if face == 2 then turn(1) end
		if face == 3 then moveForward() end
	end
	while z > 0 do
		turtle.up()
		z=z-1
	end
	while state == "fuel" do
		sleep(10)
		refuel()
		if turtle.getFuelLevel() >= 500 then state = "mine" end
	end
	if state == "full" then
	dispense()
	state = "mine"
	end
	if state == "comp" then 
		dispense()
		while face ~= 0 do turn(1) end
		error() 
	end
	if state == "mine" then
		while z < zp do
			turtle.down() z = z+1
		end
		while x < xp do
			if face == 0 then turn(1) end
			if face == 1 then moveForward() end
			if face == 2 then turn(-1) end
			if face == 3 then turn(-1) end
		end
		while y < yp do
			if face == 0 then moveForward() end
			if face == 1 then turn(-1) end
			if face == 2 then turn(1) end
			if face == 3 then turn(1) end
		end
		while face ~= facep do
			turn(1)
		end
	end
end

function compare(dir)
	local suc = true
	local dat = nil
	local tf = true
	if(listtype == 1) then
		tf = false
	end
	if dir == "up" then
		suc,dat = turtle.inspectUp()
	elseif dir == "front" then
		suc,dat = turtle.inspect()
	elseif dir == "down" then
		suc,dat = turtle.inspectDown()
	elseif dir == "in" then
		dat = turtle.getItemDetail()
	end	
	if suc then
		for i=1,slot-1 do
			if trashtable[i] == dat.name or "minecraft:coal_ore" == dat.name then
				return tf
			end
		end
	end
	return not(tf)
end
		

function digUp()
	if not compare("up") then
		while turtle.digUp() do 
--			turtle.digUp()
		end
	end
end

function digDown()
	if not compare("down") then
		while turtle.digDown() do 
--			turtle.digDown() 
		end
	end
end

function trashRemoval()
	for i=1,15 do
		dispose = true
		for j=1,slot-1 do
			if turtle.getItemCount(i) > 0 then
				if listtype == 0 then
					if turtle.getItemDetail(i).name == trashtable[j] then
						turtle.select(i)
						turtle.drop()
					end
				else
					if turtle.getItemDetail(i).name == trashtable[j] then
						dispose = false
					elseif(turtle.getItemDetail(i).name == turtle.getItemDetail(16).name) then
							turtle.select(i)
							turtle.transferTo(16)
							dispose = false
					end
				end
			end
		end
		if(listtype == 1 and dispose) then
			turtle.select(i)
			turtle.drop()
		end
	end
	turtle.select(1)
end

function isFull()
	local ret = true
	for i=1,15 do
		if turtle.getItemCount(i) == 0 then ret = false break end
	end
	return ret
end

function checkfuel()
	refuel()
	if turtle.getFuelLevel() < (x+y+z) then
		goHome("fuel")
	end
end

function mine()
	if counter%16 == 0 then checkfuel() counter = counter+1
	else counter = counter+1 end
	moveForward()
	digDown()
	digUp()
	if isFull() then 
		trashRemoval()
		if isFull() then goHome("full") end
	end
end

function Bore()
	while z < z0-3 do
		while not turtle.down() do turtle.digDown() end
		z = z+1
	end
end

function moveY()
	if y == 0 then
		while y < l-1 do
			if face == 0 then
				mine()
			elseif face == 1 or face == 2 then
				turn(-1)
			else turn(1)
			end
		end
	else
		while y > 0 do
			if face == 2 then
				mine()
			elseif face == 1 or face == 0 then
				turn(1)
			else turn(-1)
			end
		end
	end
end

function quarry()
	refuel()
	for i=0,w-1 do
		moveY()
		if(i < w-1) then
			if(i%2 == 0) then
				turn(rev)
			else
				turn(-rev)
			end
			mine()
		end
	end
end

function Mastermind()
	trashlist()
	refuel()
	if turtle.getFuelLevel() < 500 then
		print("Not enough fuel, please insert more fuel")
		while turtle.getFuelLevel() < 500 do
			sleep(5)
			refuel()
		end
	end
	print(z)
	Bore()
	for i=0,fin-3 do
		if i%3 == 0 then 
			turtle.digUp()
			quarry() 
			if(w%2 == 0) then
				rev=0-rev
			end
			trashRemoval()
		end
		if i < fin-3 then 
			while not turtle.up() do turtle.digUp() end
			z=z-1
		end
	end
	trashRemoval()
	goHome("comp")
end

Mastermind()