# frozen_string_literal: true

require 'system_helper'

RSpec.describe 'Multilingual' do
  include AuthenticationHelper
  include WebHelper
  include ShopWorkflow
  include UIComponentHelper
  include CookieHelper

  it 'has three locales available' do
    expect(Rails.application.config.i18n[:default_locale]).to eq 'en'
    expect(Rails.application.config.i18n[:locale]).to eq 'en'
    expect(Rails.application.config.i18n[:available_locales]).to eq ['en', 'es', 'pt']
  end

  it '18n-js fallsback to default language' do
    # in backend it doesn't until we change enforce_available_locales to `true`
    visit root_path
    set_i18n_locale('it')
    expect(get_i18n_translation('label_shops')).to eq 'Shops'
  end

  context 'can switch language by params' do
    it 'in root path' do
      visit root_path
      expect(get_i18n_locale).to eq 'en'
      expect(get_i18n_translation('label_shops')).to eq 'Shops'
      expect(cookies_name).not_to include('locale')
      expect(page).to have_content 'SHOPS'

      visit root_path(locale: 'es')
      expect(get_i18n_locale).to eq 'es'
      expect(get_i18n_translation('label_shops')).to eq 'Tiendas'
      expect_menu_and_cookie_in_es

      # it is not in the list of available of available_locales
      visit root_path(locale: 'it')
      expect(get_i18n_locale).to eq 'es'
      expect(get_i18n_translation('label_shops')).to eq 'Tiendas'
      expect_menu_and_cookie_in_es
    end

    context 'with a product in the cart' do
      let(:distributor) { create(:distributor_enterprise, with_payment_and_shipping: true) }
      let!(:order_cycle) {
        create(:simple_order_cycle, distributors: [distributor], variants: [product.variants.first])
      }
      let(:product) { create(:simple_product) }
      let(:order) { create(:order, order_cycle:, distributor:) }

      before do
        set_order order
        add_product_to_cart order, product, quantity: 1
      end

      it "in the cart page" do
        visit main_app.cart_path(locale: 'es')

        expect_menu_and_cookie_in_es
        expect(page).to have_content 'Precio'
      end

      it "visiting checkout as a guest user" do
        visit checkout_path(locale: 'es')

        expect_menu_and_cookie_in_es
        expect(page).to have_content 'Iniciar sesión'
      end
    end
  end

  context 'with user' do
    let(:user) { create(:user) }

    it 'updates user locale from cookie if it is empty' do
      visit root_path(locale: 'es')

      expect_menu_and_cookie_in_es
      expect(user.locale).to be_nil
      login_as user
      visit root_path

      expect_menu_and_cookie_in_es
    end

    it 'updates user locale and stays in cookie after logout' do
      login_as user

      visit root_path(locale: 'es')
      user.reload

      expect(user.locale).to eq 'es'

      logout

      expect_menu_and_cookie_in_es
      expect(page).to have_content '¿Estás interesada en entrar en Open Food Network?'
    end

    context "visiting checkout as logged user" do
      let!(:zone) { create(:zone_with_member) }
      let(:supplier) { create(:supplier_enterprise) }
      let(:distributor) { create(:distributor_enterprise, charges_sales_tax: true) }
      let(:product) {
        create(:taxed_product, supplier:, price: 10, zone:)
      }
      let(:variant) { product.variants.first }
      let!(:order_cycle) {
        create(:simple_order_cycle, suppliers: [supplier], distributors: [distributor],
                                    coordinator: create(:distributor_enterprise),
                                    variants: [variant])
      }

      let(:free_shipping) {
        create(:shipping_method, require_ship_address: false)
      }
      let!(:payment) {
        create(:payment_method, distributors: [distributor],
                                name: "Payment")
      }
      let(:order) {
        create(:order_ready_for_confirmation, distributor:)
      }
      before do
        set_order order
        login_as user
      end

      it "on the details step" do
        visit checkout_step_path(:details, locale: 'es')

        expect_menu_and_cookie_in_es
        expect(page).to have_content "Sus detalles"
      end

      it "on the payment step" do
        visit checkout_step_path(:payment, locale: 'es')

        expect_menu_and_cookie_in_es
        expect(page).to have_content "Puede revisar y confirmar su pedido"
      end

      it "on the summary step" do
        visit checkout_step_path(:summary, locale: 'es')

        expect_menu_and_cookie_in_es
        expect(page).to have_content "Detalles de entrega"
      end
    end
  end

  describe "using the language switcher UI" do
    context "when there is only one language available" do
      before do
        allow(ENV).to receive(:[]).and_call_original
        allow(ENV).to receive(:[]).with("LOCALE").and_return("en")
        allow(ENV).to receive(:[]).with("AVAILABLE_LOCALES").and_return("en")
      end

      it "hides the dropdown language menu" do
        visit root_path
        expect(page).not_to have_css 'ul.right li.language-switcher.has-dropdown'
      end
    end

    context "when there are multiple languages available" do
      before do
        allow(ENV).to receive(:[]).and_call_original
        allow(ENV).to receive(:[]).with("LOCALE").and_return("en")
        allow(ENV).to receive(:[]).with("AVAILABLE_LOCALES").and_return("en,es")
      end

      it "allows switching language via the main navigation" do
        visit root_path

        expect(page).to have_content 'SHOPS'

        find('.language-switcher').click
        within '.language-switcher .dropdown' do
          expect(page).not_to have_link 'English', href: '/locales/en'
          expect(page).to have_link 'Español', href: '/locales/es'

          find('li a[href="/locales/es"]').click
        end

        expect_menu_and_cookie_in_es
      end
    end
  end
end

def expect_menu_and_cookie_in_es
  expect(cookies_name['locale']).to have_attributes(value: "es")
  expect(page).to have_content 'TIENDAS'
end
