import React from "react";
import RN from "react-native";
import { renderWithProviders } from "@applicaster/zapp-react-native-utils/testUtils";

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 defaultProps = {
  entry: {},
  style: {},
  transformText: "default",
};

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

  const { UNSAFE_getByType } = renderWithProviders(
    <CustomText {...props} />,
    storeConfig
  );

  return UNSAFE_getByType(RN.Text).props.children;
};

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

  const storeConfig = {
    remoteConfigurations: { localizations: { he: {} } },
    appData: {
      languageCode: "he",
      countryCode: "IL",
    },
  };

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

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

  it("Hebrew text contains not first english word", () => {
    const renderedText = getRenderedText(
      textWithNotFirstEnglishWord,
      storeConfig
    );

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

  it("Hebrew text doesn't contain english word", () => {
    const renderedText = getRenderedText(textWithoutEnglishWord, storeConfig);
    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 storeConfig = {
    remoteConfigurations: { localizations: { en: {} } },
    appData: {
      languageCode: "en",
      countryCode: "US",
    },
  };

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