require_relative '../data_helpers/category_helper'

module YouTube
  class DownloadReportsPage < BasePage
    def fetch(opts = {})
      opts[:category] ||= 'rev_video'
      opts[:frequency] ||= 'weekly'
      opts[:index] ||= 0
      select_category(opts)
      select_report(opts)
    end

    def select_category(opts = {})
      # Select category from nav bar
      category_helper = CategoryHelper
      category_data = category_helper.category_data(opts)
      category_tab = browser.element(xpath: "//tp-yt-paper-tab[@id='#{category_data[:tab_name]}-tab']")
      wait_until { category_tab.present? }
      category_tab.click
    end

    def change_to_weekly_view(table)
      # Hard wait needed to ensure dropdown works
      sleep(2)
      payment_period_element = table.span_element(id: 'payment-period-cell')
      monthly_payment_period = payment_period_element.text
      table.span_element(text: 'Monthly').click
      browser.element(text: 'Weekly').click
      wait_until { table.span_element(text: 'Weekly') }
      wait_until { payment_period_element.text != monthly_payment_period }
    end

    def get_location_version_button(category_data, table)
      row = table.span(text: category_data[:location]).parent.parent
      row.span(text: category_data[:version])
    end

    def select_report(opts = {})
      category_helper = CategoryHelper
      category_data =  category_helper.category_data(opts)
      # find table on page
      table_header = browser.div(text: category_data[:header], class: ['title', 'ytcms-reports-section'])
      wait_until { table_header.present? }
      table = table_header.parent.parent
      if category_data[:location]
        version_button = get_location_version_button(category_data, table)
      else
        version_button = table.span(text: category_data[:version], index: opts[:index])
      end
        wait_until { version_button.present? }
        change_to_weekly_view(table) if opts[:frequency] == 'weekly'
        version_button.click
        # Find desired report from dropdown and get link
        if opts[:category] == 'shorts' || opts[:category] =='other'
          report_link = browser.element(xpath: "//yt-formatted-string[contains(text(),'#{category_data[:report_name]}')]")
        else
          report_link = browser.element(xpath: "//yt-formatted-string[text()='#{category_data[:report_name]}']")
        end
        url_element = report_link.parent.parent.parent.parent
        url_element.attribute_value('test-id')
    end
  end
end
