
-- Edit these first 2 to adjust how much is planted in a pass
-- May need to adjust walk_time in Barley_common.inc if you move too slowly to keep up
-- grids tested: 2x2, 3x3, 5x5, 6x6 (probably need 3+ dex and 600ms walk time)
grid_w = 5;
grid_h = 5;
watered = {};

dofile("Flax_common.inc");
dofile("screen_reader_common.inc");
dofile("ui_utils.inc");


function promptBarleyNumbers(is_plant)
	scale = 1.0;
	
	local z = 0;
	local is_done = nil;
	local value = nil;
	-- Edit box and text display
	while not is_done do
		-- Put these everywhere to make sure we don't lock up with no easy way to escape!
		checkBreak("disallow pause");
		
		lsPrint(10, 10, z, scale, scale, 0xFFFFFFff, "Choose passes and grid size");
		
		-- lsEditBox needs a key to uniquely name this edit box
		--   let's just use the prompt!
		-- lsEditBox returns two different things (a state and a value)
		local y = 40;
		lsPrint(5, y, z, scale, scale, 0xFFFFFFff, "Passes:");
		is_done, num_loops = lsEditBox("passes",
			100, y, z, 50, 30, scale, scale,
			0x000000ff, 5);
		if not tonumber(num_loops) then
			is_done = nil;
			lsPrint(10, y+18, z+10, 0.7, 0.7, 0xFF2020ff, "MUST BE A NUMBER");
			num_loops = 1;
		end
		y = y + 32;

		lsPrint(5, y, z, scale, scale, 0xFFFFFFff, "Grid size:");
		is_done, grid_w = lsEditBox("grid",
			100, y, z, 50, 30, scale, scale,
			0x000000ff, grid_w);
		if not tonumber(grid_w) then
			is_done = nil;
			lsPrint(10, y+18, z+10, 0.7, 0.7, 0xFF2020ff, "MUST BE A NUMBER");
			grid_w = 1;
			grid_h = 1;
		end
		grid_w = tonumber(grid_w);
		grid_h = grid_w;
		y = y + 32;

		if lsButtonText(170, y-32, z, 100, 0xFFFFFFff, "OK") then
			is_done = 1;
		end

		if is_plant then
			lsPrintWrapped(10, y, z+10, lsScreenX - 20, 0.7, 0.7, 0xD0D0D0ff, "This will plant and harvest a " .. grid_w .. "x" .. grid_w .. " grid of Barley " .. num_loops .. " times, requiring " .. (grid_w * grid_w) .. " raw barley and ".. (grid_w * grid_w * num_loops * 4) .. "water in jugs, doing " .. (grid_w*grid_w*num_loops) .. " harvests.");
		else
			lsPrintWrapped(10, y, z+10, lsScreenX - 20, 0.7, 0.7, 0xD0D0D0ff, "This will plant a " .. grid_w .. "x" .. grid_w .. " grid of Flax " .. num_loops .. " times, requiring " .. (grid_w * grid_w) .. " seeds, yielding " .. (grid_w * grid_w * num_loops) .. " seeds.");
		end

		if is_done and (not num_loops or not grid_w) then
			error 'Canceled';
		end
		
		if lsButtonText(lsScreenX - 110, lsScreenY - 30, z, 100, 0xFFFFFFff, "End script") then
			error "Clicked End Script button";
		end
	
		
		lsDoFrame();
		lsSleep(10); -- Sleep just so we don't eat up all the CPU for no reason
	end
end


