# frozen_string_literal: true

class TrackingLinkContext < CmsContext

  include FactoryBot::Syntax::Methods

  def initialize
    super
  end

  def view_all_tracking_links
    params = @current_user ? "?as=#{@current_user.name}" : ""
    visit "/admin/tracking_links#{params}"
  end

  def view_last_tracking_link
    params = @current_user ? "?as=#{@current_user.name}" : ""
    visit "/admin/tracking_links/#{TrackingLink.last.slug}#{params}"
  end

  def create_tracking_link(destination:, status: "draft")
    view_all_tracking_links
    find("a", text: "Add Tracking Link").click
    wait_for_ajax
    find("input[data-field='destinationUrl']").set(destination)
    change_nice_select_option(status, find_by_data_field("status"))
    click_and_wait("Create")
  end

  def setup_tracking_link(destination:, status: "draft")
    if status.to_s == "draft"
      create(:tracking_link, destination_url: destination)
    else
      create(:tracking_link, status.to_sym, destination_url: destination)
    end
  end

  def fill_in_form(fields)
    select_fields = %w[status channel]
    fields.each do |field_info|
      element = find_by_data_field(field_info[0])
      if select_fields.include?(field_info[0])
        change_nice_select_option(field_info[1], element)
      else
        element.set(field_info[1])
      end
    end
    click_and_wait("Save")
  end

  def expect_all_tracking_links_visible
    expect(page.all("tr").count).to eq(TrackingLink.count + 2)
  end

  def expect_tracking_link_by_destination(destination)
    view_all_tracking_links
    tracking_link_destination = page.all("tr")[-1].text.split("\n")[-1]
    expect(tracking_link_destination).to eq destination
  end

  def expect_fields_to_match(destination, fields)
    view_all_tracking_links
    click_and_wait(destination)
    select_fields = %w[status channel]
    fields.each do |field_info|
      sleep(1)
      if select_fields.include?(field_info[0])
        expect(find_by_data_field(field_info[0]).sibling(".nice-select")).to have_text field_info[1]
      else
        expect(find_by_data_field(field_info[0]).value).to eq field_info[1]
      end
    end
  end

  def expect_number_of_existing_tracking_links(amount:, destination:)
    tracking_link = TrackingLink.find_by(destination_url: destination)
    expect(TrackingLink.where(slug: tracking_link.slug).count).to eq amount
  end

end
