# frozen_string_literal: true

describe ApplicationHelper do
  describe 'app_host_legacy?' do
    let(:request) { instance_double(ActionDispatch::Request, base_url: request_base_url) }
    let(:app_host_legacy) { 'legacy' }
    let(:app_host) { 'host' }

    before do
      stub_const("ApplicationHelper::APP_HOST_LEGACY", app_host_legacy)
      stub_const("ApplicationHelper::APP_HOST", app_host)
    end

    subject { app_host_legacy?(request) }

    context 'when request on ENV[APP_HOST_LEGACY]' do
      let(:request_base_url) { app_host_legacy }
      it { is_expected.to be_truthy }
    end

    context 'when request on ENV[APP_HOST]' do
      let(:request_base_url) { app_host }
      it { is_expected.to be_falsey }
    end
  end

  describe 'auto_switch_domain?' do
    subject { auto_switch_domain?(request, user_signed_in) }

    context 'when user_signed_in? is true' do
      let(:user_signed_in) { true }
      let(:request) { instance_double(ActionDispatch::Request, base_url: 'osf', params: {}) }
      it { is_expected.to be_falsey }
    end

    context 'when user_signed_in? is false' do
      let(:user_signed_in) { false }
      let(:params) { {} }
      let(:request) { instance_double(ActionDispatch::Request, base_url: request_base_url, params:) }
      let(:app_host_legacy) { 'legacy' }
      let(:app_host) { 'host' }

      before do
        stub_const("ApplicationHelper::APP_HOST_LEGACY", app_host_legacy)
        stub_const("ApplicationHelper::APP_HOST", app_host)
      end

      context 'request on ENV[APP_HOST_LEGACY] without feature or url' do
        let(:request_base_url) { app_host_legacy }
        it { is_expected.to be_falsey }
      end

      context 'request on ENV[APP_HOST_LEGACY] with switch_domain params' do
        let(:params) { { switch_domain: '1' } }
        let(:request_base_url) { app_host_legacy }
        it { is_expected.to be_truthy }
      end

      context 'request on ENV[APP_HOST_LEGACY] with switch_domain params' do
        before { Flipper.enable :switch_domain }
        after { Flipper.disable :switch_domain }
        let(:request_base_url) { app_host_legacy }
        it { is_expected.to be_truthy }
      end

      context 'request on ENV[APP_HOST]' do
        let(:request_base_url) { app_host }
        it { is_expected.to be_falsey }
      end
    end
  end

  describe "#flash_class" do
    it { expect(flash_class('notice')).to eq 'alert-success' }
    it { expect(flash_class('alert', sticky: true, fixed: true)).to eq 'alert-danger sticky alert-fixed' }
    it { expect(flash_class('error')).to eq 'alert-danger' }
    it { expect(flash_class('unknown-level')).to eq '' }
  end

  describe "#try_format_date" do
    subject { try_format_date(date) }

    describe 'try formatting a date' do
      let(:date) { Date.new(2019, 01, 24) }
      it { is_expected.to eq("24 janvier 2019") }
    end

    describe 'try formatting a blank string' do
      let(:date) { "" }
      it { is_expected.to eq("") }
    end

    describe 'try formatting a nil string' do
      let(:date) { nil }
      it { is_expected.to eq("") }
    end
  end

  describe "#try_format_datetime" do
    subject { try_format_datetime(datetime) }

    describe 'try formatting 31/01/2019 11:25' do
      let(:datetime) { Time.zone.local(2019, 01, 31, 11, 25, 00) }
      it { is_expected.to eq("31 janvier 2019 11:25") }
    end

    describe 'try formatting a blank string' do
      let(:datetime) { "" }
      it { is_expected.to eq("") }
    end

    describe 'try formatting a nil string' do
      let(:datetime) { nil }
      it { is_expected.to eq("") }
    end
  end
  describe '#acronymize' do
    it 'returns the acronym of a given string' do
      expect(helper.acronymize('Application Name')).to eq('AN')
      expect(helper.acronymize('Hello World')).to eq('HW')
      expect(helper.acronymize('Demarches Simplifiees')).to eq('DS')
    end

    it 'handles single word input' do
      expect(helper.acronymize('Word')).to eq('W')
    end

    it 'returns an empty string for empty input' do
      expect(helper.acronymize('')).to eq('')
    end

    it 'handles strings with extensions' do
      expect(helper.acronymize('file_name.txt')).to eq('FN')
      expect(helper.acronymize('example.pdf')).to eq('E')
    end

    it 'handles strings with various word separators' do
      expect(helper.acronymize('multi-word_string')).to eq('MWS')
      expect(helper.acronymize('another_example-test')).to eq('AET')
    end
  end
end