function doit()

  promptBarleyNumbers(1);
  askForWindow("Make sure the plant barley window is pinned and you are in F8F8 cam zoomed in.  You may need to F12 at low resolutions or hide your chat window (if it starts planting and fails to move downward, it probably clicked on your chat window).  Will plant grid NE of current location.  'Plant all crops where you stand' must be ON.  'Right click pins/unpins a menu' must be ON.");
  lsSleep(1000);
  delay_time = 2000;
  local x = 1;
  local y = 1;
  initGlobals();
  -- Find the plant barley button
  srReadScreen();
  local imgBarley = "barley.png";
  local xyPlantBarley = srFindImage(imgBarley);
  if not xyPlantBarley then
    error 'Could not find plant window';
  end
  xyPlantBarley[0] = xyPlantBarley[0] + 5;
  

  

  for loop_count=1, num_loops do
  local start_time = lsGetTimer();
    harvested = 0;
	-- Init watered array to 0
	for y=grid_h, 1, -1 do
      for x=grid_w, 1, -1 do 
        watered[x+((y-1)*grid_w)] = 1;
       end
    end	
	  -- Local variables
  local xyCenter = getCenterPos();
  local xyBarleyMenu = {};
  xyBarleyMenu[0] = xyCenter[0] - 43;
  xyBarleyMenu[1] = xyCenter[1] + 0;
  local dxi=1;
  local dt_max=grid_w;
  local dt=grid_w;
  local dx={1, 0, -1, 0};
  local dy={0, -1, 0, 1};
  local num_at_this_length = 3;
  local x_pos = 0;
  local y_pos = 0;
    for y=1, grid_h do
      for x=1, grid_w do
        lsPrintln('doing ' .. x .. ',' .. y .. ' of ' .. grid_w .. ',' .. grid_h);
        statusScreen("Planting " .. x .. ", " .. y);
        
		-- Plant
        lsPrintln('planting ' .. xyPlantBarley[0] .. ',' .. xyPlantBarley[1]);
        setWaitSpot(xyBarleyMenu[0], xyBarleyMenu[1]);
        srClickMouseNoMove(xyPlantBarley[0], xyPlantBarley[1], 0);
        srSetMousePos(xyBarleyMenu[0], xyBarleyMenu[1]);
        waitForChange();
        
        -- Bring up menu
        lsPrintln('menu ' .. xyBarleyMenu[0] .. ',' .. xyBarleyMenu[1]);
        setWaitSpot(xyBarleyMenu[0]+5, xyBarleyMenu[1]);
        srClickMouse(xyBarleyMenu[0], xyBarleyMenu[1], 0);
        waitForChange();

        -- Check for window size
        window_w = 214;
        window_h = 218;

        -- Pin
        lsPrintln('pin ' .. (xyBarleyMenu[0]+5) .. ',' .. xyBarleyMenu[1]);
        srClickMouseNoMove(xyBarleyMenu[0]+5, xyBarleyMenu[1]+0, 1);

        -- Move window
        local pp = pinnedPos(x, y);
        lsPrintln('move ' .. (xyBarleyMenu[0]+5) .. ',' .. xyBarleyMenu[1] .. ' to ' .. pp[0] .. ',' .. pp[1]);
        drag(xyBarleyMenu[0] + 5, xyBarleyMenu[1], pp[0], pp[1], 0);
		
		-- Add 2 water now
		srReadScreen();
		local barleyAddButton = srFindImageInRange("BarleyAdd.png", pp[0], pp[1], 200, 100);
		local barleyWater = srFindImageInRange("barleyWater.png", pp[0], pp[1] - 50, 220, 150);
        srClickMouseNoMove(barleyAddButton[0]+8, barleyWater[1]);
		srClickMouseNoMove(barleyAddButton[0]+8, barleyWater[1]);
        watered[x+((y-1)*grid_w)] = watered[x+((y-1)*grid_w)] + 2;

        -- move to next position
        if not ((x == grid_w) and (y == grid_h)) then
          lsPrintln('walking dx=' .. dx[dxi] .. ' dy=' .. dy[dxi]);
          x_pos = x_pos + dx[dxi];
          y_pos = y_pos + dy[dxi];
          srClickMouseNoMove(xyCenter[0] + walk_px_x*dx[dxi], xyCenter[1] + walk_px_y*dy[dxi], 0);
          lsSleep(walk_time);
          dt = dt - 1;
          if dt == 1 then
            dxi = dxi + 1;
            num_at_this_length = num_at_this_length - 1;
            if num_at_this_length == 0 then
              dt_max = dt_max - 1;
              num_at_this_length = 2;
            end
            if dxi == 5 then
              dxi = 1;
            end
            dt = dt_max;
          else
            lsPrintln('skipping walking, on last leg');
          end
        end
        checkBreak();
      end
	end
  
    statusScreen("Refocusing windows...");
    -- Bring windows to front
    for y=grid_h, 1, -1 do
      for x=grid_w, 1, -1 do 
        local rp = refreshPosUp(x, y);
        srClickMouseNoMove(rp[0], rp[1], 0);
        lsSleep(refocus_click_time);
      end
    end
    lsSleep(refocus_time); -- Wait for last window to bring to the foreground before clicking again
  
      -- Barley has been planted, pinned and refocused	
 
      while 1 do
        for y=1, grid_h do
          for x=1, grid_w do 
            local pp = pinnedPos(x, y);
            local rp = refreshPosDown(x, y);
            srClickMouse(rp[0],rp[1]);
            lsSleep(200);
            srReadScreen();
            local leftBar = srFindImageInRange("barleyBarLeft.png", pp[0], pp[1] - 50, 120, 100);
            if leftBar then
              leftBar[0] = leftBar[0] + 4;
            end
            local rightBar = srFindImageInRange("barleyBarRight.png", pp[0], pp[1] - 50, 220, 200);
            if rightBar then
              rightBar[0] = rightBar[0] + 1;
		    end
            if not rightBar then
              error 'Could not find rightbar';
            end
            local barleyWater = srFindImageInRange("barleyWater.png", pp[0], pp[1] - 50, 220, 150);
            if not barleyWater then error 'Could not find water button'; end
            local barleyAddButton = srFindImageInRange("BarleyAdd.png", pp[0], pp[1], 200, 100);
            if not barleyAddButton then error 'Could not find add button'; end
            while 1 do
              if leftBar then
                waterBlue = 0;
                if rightBar then
                  if barleyWater then
                    srReadScreen();
                    for i=leftBar[0],rightBar[0] do
                      pxval = srReadPixelFromBuffer(i, barleyWater[1]);
                      b = (math.floor(pxval/256) % 256);
                      if b > 220 then
                        waterBlue = waterBlue + 1;
                      end
                    end
                  waterBlue = (waterBlue/(rightBar[0]-leftBar[0])*100);
                  end
                end
              end
            checkBreak();
			
            if watered[x+((y-1)*grid_w)] < 5 then
			  statusScreen("Watering " .. x .. "," .. y .. "step " .. watered[x+((y-1)*grid_w)] .. ".");
              if waterBlue < 90 then
			    if watered[x+((y-1)*grid_w)] == 0 then
				end
                srClickMouseNoMove(barleyAddButton[0]+8, barleyWater[1]);
                watered[x+((y-1)*grid_w)] = watered[x+((y-1)*grid_w)] + 1;
                lsSleep(100);
                break;
              end
            else
			  statusScreen("Harvesting " .. x .. "," .. y .. ".");
              if waterBlue < 90 then
			    srClickMouseNoMove(pp[0]+90, pp[1]+90);
                lsSleep(100);
                srClickMouseNoMove(pp[0]+180, pp[1]-25);
				if watered[x+((y-1)*grid_w)] == 5 then
					harvested = 1;
				end
                break;
              end
            end
          end
        end
	    
      end
	  if harvested == 0 then
        statusScreen("Refocusing windows...");
        -- Bring windows to front
        for y=grid_h, 1, -1 do
          for x=grid_w, 1, -1 do 
            local rp = refreshPosUp(x, y);
            srClickMouseNoMove(rp[0], rp[1], 0);
            lsSleep(refocus_click_time);
          end
        end
		lsSleep(refocus_time); -- Wait for last window to bring to the foreground before clicking again
	  else
	  	for x=1, x_pos do
		  srClickMouseNoMove(xyCenter[0] + walk_px_x*-1, xyCenter[1], 0);
	      lsSleep(walk_time);
		end
		for x=1, -y_pos do
		  srClickMouseNoMove(xyCenter[0], xyCenter[1] + walk_px_y, 0);
		  lsSleep(walk_time);
		end
	    break;
	  end
	end
	local end_time = lsGetTimer();
	statusScreen("Time taken: " .. (end_time-start_time)/1000);
		
  end
 end