module Project
  module TrackPerformersModal
    include PageObject
    include PageHelpers::ReactHelpers

    # Contributor tabs
    link(:performers_tab, id: "TrackParticipantsModal-container-tabs-tab-performers")
    link(:studio_personnel_tab, id: "TrackParticipantsModal-container-tabs-tab-studioPersonnel")
    link(:label_personnel_tab, id: "TrackParticipantsModal-container-tabs-tab-labelPersonnel")
    link(:compositional_tab, id: "TrackParticipantsModal-container-tabs-tab-compositional")

    table(:performers_list, id: "TrackParticipantsModal-performers-table")
    div(:performer_type, class: "TrackParticipantRow-select")
    text_field(:birth_name, id: "product-name", index: -1)
    div(:main_role) do
      div_element(class: "TrackParticipantsModal-table-wrapper").div_element(
        class: "Select__control"
      ).div_element(class: "Select__indicators")
    end
    buttons(:delete_performer, class: "TrackParticipantRow-remove-button")
    button(:add_performer, class: "TrackParticipantsModal-add-button")

    span(:add_studio_personnel, text: "+ Add Studio Personnel")
    table(:studio_personnel_list, id: "TrackParticipantsModal-studioPersonnel-table")
    span(:create_new_contributor, text: /Create new contributor/)

    span(:add_label_personnel, text: "+ Add Label Personnel")
    table(:label_personnel_list, id: "TrackParticipantsModal-labelPersonnel-table")

    span(:add_compositional_contributor, text: "+ Add Compositional Contributors")
    table(:compositional_contributor_list, id: "TrackParticipantsModal-compositional-table")

    button(:done, class: "TrackParticipantsModal-save-button")
    button(:close_button, class: "TrackParticipantsModal-close-button")

    def delete_all_contributors_on_tab(tab, tab_list_element)
      tab.click
      until tab_list_element.button_element(class: "TrackParticipantRow-remove-button").exist? == false
        tab_list_element.button_element(class: "TrackParticipantRow-remove-button").click
      end
    end

    def add_single_track_performer(type, role)
      add_performer unless performer_type == "Primary Performer" && type == "Primary"
      row_index = (performers_list_element.rows - 1)
      select_performer_type("#{type} Performer", row_index) if row_index > 1
      performers_list_element[row_index][2].text_field_element.value = "#{type} #{Time.stamp}"
      performers_list_element[row_index][3].click
      div_element(class: "Select__option", text: role).when_present.click
    end

    def select_performer_type(type, row_index)
      performers_list_element[row_index][1].click
      div_element(class: "Select__option", text: type).when_present.click
    end

    def add_personnel(details, tab_element, add_element, list_element)
      tab_element.click
      add_element.when_present.click
      list_element[1].click
      @browser.send_keys details[:name]
      create_new_contributor_element.when_present.click
      list_element[1][2].click
      div_element(class: "Select__option", text: details[:role]).when_present.click
    end

    def add_studio_personnel(role)
      studio_personnel = { name: Time.stamp, role: role }
      add_personnel(
        studio_personnel, studio_personnel_tab_element, add_studio_personnel_element,
        studio_personnel_list_element
      )
      studio_personnel
    end

    def add_label_personnel(role)
      label_personnel = { name: Time.stamp, role: role }
      add_personnel(
        label_personnel, label_personnel_tab_element, add_label_personnel_element,
        label_personnel_list_element
      )
      label_personnel
    end

    def add_compositional_contributor(role)
      compositional_contributor = { name: Time.stamp, role: role }
      add_personnel(
        compositional_contributor, compositional_tab_element, add_compositional_contributor_element,
        compositional_contributor_list_element
      )
      compositional_contributor
    end
  end
end
