class SubscriptionPreferenceContext < PublicContext
  def initialize
    super
    create_subscription_preferences_page
  end

  def create_subscription_preferences_page
    unless Page.find_by(name: 'Subscription Preferences')
      page = Page.create!(
      name: 'Subscription Preferences',
      url: '/subscription-preferences',
      active: true,
      title_text: 'Change your subscription status',
      description: 'Subscription meta description',
      canonical_url: 'https://teachable.com/subscription-preferences',
      creator_id: 1,
      )
      partial = Partial.create!(name: 'Subscription Preferences')
      PagePartial.create!(partial_id: partial.id, page_id: page.id, order: 0)
    end
  end

  def unsubscribe(preferences)
    @unsubscribed_titles = preferences
    preferences.each do |title|
      title_path = find('h3', text: title).path
      if preferences == ['Please unsubscribe me from all marketing emails']
        selector = 'div.btn.checkbox'
      else
        selector = '.checked'
      end
      within_ancestor(title_path) {find(selector).click}
    end
  end

  def unsubscribe_from_all_messages
    all('.iterable-messages h3').each do |title_node|
      within_ancestor(title_node.path) {find('.checked').click}
    end
  end

  def resubscribe(titles)
    @resubscribe_titles = titles
    titles.each do |title|
      title_path = find('h3', text: title).path
      within_ancestor(title_path) {find('div.btn.checkbox').click}
    end
  end

  def expect_all_preferences
    wait_until(8) {all('li').length > 0}
    current_titles = all('#subscription-preferences-content h3:not(.unsubscribe-all-messages-header)').map do |title|
      title.text
    end
    expected_titles = [
                        'Company News & Announcements',
                        'Deals & Promotions',
                        'Podcast',
                        'Product Updates & Tips',
                        'Workshops & Events'
                      ]
    expect(current_titles.sort).to eq(expected_titles)
  end

  def expect_correct_unsubscribed_images(unsubscribed_titles = @unsubscribed_titles)
    all('h3.message-header').each do |title_node|
      subscribed = !unsubscribed_titles.include?(title_node.text)
      expect_correct_image(title_node, subscribed)
    end
  end

  def expect_correct_resubscribed_images
    @resubscribe_titles << 'Please unsubscribe me from all marketing emails'
    all('h3.message-header').each do |title_node|
      subscribed = @resubscribe_titles.include?(title_node.text)
      expect_correct_image(title_node, subscribed)
    end
  end

  def expect_resubscribed
    @resubscribe_titles.each do |title|
      expect_correct_image(find('h3', text: title), true)
    end
  end

  def expect_correct_image_for_all_messages(preference)
    all('.iterable-messages h3').each do |title_node|
      expect_correct_image(title_node, preference)
    end
  end

  def expect_correct_image(title_node, subscribed)
    within_ancestor(title_node.path) do
      if subscribed
        expect(page).to have_css(".checked")
      else
        expect(page).to have_no_css(".checked")
      end
    end
  end

  private

  def within_ancestor(path)
    within(:xpath, get_ancestor_path(path, -2)) do
      yield
    end
  end
end
