module Project
  class DigitalProductOverviewPage < BasePage
    include ProductSidebar
    include DigitalProductBuilderPromoPlayer

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

    # overview buttons
    button(:advertising_campaign, class: "AdvertisingCampaignButton")

    # basics section
    link(:edit_basics, id: "editBasicsButton")
    p(:upc) { div_element(id: "itemUpc").p_element }
    p(:metadata_language) { div_element(id: "itemMetaLanguage").p_element }
    p(:product_name) { div_element(id: "itemProductName").p_element }
    p(:product_code) { div_element(id: "itemProductCode").p_element }
    p(:product_version) { div_element(id: "itemProductVersion").p_element }
    p(:version_notes) { div_element(id: "itemProductVersionNotes").p_element }
    p(:primary_artists) { div_element(id: "itemPrimaryArtist").p_element }
    p(:featured_artists) { div_element(id: "itemFeaturing").p_element }
    p(:remixers) { div_element(id: "itemRemixer").p_element }
    p(:composers) { div_element(id: "itemComposerS").p_element }
    p(:orchestras) { div_element(id: "itemOrchestraS").p_element }
    p(:ensembles) { div_element(id: "itemEnsembleS").p_element }
    p(:conductors) { div_element(id: "itemConductorS").p_element }
    p(:genre) { div_element(id: "itemGenre").p_element }
    p(:subgenre) { div_element(id: "itemSubgenre").p_element }
    p(:format) { div_element(id: "itemFormat").p_element }
    p(:imprint) { div_element(id: "itemImprint").p_element }
    p(:c_line) { div_element(id: "itemCLine").p_element }
    p(:special_instructions) { div_element(id: "itemSpecialInstructions").p_element }
    h3(:basics_header, class: "DigitalProductOverviewSectionHeader-title", text: "Basics")

    # artwork section
    link(:edit_artwork, id: "editArtworkButton")
    img(:artwork, class: "DigitalProductOverviewArtwork-image")

    # tracks section
    link(:edit_tracks, id: "editTracksButton")

    # pricing section
    link(:edit_pricing, id: "editSchedulingPricingButton")
    p(:release_date) { div_element(id: "itemReleaseDate").p_element }
    p(:sales_date) { div_element(id: "itemSalesDate").p_element }
    p(:preorder_date) { div_element(id: "itemPreorderDate").p_element }
    p(:album_pricing) { div_element(id: "itemAlbumPricing").p_element }
    p(:track_pricing) { div_element(id: "itemTrackPricing").p_element }
    p(:previewable) { div_element(id: "itemPreviewable").p_element }
    p(:individual_track, class: "DigitalProductOverviewPricing-interval")
    p(:individual_track_pricing, class: "DigitalProductOverviewPricing-interval", index: -1)

    # territories section
    link(:edit_territories, id: "editTerritoryRestrictionsButton")
    div(:territory_restriction_section, id: "itemNotClearedForSale")
    p(:restricted_territories) { territory_restriction_section_element.p_element }

    # publishing section
    link(:edit_publishing, id: "editPublishingObligationButton")
    spans(:publishing_obligation, class: "DigitalProductOverviewTracks-us-pub-obligation-label")

    # rubocop:disable Metrics/MethodLength
    def release_basics_values(only_for:)
      values = {
        product_name: product_name,
        format: format,
        product_code: product_code,
        product_version: product_version,
        version_notes: version_notes,
        meta_language: metadata_language,
        genre: genre,
        subgenre: subgenre,
        imprint: imprint,
        c_line: c_line,
        special_instructions: special_instructions
      }.merge(artist_values)
      values.merge!(classical_values) if composers?
      values.select! { |k, _v| only_for.include? k }
      values
    end

    def pricing_values
      # If we get date, preorder_type will be set as Specific Date. Otherwise preorder_date = type
      preorder = preorder_date.start_with?("20") ? "Specific Date" : preorder_date
      {
        release_date: release_date,
        sales_date: sales_date,
        preorder: preorder,
        preorder_date: preorder_date,
        album_pricing: album_pricing,
        track_pricing: track_pricing,
        previewable: previewable
      }
    end

    def artwork_url
      artwork_element.element.src
    end

    def edit_artwork_with_retry
      @browser.alert.ok if @browser.alert.exists?
      click_edit_with_retry edit_artwork
    end

    def edit_tracks_with_retry
      wait_until { edit_tracks? }
      edit_tracks_element.scroll.to
      click_edit_with_retry edit_tracks
    end

    private

    def artist_values
      {
        primary_artists: primary_artists.split(", "),
        featuring_artists: featured_artists.split(", "),
        remixer_artists: remixers.split(", ")
      }
    end

    def classical_values
      {
        composers: composers.split(", "),
        orchestras: orchestras.split(", "),
        ensembles: ensembles.split(", "),
        conductors: conductors.split(", ")
      }
    end
  end
end
