class MenuOptionContext < CmsContext
  def initialize
    super
    @partials = [{'name' => 'Nav Menu', 'devs_only' => 'false'}]
  end

  def create(options)
    field = PartialField.find_by(name: @field_values['name'], partial_id: @partial_id)
    expect(page).to have_css("#field-#{field.order}")
    within("#field-#{field.order}") do
      expect(page).to have_css(".options-list")
      within(".options-list") do
        if options.kind_of?(Array)
          @options = create_options(options)
        else
          @option, @field_id = create_option(options), field.id
        end
      end
    end
    click_and_wait('Save')
  end

  def create_single_option(option)
    field = PartialField.find_by(name: @field_values['name'], partial_id: @partial_id)
    expect(page).to have_css("#field-#{field.order}")
    within("#field-#{field.order}") do
      expect(page).to have_css(".options-list")
      within(".options-list") do
        @option, @field_id = create_option(option), field.id
      end
    end
  end

  def delete(option, field)
    field = PartialField.find_by(name: field, partial_id: @partial_id)
    @field_id, @option = field.id, option
    expect(page).to have_css("#field-#{field.order}")
    within("#field-#{field.order}") do
      within('.options-list') do
        expect(page).to have_css(".menu-option")
        within(find('.menu-option', text: option)) do
          find('img').click
        end
      end
    end
    click_and_wait('Save')
  end

  def expect_all(field_name)
    field_order = PartialField.find_by(name: field_name, partial_id: @partial_id).order
    expect(page).to have_css("#field-#{field_order}")
    within("#field-#{field_order}") do
      MenuOption.all.each do |option|
        expect(page).to have_css(".options-list")
        within(".options-list") {expect_content_on_page(option.value)}
      end
    end
  end

  def expect_options
    options_in_database = PartialField.find_by(name: @field_values['name'], partial_id: @partial_id).menu_options.map(&:value)
    @options.each do |option|
      expect(options_in_database.include?(option.first)).to be true
    end
  end

  def expect_to_no_exist
    expect(MenuOption.find_by(value:@option, optionable_id: @field_id)).to be_falsey
  end

  private

  def get_step_fields
    {
      'Drop Down' => {
        'mandatory' => 'no',
        'field_type' => 'drop down'
      },
    }
  end

  def create_options(options)
    options.each do |option|
      create_option(option.first)
    end
    options
  end

  def create_option(option)
    find('input').set(option)
    click_a_tag('Add option')
    option
  end
end
