import * as R from "ramda";
import { loadAppContextData } from "@applicaster/zapp-react-native-redux";

import { URL_KEYS } from "../consts";
import {
  fetchPluginConfiguration,
  getPromiseForKey,
  prepareRuntimeConfigurationUrls,
} from "../helpers";
import { isTablet } from "@applicaster/zapp-react-native-utils/reactHooks";
import { Dimensions } from "react-native";
import { cacheAssets } from "../../AssetCache";

const buildContextData = (remoteData) => {
  const { width, height } = Dimensions.get("window");
  const { tabletLayout = null, tabletCellStyles = null } = remoteData;

  const useTabletLayout =
    isTablet({ width, height }, width > height ? "landscape" : "portrait") &&
    tabletLayout &&
    tabletCellStyles;

  if (useTabletLayout) {
    remoteData.rivers = tabletLayout;
    remoteData.cellStyles = tabletCellStyles;
  }

  return remoteData;
};

export async function getLegacyRemoteContextData(
  dispatch,
  runtimeConfigurationUrls,
  plugins
) {
  const layoutManagerPlugin = R.find(
    R.pathSatisfies(R.is(Function), ["module", "selectLayout"])
  )(plugins);

  const { width, height } = Dimensions.get("window");

  const isTabletDevice = isTablet(
    { width, height },
    width > height ? "landscape" : "portrait"
  );

  const configurationUrls = await layoutManagerPlugin?.module?.selectLayout({
    runtimeConfigurationUrls,
    plugin: layoutManagerPlugin,
    isTablet: isTabletDevice,
  });

  const { preparedRuntimeConfigurationUrls, layoutData = [] } =
    await prepareRuntimeConfigurationUrls(
      configurationUrls || runtimeConfigurationUrls,
      isTabletDevice
    );

  const promises = R.compose(
    R.map(getPromiseForKey(preparedRuntimeConfigurationUrls)),
    R.reject(R.isNil),
    R.keys,
    R.pick(URL_KEYS)
  )(preparedRuntimeConfigurationUrls);

  const resolvedPromises = await Promise.all(promises);

  const remoteData = R.compose(
    buildContextData,
    R.mergeAll
  )([...layoutData, ...resolvedPromises]);

  const useTabletLayout =
    isTabletDevice &&
    Boolean(remoteData.tabletLayout) &&
    Boolean(remoteData.tabletCellStyles);

  const cachedRemoteData = await cacheAssets({
    layout: useTabletLayout ? remoteData.tabletLayout : remoteData.layout,
    pluginConfigurations: remoteData.pluginConfigurations,
    cellStyles: useTabletLayout
      ? remoteData.tabletCellStyles
      : remoteData.cellStyles,
  });

  const { pluginConfigurations } = cachedRemoteData;

  const updatedPlugins = R.map(
    fetchPluginConfiguration(pluginConfigurations),
    plugins
  );

  const appProperties = R.compose(
    R.mergeLeft({
      contentTypes: useTabletLayout
        ? remoteData?.tabletLayout?.content_types
        : remoteData.layout?.content_types,
      rivers: cachedRemoteData.layout,
      cellStyles: cachedRemoteData.cellStyles,
    }),
    R.omit(["layout", "tabletLayout", "tabletCellStyles"])
  )(remoteData);

  loadAppContextData(dispatch, {
    ...appProperties,
    plugins: updatedPlugins,
  });
}
