module Decidim::FrontEndPointerTestHelpers

def drag(selector, mode: "mouse", direction: nil, amount: 0)

def drag(selector, mode: "mouse", direction: nil, amount: 0)
  move =
    case direction
    when "left"
      "x -= #{amount}"
    when "right"
      "x += #{amount}"
    when "top"
      "y -= #{amount}"
    when "bottom"
      "y += #{amount}"
    end
  events =
    if mode == "touch"
      <<~JS
        var evStart = new Event("touchstart");
        evStart.touches = [{ pageX: rect.x, pageY: rect.y }];
        var evMove = new Event("touchmove");
        evMove.touches = [{ pageX: x, pageY: y }];
        element.dispatchEvent(evStart);
        document.dispatchEvent(evMove);
        document.dispatchEvent(new Event("touchend"));
      JS
    else
      <<~JS
        element.dispatchEvent(new MouseEvent("mousedown", { clientX: rect.x, clientY: rect.y }));
        document.dispatchEvent(new MouseEvent("mousemove", { clientX: x, clientY: y }));
        document.dispatchEvent(new MouseEvent("mouseup"));
      JS
    end
  page.execute_script(
    <<~JS
      var element = document.querySelector("#{selector}");
      var rect = element.getBoundingClientRect();
      var x = rect.x;
      var y = rect.y;
      #{move};
      #{events}
    JS
  )
end