-- See README for usage info
-- https://git.desu.ltd/salt/mc-scripts/src/branch/master/stoneblock-3-chicken-breeder/README.md
function placeBreeder()
  print('Initializing breeder...')
  breeder = peripheral.wrap('top')
  -- First, we nab the new chicken in slot 1
  turtle.select(1)
  -- Check to see if this iteration obtained a new chicken
  if turtle.suckUp() then
    -- Then, we destroy the breeder
    print('Placing breeder with new chicken')
    turtle.select(2)
    turtle.digUp()
    -- We are now in a position where we have:
    -- 1: Good chicken
    -- 2: Inferior chicken
    -- 3: Seeds/second inferior chicken
    -- 4: Breeder/seeds
    -- 5: Null/breeder
    -- In any case, discarding 1 item in slot 2 will eliminate poor genes
    --turtle.select(2) -- Unnecessary due to previous instr
    turtle.dropDown(1)
  else
    -- Just pop the breeder for consistency
    print('Placing breeder from scratch')
    turtle.select(2)
    turtle.digUp()
  end
  -- Now we re set-up the breeder
  selectItem('chickens:breeder')
  turtle.placeUp()
  selectItem('minecraft:wheat_seeds')
  turtle.dropUp()
  pushBestChickens()
end

function selectItem(name)
  for i = 1, 16, 1 do
    if turtle.getItemDetail(i) then
      if turtle.getItemDetail(i).name == name then
        turtle.select(i)
        return i
      end
    end
  end
end

function pushBestChickens()
  print('Selecting best chickens...')
  chickens = 0
  index = nil
  for i = 16, 1, -1 do
    print('Checking index ' .. i)
    item = turtle.getItemDetail(i)
    if item then
      turtle.select(i)
      if not i == 1 then
        print('Discarding twin from breeding pair')
        turtle.dropDown(item.count - 1)
      end
      if item.name == 'chickens:chicken_item' then
        if item.count >= 16 then error('Done!') end
        for i = 1, item.count, 1 do
          if chickens == 0 then
            print('Inserting first chicken')
            turtle.dropUp(1)
            chickens = chickens + 1
          elseif chickens == 1 then
            print('Inserting second chicken')
            buffer = peripheral.wrap('front')
            turtle.drop(1)
            buffer.pushItems('top', 1, 16, 2)
            chickens = chickens + 1
          else
            print('Discarding chicken')
            turtle.dropDown()
          end
        end
      end
    end
  end
end

function checkIfDone()
  output = peripheral.wrap('bottom')
  for i = 1, output.size(), 1 do
    if output.getItemDetail(i) then
      item = output.getItemDetail(i)
      -- Magic number 3 here is determined as follows:
      -- 1 from the offspring of this new generation
      -- 2 from the breeding pair
      if item.count == item.maxCount - 3 then
        return true
      end
    end
  end
  return false
end

function cleanup()
  print('Cleaning up...')
  turtle.digUp()
  for i = 1, 16, 1 do
    turtle.select(i)
    turtle.dropDown()
  end
  print('Cleanup complete')
end

local function main()
  print('Initializing...')
  while not checkIfDone() do
    print('Iterating...')
    placeBreeder()  
    sleep()
    while peripheral.wrap('top').getItemDetail(4) == nil do sleep() end
  end
  cleanup()
  print('Breeding complete')
end

main()