import React, { useEffect } from "react";
import { ComponentsMap } from "../River/ComponentsMap";
import { CellTapContext } from "@applicaster/zapp-react-native-ui-components/Contexts/CellTapContext";
import { useActions } from "@applicaster/zapp-react-native-utils/reactHooks/actions";
import { logger, whenMatchingType } from "./utils";
import { useLayoutVersion } from "@applicaster/zapp-react-native-utils/reactHooks/layout";
import { useScreenData } from "@applicaster/zapp-react-native-utils/reactHooks/screen/useScreenData";
import { useCurationAPI } from "./utils/useCurationAPI";
import { useRiverInitialState } from "@applicaster/quick-brick-core/App/ActionSetters";
import { allSettled } from "promise";
import { createLogger } from "@applicaster/zapp-react-native-utils/logger";
import { isNilOrEmpty } from "@applicaster/zapp-react-native-utils/reactUtils/helpers";
import { ScreenTrackedViewPositionsContext } from "@applicaster/zapp-react-native-ui-components/Contexts/ScreenTrackedViewPositionsContext";

const { log_info } = createLogger({
  category: "ScreenContainer",
  subsystem: "General",
});

export const GeneralContentScreen = ({
  feed,
  screenId,
  groupId,
  scrollViewExtraProps,
  components,
  cellTapAction,
  getStaticComponentFeed,
  extraAnchorPointYOffset,
  isScreenWrappedInContainer,
  componentsMapExtraProps = {},
  focused,
  extraOffset,
  parentFocus,
  containerHeight,
  preferredFocus = false,
}: GeneralContentScreenProps) => {
  const screenData = useScreenData(screenId);

  const uiComponents = useCurationAPI(screenData?.ui_components);

  const onCellTapAction = useActions(
    whenMatchingType(String, cellTapAction) ||
      screenData?.general?.on_cell_tap_action_id
  );

  const isLayoutV2 = useLayoutVersion({ isV2: true });

  const useRiverActionProviderReady = () => {
    const actionsInitialStateSetters = useRiverInitialState();

    const [riverActionProvidersReady, setRiverActionProvidersReady] =
      React.useState(actionsInitialStateSetters.length === 0);

    useEffect(() => {
      if (!riverActionProvidersReady) {
        if (actionsInitialStateSetters.length > 0) {
          log_info(
            "ScreenContainer: starting to check river action providers to initialize",
            { actionsInitialStateSetters }
          );

          allSettled(actionsInitialStateSetters).finally(() => {
            log_info(
              "ScreenContainer: action provider ready, completed. Starting to present screen"
            );

            setRiverActionProvidersReady(true);
          });
        } else {
          log_info(
            "ScreenContainer: no action provider to check, completed. Starting to present screen"
          );

          setRiverActionProvidersReady(true);
        }
      }
    }, [actionsInitialStateSetters, riverActionProvidersReady]);

    return React.useMemo(
      () => riverActionProvidersReady,
      [riverActionProvidersReady]
    );
  };

  React.useEffect(() => {
    if (isLayoutV2 && feed) {
      logger.warn({
        message:
          "Feed of feeds are not supported in layouts v2. Passed 'feed' parameter will be ignored",
        data: {
          layoutVersion: "v2",
          feed,
          screenId,
        },
      });
    }
  }, [feed]);

  const isReady = useRiverActionProviderReady();

  const contextValue = React.useMemo(
    () => whenMatchingType(Function, cellTapAction) || onCellTapAction,
    [typeof cellTapAction === "function" ? cellTapAction : onCellTapAction]
  );

  if (!isReady || isNilOrEmpty(components || uiComponents)) return null;

  return (
    <ScreenTrackedViewPositionsContext.Provider>
      <CellTapContext.Provider value={contextValue}>
        <ComponentsMap
          feed={feed}
          riverId={screenId}
          groupId={groupId || `general-content-screen-${screenId}`}
          riverComponents={components || uiComponents}
          scrollViewExtraProps={scrollViewExtraProps}
          getStaticComponentFeed={getStaticComponentFeed}
          extraAnchorPointYOffset={extraAnchorPointYOffset}
          isScreenWrappedInContainer={isScreenWrappedInContainer}
          parentFocus={parentFocus}
          focused={focused}
          extraOffset={extraOffset}
          containerHeight={containerHeight}
          preferredFocus={preferredFocus}
          {...componentsMapExtraProps}
        />
      </CellTapContext.Provider>
    </ScreenTrackedViewPositionsContext.Provider>
  );
};
