module Royalties
  class PayeesPage < RoyaltiesPage
    page_url "/payees"

    button(:add_new_payee, text: "New Payee")
    table(:payees_table, class: %w[TableBasic table])
    rows(:payee_table_rows, class: "ClickableTable-row")
    div(:payee_filter, class: "PayeeList-filter")

    text_field(:payee_name) do
      div_element(id: "payeeSearch").text_field_element
    end

    text_field(:payment_currency) do
      div_element(id: "Payee-filter-currency").text_field_element
    end

    text_field(:payment_agreement) do
      div_element(id: "Payee-filter-agreement").text_field_element
    end

    text_field(:payee_status) do
      div_element(id: "Payee-filter-status").text_field_element
    end

    div(:payee_name_option, class: %w[Select-option is-focused])
    div(:payee_results_count, class: "PayeeList-result-count")

    def select_payee_agreement(type)
      payment_agreement_element.set type
      div_element(class: %w[Select__option Select__option--is-focused]).click
    end

    def select_payee_currency(currency)
      payment_currency_element.set currency
      div_element(class: %w[Select__option Select__option--is-focused]).click
    end

    div(:payee_balance, id: "Payee-filter-balance")

    def select_payee_balance(balance_option)
      payee_balance_element.click
      div_element(text: balance_option).click
    end

    def select_payee_status(payee_status)
      payee_status_element.set payee_status
      div_element(class: %w[Select__option Select__option--is-focused]).click
    end

    button(:clear_filters, text: "Clear Filters")

    def search_by_name(name)
      payee_name_element.send_keys name
      div_element(class: %w[Select__option Select__option--is-focused]).click
      wait_until { payees_table_element.text.include?(name) }
      expect(payees_table_element.rows).to eql 2
      clear_filters
    end

    def search_by_currency(currency)
      select_payee_currency(currency)
      wait_until(10) { payees_table_element.text.include?(currency) }
      payees_table_element.tbody.trs.each do |elem|
        expect(elem.text).to include currency
      end
      clear_filters
    end

    def search_by_agreement(agreement)
      select_payee_agreement(agreement)
      wait_until(10) { payees_table_element.text.include?(agreement) }
      payees_table_element.tbody.trs.each do |elem|
        expect(elem.text).to include agreement
      end
      clear_filters
    end

    def search_by_status(status)
      select_payee_status(status)
      wait_until(10) { payees_table_element.text.include?(status) }
      payees_table_element.tbody.trs.each do |elem|
        expect(elem.text).to include status
      end
      clear_filters
    end

    def search_by_balance(balance)
      select_payee_balance(balance)
      wait_until(10) { payees_table_element.trs.count > 1 }
      payees_table_element.tbody.trs.each do |elem|
        elem.text.split("$")[1].to_f > 0
      end
      clear_filters
    end

    def clear_filters
      clear_filters_element.click
      wait_until { div_elements(class: "Name-loader").count.zero? }
      wait_until { payees_table_element.rows > 1 }
    end
  end
end
