module Project
  module PhysicalReviewMetadata
    include PageObject

    # creates a paragraph element based on the ID of the parent div
    def self.review_field(name, options)
      paragraph(name) do
        div_element(options).p(class: "PhysicalProductReviewInfoItem-value")
      end
    end

    # release basics
    review_field(:product_name, id: "itemProductName")
    review_field(:product_code, id: "itemProductCode")
    review_field(:upc, id: "itemUpcEan")
    review_field(:artist, id: "itemArtist")
    review_field(:individual, id: "itemIndividual")
    review_field(:imprint, id: "itemImprint")
    review_field(:genre, id: "itemGenre")
    review_field(:subgenre, id: "itemSubgenre")
    review_field(:release_type, id: "itemReleaseType")
    review_field(:units_per_set, id: "itemUnitsPerSet")
    review_field(:format, id: "itemFormat")
    review_field(:version, id: "itemVersion")
    review_field(:explicit, id: "itemExplicit")

    # release details
    review_field(:configuration, id: "itemConfiguration")
    review_field(:product_type, id: "itemProductType")
    review_field(:sales_date, id: "itemSalesDate")
    review_field(:release_date, id: "itemReleaseDate")

    # configuration
    review_field(:value_add, id: "itemValueAdd")

    # rights
    review_field(:p_line, id: "itemPLine")
    review_field(:c_line, id: "itemCLine")
    review_field(:exclusive_for, id: "itemExclusiveFor")

    # packaging
    review_field(:packaging, id: "itemPackaging")
    review_field(:initial_stock, id: "itemInitialStock")
    review_field(:box_lot, id: "itemBoxLot")

    # pricing
    review_field(:orchard_pricing, id: "itemOrchardPricing")
    review_field(:discount_policy, id: "itemDiscountPolicy")

    # notes
    review_field(:country_of_origin, id: "itemCountryOfOrigin")

    def release_details_values(only_for:)
      wait_for_values_to_load
      values = release_details_basics_values
               .merge(release_details_details_values)
               .merge(release_details_rights_values)
               .merge(release_details_configuration_values)
               .merge(release_details_other_values)
               .merge(
                 product_type: release_type
               )
      values.select! { |k, _v| only_for.include? k }
      values
    end

    private

    def release_details_basics_values
      {
        product_name: product_name,
        product_code: product_code,
        upc: upc,
        primary_artist: artist,
        artist_is_individual: individual == "No" ? "N" : "Y",
        imprint: imprint,
        genre: genre,
        subgenre: subgenre,
        version: version,
        parental_advisory: explicit == "No" ? "N" : "Y"
      }
    end

    def release_details_details_values
      details = {
        sales_date: Date.parse(sales_date).to_s,
        release_date: Date.parse(release_date).to_s
      }
      details
    end

    def release_details_rights_values
      {
        pline: p_line,
        cline: c_line,
        exclusive_for: exclusive_for
      }
    end

    def release_details_configuration_values
      {
        configuration_product_type: product_type,
        format: format,
        units_per_set: units_per_set.to_i
      }
    end

    def release_details_other_values
      {
        packaging: packaging,
        initial_stock: initial_stock.to_i,
        box_lot: box_lot.to_i,
        orchard_pricing: orchard_pricing,
        discount_policy: discount_policy,
        country_of_origin: country_of_origin
      }
    end

    def wait_for_values_to_load
      wait_until { genre != "--" }
      wait_until { subgenre != "--" }
    end
  end
end
