module Project
  class DigitalProductTracksPage < DigitalProductBasePage
    include DigitalProductTrackDetailsForm
    include DigitalProductTrackLocalization
    include ProductSidebar
    include DigitalProductTrackImportForm
    include TrackPerformersModal

    page_url "/project/<%=params[:project_id]%>/product/<%=params[:product_id]%>/tracks"

    div(:missing_information_alert, class: "DismissibleAlert-danger")
    div(:tracks_complete, class: "TracksCompleteInfo")

    file_field(:track_upload, id: "trackUploadDropzoneInput")
    table(:tracklist, class: "TracksTableNext")
    div(:all_tracks) { row_element(class: "TracksTableNext-head-row").div_element(class: "checkbox-new") }
    rows(:track, class: "TableRowDraggable-clickable")
    svg(:play_icon) { div_element(class: "TrackBuilder-tracks-table").svg_element(class: "Icons-play") }
    rows(:volume_divider, class: "TrackRowNext-volume")
    divs(:file_processing, class: "TrackRowNext-working-label")
    span(:upload_error, class: "TrackRowNext-asset-failed-label")

    div(:tracklist_alert, class: "DismissibleAlert-danger")
    spans(:tracklist_alert_triangle, class: "TrackRowNext-validation-error")

    # uploading progress bar
    div(:progress_bar, class: "progress-bar")

    # elements when no tracks present
    div(:track_upload_form, class: "TrackUpload")
    button(:upload_main) do
      track_upload_form_element.button_element(class: "TrackUpload-upload-button")
    end
    button(:import_main) { track_upload_form_element.button_element(text: "Import From Catalog") }
    file_field(:input_main, id: "initial-audio-upload")

    # checkboxes for a tracks
    # should be replaced to a main checkbox once it's working
    label(:track_checkbox, class: "checkbox-new-label")

    text_area(:lyrics, id: "track-lyrics")

    # tracklist action buttons
    button(:upload_tracks, id: "trackUploadButton")
    button(:add_volume_divider, id: "addVolumeDividerButton")
    button(:import_tracks, id: "tracksImportButton")
    button(:delete_tracks, id: "tracksDeleteButton")

    button(:delete_confirm, class: "LoadingButton")

    button(:digital_product_next, id: "digital-product-footer-next-button")

    button(:cancel_delete, id: "cancel-submit")
    button(:confirm_delete) do
      div_element(class: "DeleteConfirmationModal").button_element(class: "LoadingButton")
    end

    # blank tracks
    button(:upload_blank) do
      track_upload_form_element.button_element(class: "TrackUpload-blank-tracks-button")
    end
    button(:increment_blank_track, class: "BlankTrackModal-plus-button")
    button(:save_blank_track, class: "BlankTrackModal-save-button")
    button(:add_tracks, class: "HeaderDropdown dropdown-toggle btn btn-secondary")
    link(:blank_tracks_menu, id: "blankTracksMenuItem")

    def upload_file(element, abs_path)
      upload_workaround(element: element, path: abs_path)
    end

    def upload_file_when_ready(files)
      if upload_main_element.present?
        upload_file(input_main_element, files)
      elsif upload_tracks_element.present?
        upload_file(track_upload_element, files)
      end
    end

    def delete_all_tracks
      wait_until { file_field_elements.any? }
      return unless tracklist?
      all_tracks_element.click
      delete_tracks
      confirm_delete_element.when_present.click
      upload_main_element.when_present
    end

    def drag_last_track_to_first
      react_drag_and_drop(track_elements[-1], track_elements[0])
    end

    def drag_volume_divider_between_tracks
      react_drag_and_drop(volume_divider_elements[-1], track_elements[0])
    end

    def first_track_of_volume(volume)
      volume_divider_elements[volume - 1].row_element(xpath: "./following-sibling::*")
    end

    def initiate_delete_tracks
      track_checkbox_element.click
      delete_tracks
    end

    def open_performers_modal
      wait_until { add_performers? }
      return if performer_type?
      sleep 5 # wait for performers
      add_performers_element.scroll.to
      add_performers
      wait_until { performer_type? }
    end
  end
end
