require "rails_helper"

feature "User managing misc releases" do
  let(:current_user) { create(:user) }
  let(:project) { create(:project, members: current_user, account: current_user.primary_account) }

  context 'when signed out' do
    scenario 'creating a release for an adult', js: true do
      project = create(:project, members: current_user, account: current_user.primary_account)
      contract_template = create(:misc_release_contract_template,
                                 question_1_text: "Question 1",
                                 project: project)

      visit new_account_project_contract_template_misc_release_path(project.account, project, contract_template)

      expect(page).to have_content("QUESTIONNAIRE")

      fill_in person_first_name_field, with: 'Jane'
      fill_in person_last_name_field, with: 'Doe'
      fill_in_person_address_fields
      fill_in person_phone_field, with: '555-555-5555'
      fill_in person_email_field, with: 'jane.doe@test.com'
      fill_in question_1_field, with: "Answer 1"
      drop_file Rails.root.join(file_fixture("person_photo.png")), type: :dropzone
      draw_signature file_fixture("signature.png"), "misc_release_signature_base64"

      expect do
        click_button submit_release_button
      end.to change(MiscRelease, :count).by(1)

      expect(page).to have_content(successful_submission_message)
    end

    scenario "creating a release for a minor - guardian fields are required when minor checkbox is checked", js: true do
      contract_template = create(:contract_template, project: project)

      visit new_account_project_contract_template_misc_release_path(project.account, project, contract_template)

      all('input[data-required-tag="guardian"]').each do |field|
        expect(field['required']).to eq 'false'
        expect(field).not_to be_visible
      end

      page.check person_is_minor_checkbox

      all('input[data-required-tag="guardian"]').each do |field|
        expect(field['required']).to eq 'true'
        expect(field).to be_visible
      end
    end

    scenario "creating a release, if contract template contains signature legal language, it is shown" do
      contract_template = create(:contract_template, project: project, signature_legal_text: dummy_signature_legal_text)
      visit new_account_project_contract_template_misc_release_path(project.account, project, contract_template)

      expect(page).to have_content dummy_signature_legal_text
    end
  end

  context "when signed in as account manager" do
    before do
      sign_in current_user
    end

    scenario "Download All is visible" do
      create(:misc_release_with_contract_template, :native, project: project)

      visit project_misc_releases_path(project)

      expect(page).to have_content download_all_button
    end

    scenario "Downloading PDF of native misc release is possible" do
      native_release = create(:misc_release_with_contract_template, :native, project: project)

      visit project_misc_releases_path(project)

      click_link *view_release_pdf_link_for(native_release)
      expect(content_type).to eq('application/pdf')
    end

    scenario "Review action in Manage menu is visible" do
      create(:misc_release_with_contract_template, :native, project: project)

      visit project_misc_releases_path(project)

      expect(page).to have_link(review_action, exact: true)
    end

    scenario "Reviewing release" do
      create(:misc_release_with_contract_template, :native, project: project)

      visit project_misc_releases_path(project)

      click_link review_action

      expect(page).to have_content review_page_heading
      expect(page).to have_content approve_button
    end

    scenario "Approved releases have checkmark and non-approved releases don't have checkmarks" do
      create(:misc_release_with_contract_template, :native, project: project)

      visit project_misc_releases_path(project)
      expect(page).to have_css('i.fa.fa-check-circle.fa-2x', count: 0)

      create(:misc_release_with_contract_template, :native, project: project, approved_by_user_email: "some@email.com", approved_at: DateTime.now)
      visit project_misc_releases_path(project)

      expect(page).to have_css('i.fa.fa-check-circle.fa-2x', count: 1)
    end

    scenario 'When viewing the contract PDF of approved release there is page for office use only' do
      misc_release = create(:misc_release_with_contract_template,
                               :native,
                               project: project,
                               person_first_name: 'Jane',
                               person_last_name: 'Doe',
                               approved_by_user_name: "Big Joe",
                               approved_by_user_email: "some@email.com",
                               approved_at: DateTime.now)

      sign_in(current_user)
      visit project_misc_releases_path(project)
      click_link *view_release_pdf_link_for(misc_release)

      expect(content_type).to eq('application/pdf')
      expect(content_disposition).to include('inline')
      expect(pdf_body).to have_content for_office_use_only.upcase
      expect(pdf_body).to have_content producer_label
      expect(pdf_body).to have_content production_label
      expect(pdf_body).to have_content issued_to_label
      expect(pdf_body).to have_content issued_by_label
      expect(pdf_body).to have_content date_issued
      expect(pdf_body).to have_content 'Big Joe'
    end

    scenario 'When viewing the contract PDF of not approved release there is no page for office use only' do
      misc_release = create(:misc_release_with_contract_template,
                               :native,
                               project: project,
                               person_first_name: 'Jane',
                               person_last_name: 'Doe')

      sign_in(current_user)
      visit project_misc_releases_path(project)
      click_link *view_release_pdf_link_for(misc_release)

      expect(content_type).to eq('application/pdf')
      expect(content_disposition).to include('inline')
      expect(pdf_body).not_to have_content for_office_use_only.upcase
      expect(pdf_body).not_to have_content producer_label
      expect(pdf_body).not_to have_content production_label
      expect(pdf_body).not_to have_content issued_to_label
      expect(pdf_body).not_to have_content issued_by_label
      expect(pdf_body).not_to have_content date_issued
      expect(pdf_body).not_to have_content 'Big Joe'
    end

    scenario 'viewing the contract PDF' do
      misc_release = create(:misc_release,
                            :native,
                            contract_template: build(:misc_release_contract_template, question_1_text: 'Q1'),
                            question_1_answer: 'A1',
                            project: project,
                            person_first_name: 'Jane',
                            person_last_name: 'Doe',
                            tag_list: 'Woman, Brunette',
                            notes: [
                              build(:note,
                                    content: 'Note 1',
                                    user: build(:user, email: 'jane.doe@test.com'),
                                    email: 'jane.doe@test.com',
                                    created_at: DateTime.new(2020, 2, 21, 12, 0, 0)),
                              build(:note,
                                  content: 'Note 2',
                                  user: build(:user, email: 'john.doe@test.com'),
                                  email: 'john.doe@test.com',
                                  created_at: DateTime.new(2020, 2, 20, 11, 0, 0))
                            ])

      sign_in(current_user)
      visit project_misc_releases_path(project)
      click_link *view_release_pdf_link_for(misc_release)

      expect(content_type).to eq('application/pdf')
      expect(content_disposition).to include('inline')
      expect(pdf_filename).to include('doe-jane')
      expect(pdf_body).to have_content('Jane Doe')
      expect(pdf_body).to have_content('NOTES')
      expect(pdf_body).to have_content('Note 1')
      expect(pdf_body).to have_content('jane.doe@test.com')
      expect(pdf_body).to have_content('2/21/20 12:00 PM')
      expect(pdf_body).to have_content('Note 2')
      expect(pdf_body).to have_content('john.doe@test.com')
      expect(pdf_body).to have_content('2/20/20 11:00 AM')
      expect(pdf_body).to have_content('TAGS')
      expect(pdf_body).to have_content('Woman')
      expect(pdf_body).to have_content('Brunette')
      expect(pdf_body).not_to have_content('Guardian Email')
      expect(pdf_body).to have_content('QUESTIONNAIRE')
      expect(pdf_body).to have_content('Q1')
      expect(pdf_body).to have_content('A1')
    end
  end

  context "when the user is manager(project manager)" do
    let(:current_user) { create(:user, :manager) }

    before do
      sign_in current_user
    end

    scenario "Download action in Manage menu is not visible" do
      create(:misc_release_with_contract_template, :native, project: project)

      visit project_misc_releases_path(project)

      expect(page).to have_link("Download", exact: true, count: 0)
    end

    scenario "Review action in Manage menu is not visible" do
      create(:misc_release_with_contract_template, :native, project: project)

      visit project_misc_releases_path(project)

      expect(page).not_to have_link(review_action, exact: true)
    end
  end

  private

  def download_all_button
    'Download All'
  end

  def view_release_pdf_link_for(release)
    ['Download', href: misc_release_contracts_path(release, format: 'pdf')]
  end

  def fill_in_person_address_fields
    fill_in person_address_street1_field, with: "123 Test Lane"
    fill_in person_address_city_field, with: "New York"
    fill_in person_address_state_field, with: "NY"
    fill_in person_address_zip_field, with: '1000'
  end

  def person_address_street1_field
    t('helpers.label.misc_release.person_address_street1')
  end

  def person_address_city_field
    t('helpers.label.misc_release.person_address_city')
  end

  def person_address_state_field
    t('helpers.label.misc_release.person_address_state')
  end

  def person_address_zip_field
    t('helpers.label.misc_release.person_address_zip')
  end

  def person_first_name_field
    t('helpers.label.misc_release.person_first_name')
  end

  def person_last_name_field
    t('helpers.label.misc_release.person_last_name')
  end

  def person_email_field
    t('helpers.label.misc_release.person_email')
  end

  def person_phone_field
    t('helpers.label.misc_release.person_phone')
  end

  def question_1_field
    'misc_release[question_1_answer]'
  end

  def submit_release_button
    t 'shared.submit_release_long'
  end

  def successful_submission_message
    "Your release was successfully submitted. Thank you."
  end

  def person_is_minor_checkbox
    'misc_release_minor'
  end

  def dummy_signature_legal_text
    'Some signature legal language'
  end

  def view_release_pdf_link_for(release)
    ['Download', href: misc_release_contracts_path(release, format: 'pdf')]
  end

  def review_action
    t 'misc_releases.misc_release.actions.review'
  end

  def review_page_heading
    t 'approvals.new.heading', release_type: "Misc Release"
  end

  def approve_button
    t 'approvals.new.actions.approve'
  end

  def for_office_use_only
    t 'contracts.for_office_use_only.heading'
  end

  def producer_label
    t 'contracts.for_office_use_only.description_labels.producer'
  end

  def production_label
    t 'contracts.for_office_use_only.description_labels.production'
  end

  def issued_to_label
    t 'contracts.for_office_use_only.description_labels.issued_to'
  end

  def issued_by_label
    t 'contracts.for_office_use_only.description_labels.issued_by'
  end

  def date_issued
    t 'contracts.for_office_use_only.description_labels.date_issued'
  end
end
