# frozen_string_literal: true

describe Individual do
  it do
    is_expected.to have_db_column(:gender)
    is_expected.to have_db_column(:nom)
    is_expected.to have_db_column(:prenom)
    is_expected.to belong_to(:dossier).required
  end

  describe "#save" do
    let(:individual) { build(:individual) }

    subject do
      individual.save
      individual
    end

    context "with birthdate" do
      before do
        individual.birthdate = birthdate_from_user
      end

      context "and the format is dd/mm/yyy " do
        let(:birthdate_from_user) { "12/11/1980" }

        it { expect(subject.birthdate).to eq(Date.new(1980, 11, 12)) }
      end

      context "and the format is ISO" do
        let(:birthdate_from_user) { "1980-11-12" }

        it { expect(subject.birthdate).to eq(Date.new(1980, 11, 12)) }
      end

      context "and the format is WTF" do
        let(:birthdate_from_user) { "1980 1 12" }

        it { expect(subject.birthdate).to be_nil }
      end
    end

    it "schedule index search terms" do
      subject.dossier.debounce_index_search_terms_flag.remove
      assert_enqueued_jobs(1, only: DossierIndexSearchTermsJob) do
        individual.update(nom: "new name")
      end
    end
  end

  describe 'validate_mandant_email' do
    let(:user) { create(:user, email: 'mandataire@example.com') }
    let(:dossier) { create(:dossier, :for_tiers_with_notification, user: user) }
    let(:individual) { dossier.individual }

    context 'when validating email' do
      it 'is valid when email is different from the mandataire' do
        individual.email = 'different@example.com'
        expect(individual).to be_valid
      end

      it 'is invalid when email is the same as the mandataire' do
        individual.email = 'mandataire@example.com'
        expect(individual).not_to be_valid
        expect(individual.errors[:email]).to include(
          I18n.t('activerecord.errors.models.individual.attributes.email.must_be_different_from_mandataire')
        )
      end

      it 'is valid when email is not required (notification_method is not email)' do
        dossier_without_notification = create(:dossier, :for_tiers_without_notification, user: user)
        individual_without_notification = dossier_without_notification.individual

        expect(individual_without_notification).to be_valid
        expect(individual_without_notification.email).to be_nil
        expect(individual_without_notification.notification_method).to eq('no_notification')
      end
    end
  end
end
