module Analytics
  module MarketableEvents
    include PageObject
    # Add Marketable Event modal
    button(:add_event, id: "add_event")
    button(:save_event, id: "save_event")
    text_field(:event_name, id: "event_name")
    text_field(:artist_name, id: "artist_id")
    text_field(:event_date, id: "event_date") # click :active_date_on_calendar after setting this
    select_list(:event_category, id: "event_category")
    div(:first_suggested_artist, class: "tt-suggestion")

    # Event on graph
    element(:event_container, :element, css: "g.graph-events")
    elements(:event_line, :element, css: "rect.graph-event-marker")

    # Only present after hovering on :event_line...
    element(:event_tooltip, :element, css: "g.graph-event")
    element(:event_title, :element, css: "text.event-title")
    element(:last_event_desc, :element, css: "text.event-description", index: -1)

    def wait_until_an_event_line_is_present
      wait_until { event_line_elements.count > 0 }
    end

    def line_corresponding_to_date(date)
      event_line_elements.reject! { |e| e.element.nil? || !e.element.present? } # to avoid stale ref errors
      event_line_elements.find { |e| e.element.attribute_value("data-event-date") == date }
    end

    def click_line_corresponding_to_date(date)
      # Need to use Selenium::WebDriver click:
      browser.driver.action.move_to(line_corresponding_to_date(date).element.wd).click.perform
    end

    # Delete event modal
    div(:delete_event_modal, id: "events")
    # BUG here: "grey out" mask is not persisting either when you move cursor
    button(:close_modal) { div_element(id: "event_list_modal").button_element(class: "close") }
    divs(:delete, class: "delete")
    images(:spinner, class: "spinner")

    def delete_all_events
      # Iterate through the list, in case there is more than 1 delete button:
      events = delete_elements.count
      until events.zero?
        delete_elements.first.element.click
        # this should prevent any infinite loops
        wait_until { delete_elements.count < events }
        events = delete_elements.count
      end
    end
  end
end
