Given(/^a contact named "(.*?)" exists with email(?: |_)address "(.*?)"$/) do |contact, email|
  first_name, last_name = contact.split(/\s+/,2)
  FactoryGirl.create(:contact, email_address: email, first_name: first_name, 
    last_name: last_name
  )
end

Given(/^(\d+) contacts exist$/) do |count|
  count.to_i.times {FactoryGirl.create(:contact)}
end

Then(/^the contact "(.*?)" should be soft deleted$/) do |name|
  first_name, last_name = name.split(/\s+/,2)
  contact = MailManager::Contact.deleted.where(first_name: first_name, last_name: last_name).first 
  expect(contact.deleted?).to be true
  expect(contact.deleted_at).not_to be nil
end

When(/^I undelete contact "(.*?)"$/) do |name|
  first_name, last_name = name.split(/\s+/,2)
  contact = MailManager::Contact.deleted.where(first_name: first_name, last_name: last_name).first 
  contact.undelete
end

Then(/^contact "(.*?)" should exist with email(?: |_)address "(.*?)"$/) do |name, email|
  first_name, last_name = name.split(/\s+/,2)
  contact = MailManager::Contact.where(first_name: first_name, last_name: last_name).first 
  expect(contact.email_address).to eq(email)
end

Given(/^(?:the )?contact (?:named )?"(.*?)" is subscribed to "(.*?)"$/) do |contact_name, mailing_lists|
  first_name, last_name = contact_name.split(/\s+/,2)
  contact = MailManager::Contact.where(first_name: first_name, last_name: last_name).first 
  mailing_lists.split(/\s*,\s*/).each do |list_name|
    contact.subscribe(MailManager::MailingList.find_by_name(list_name))
  end
end

When(/^I submit a static subscribe form for "(.*?)" with email(?: |_)address "(.*?)" and the mailing list named "(.*?)"$/) do |name, email, list|
  mailing_list = MailManager::MailingList.where(name: name).first
  contact = MailManager::Contact.where(email_address: email).first || 
    MailManager::Contact.new
  contact_attributes = {
    mailing_list_id: mailing_list.id,
  }
  contact_attributes.merge(id: contact.id) unless contact.new_record?
  visit mail_manager.subscribe_contact_path(contact: contact_attributes)
end

Then(/^contact "(.*?)" should be subscribed to "(.*?)" with the "(.*?)" status$/) do |name, list, status|
  first_name, last_name = name.split(/\s+/,2)
  contact = MailManager::Contact.where(first_name: first_name, last_name: last_name).first 
  subscription = contact.subscriptions.detect{|s| s.mailing_list.name.eql?(list)}
  expect(subscription.status).to eq(status)
end

Then(/^contact "(.*?)" should be unsubscribed from "(.*?)"$/) do |name, list|
  first_name, last_name = name.split(/\s+/,2)
  contact = MailManager::Contact.where(first_name: first_name, last_name: last_name).first 
  subscription = contact.subscriptions.detect{|s| s.mailing_list.name.eql?(list)}
  expect(subscription.status).to eq('unsubscribed')
end