import React from "react";
import RN from "react-native";
import { Provider } from "react-redux";
import TestRenderer from "react-test-renderer";
import configureStoreFn from "redux-mock-store";

const mockUseIsRTL = jest.fn(() => true);
const mockGetIsRTL = jest.fn(() => true);
const mockUseLocalizedStrings = jest.fn(() => ({}));
const mockGetUILanguage = jest.fn(() => "he-HE");

jest.mock("@applicaster/zapp-react-native-utils/localizationUtils", () => ({
  useIsRTL: mockUseIsRTL,
  getIsRTL: mockGetIsRTL,
  useLocalizedStrings: mockUseLocalizedStrings,
  getUILanguage: mockGetUILanguage,
}));

const CustomText = require("../Text").default;
const mockStore = configureStoreFn();

const defaultProps = {
  entry: {},
  style: {},
  transformText: "default",
};

const getRenderedText = (label: string, store: any) => {
  const props = { ...{ ...defaultProps, label } };

  const testRenderer = TestRenderer.create(
    <Provider store={store}>
      <CustomText {...props} />
    </Provider>
  );

  return testRenderer.root.findByType(RN.Text).props.children;
};

describe("RTL app: Hebrew text contains english word", () => {
  const textWithFirstEnglishWord = "Word השיר של נועה נועה קירל באירוויזיון";
  const textWithNotFirstEnglishWord = "השיר של נועה נועה קירל באירוויזיון Word";
  const textWithoutEnglishWord = "השיר של נועה נועה קירל באירוויזיון";

  const store = mockStore({
    remoteConfigurations: { localizations: { he: {} } },
    appData: {
      languageCode: "he",
      countryCode: "IL",
    },
  });

  it("Hebrew text contains first english word", () => {
    const renderedText = getRenderedText(textWithFirstEnglishWord, store);
    const desiredText = "\u200fWord\u202c השיר של נועה נועה קירל באירוויזיון";

    expect(renderedText).toEqual(desiredText);
  });

  it("Hebrew text contains not first english word", () => {
    const renderedText = getRenderedText(textWithNotFirstEnglishWord, store);
    expect(renderedText).toEqual(textWithNotFirstEnglishWord);
  });

  it("Hebrew text doesn't contain english word", () => {
    const renderedText = getRenderedText(textWithoutEnglishWord, store);
    expect(renderedText).toEqual(textWithoutEnglishWord);
  });
});

describe("LTR app: English text", () => {
  beforeAll(() => {
    mockUseIsRTL.mockReturnValue(false);
    mockGetIsRTL.mockReturnValue(false);
    mockGetUILanguage.mockReturnValue("en-US");
  });

  const englishText = "Test sentence";

  const store = mockStore({
    remoteConfigurations: { localizations: { en: {} } },
    appData: {
      languageCode: "en",
      countryCode: "US",
    },
  });

  it("English text", () => {
    const renderedText = getRenderedText(englishText, store);
    expect(renderedText).toEqual(englishText);
  });
});
