-- vi: ft=lua
-- Goal: collect lava using buckets in the nether, deposit the buckets into a fluid transposer that extracts the lava and sends it to a power generator
--
-- chest above base needs to contain empty buckets
-- the filled buckets will be deposited in a chest below the base

FORWARD = 1
RIGHT = 2
LEFT = 3
BACKWARD = 4

local function compareItemName(target)
    local itemDetail = turtle.getItemDetail()
    if itemDetail == nil then
        return nil
    end
    return itemDetail.name == target
end

local function findFirstItem(target)
    for i=1,16 do
        turtle.select(i)
        if compareItemName(target) then
            print('Found an target item (' .. target .. ') in slot ' .. i)
            return i
        end
    end
    return nil
end

local function findFirstEmptyBucket()
    return findFirstItem("minecraft:bucket")
end

local function findFirstLavaBucket()
    return findFirstItem("minecraft:lava_bucket")
end

local function goRight()
    if not turtle.turnRight() then
        return false
    end

    local success = turtle.forward()

    turtle.turnLeft()
    return success
end

local function goLeft()
    if not turtle.turnLeft() then
        return false
    end

    local success = turtle.forward()

    turtle.turnRight()
    return success
end

local function doReverseMovement(movement)
    if movement == FORWARD then
        return turtle.back()
    elseif movement == RIGHT then
        return goLeft()
    elseif movement == LEFT then
        return goRight()
    elseif movement == BACKWARD then
        return turtle.forward()
    end
end

local function returnToBase()
    print('returing to base')
    for i = #Movements, 1, -1 do
        local movement = Movements[i]
        print('Movement ' .. i .. ': ' .. movement)
        if not doReverseMovement(movement) then
            print('hit a block on the way back, I am stuck!')
        end
    end
    Movements = {}
end

local function despositRefill()
    for i = 1, 16 do
        turtle.select(i)
        if compareItemName("minecraft:lava_bucket") then
            while not turtle.dropDown() do
                ---@diagnostic disable-next-line: undefined-field
                os.sleep(1)
            end
        end
        if compareItemName("minecraft:bucket") then
            turtle.dropUp()
        end
    end

    print('sleeping for 15 seconds, waiting for the buckets to be returned')
    os.sleep(15)
    turtle.suckUp(16)
    while not redstone.getInput("right") do
        print('no active redstone signal on the right side, waiting to start')
        os.sleep(5)
    end
end

local function refuel()
    local lava_bucket = findFirstLavaBucket()
    if lava_bucket == nil then
        return false
    end

    turtle.select(lava_bucket)
    turtle.refuel()
    return true
end


Movements = {}

despositRefill()
while true do
    if turtle.getFuelLevel() <= #Movements then
        print('not enough fuel to return. trying to refuel')
        if not refuel() then
            print('refulling failed. probably the end of the lava lake. returning to base')
            returnToBase()
            break
        end
    end

    if not compareItemName("minecraft:bucket") and findFirstEmptyBucket() == nil then
        print('could not find any empty buckets. returning and refilling')
        returnToBase()
        despositRefill()

    else
        -- try to fill it
        turtle.placeDown()
        if compareItemName("minecraft:bucket") then
            if turtle.forward() then
                table.insert(Movements, FORWARD)
            elseif goRight() then
                table.insert(Movements, RIGHT)
            elseif goLeft() then
                table.insert(Movements, LEFT)
            else
                print("can't find a path - returning to base")
                returnToBase()
                despositRefill()
            end
        end
    end
end