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";
import { useEventAlerts } from "./utils/useEventAlerts";
import {
  selectRiverById,
  useAppSelector,
} from "@applicaster/zapp-react-native-redux";
import { getScreenDataSource } from "./utils/getScreenDataSource";
import { ScreenResolverFeedProvider } from "../ScreenResolverFeedProvider/ScreenResolverFeedProvider";

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

/** Provides screen-feed from general-screen configuration (if defined) */
const useFeedData = (id) => {
  const river = useAppSelector((state) => selectRiverById(state, id));
  const feedData = getScreenDataSource(river);

  return feedData;
};

export const GeneralContentScreen = ({
  feed,
  screenId,
  groupId,
  scrollViewExtraProps,
  components,
  cellTapAction,
  getStaticComponentFeed,
  extraAnchorPointYOffset,
  isScreenWrappedInContainer,
  componentsMapExtraProps = {},
  focused,
  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) {
          allSettled(actionsInitialStateSetters).finally(() => {
            log_debug(
              "ScreenContainer: action provider ready, completed. Starting to present screen"
            );

            setRiverActionProvidersReady(true);
          });
        } else {
          log_debug(
            "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]
  );

  useEventAlerts(screenData);

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

  return (
    <ScreenResolverFeedProvider id={screenId} useFeedData={useFeedData}>
      <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}
            containerHeight={containerHeight}
            preferredFocus={preferredFocus}
            {...componentsMapExtraProps}
          />
        </CellTapContext.Provider>
      </ScreenTrackedViewPositionsContext.Provider>
    </ScreenResolverFeedProvider>
  );
};
