import * as React from "react";
import { isFilledArray } from "@applicaster/zapp-react-native-utils/arrayUtils";
import { focusManager } from "@applicaster/zapp-react-native-utils/appUtils";

import { useSubscriberFor } from "@applicaster/zapp-react-native-utils/reactHooks/useSubscriberFor";
import { QBUIComponentEvents } from "@applicaster/zapp-react-native-ui-components/events";

import {
  useCurrentScreenIsHome,
  useCurrentScreenIsRoot,
  useCurrentScreenIsTabs,
} from "./hooks";
import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks";

export type BACK_TO_TOP_ACTION =
  | "PLATFORM_BACK"
  | "GO_HOME"
  | "GO_BACK"
  | "FOCUS_ON_SELECTED_TOP_MENU_ITEM"
  | "FORCE_GO_BACK"
  | "FOCUS_ON_SELECTED_TAB_ITEM";

export type BackToTopAction = () => BACK_TO_TOP_ACTION;

export function withBackToTopActionHOC(Component) {
  return function WrappedComponent(props) {
    const isHome = useCurrentScreenIsHome();
    const isRoot = useCurrentScreenIsRoot();
    const isTabsScreen = useCurrentScreenIsTabs();

    const navigator = useNavigation();

    const isStartUpHook = isFilledArray(navigator.startUpHooks);

    const isHook = navigator.currentRoute?.includes("hook");

    const emitFocusOnSelectedTab = useSubscriberFor(
      QBUIComponentEvents.focusOnSelectedTab
    );

    const emitFocusOnSelectedTopMenuItem = useSubscriberFor(
      QBUIComponentEvents.focusOnSelectedTopMenuItem
    );

    const backToTopAction = React.useCallback((): BACK_TO_TOP_ACTION => {
      if (isRoot && isStartUpHook) {
        return "PLATFORM_BACK";
      }

      if (isRoot && focusManager.isFocusOnMenu() && isHome) {
        return "PLATFORM_BACK";
      }

      if (isRoot && focusManager.isFocusOnMenu() && !isHome) {
        return "GO_HOME";
      }

      if (isRoot && isTabsScreen && focusManager.isTabsScreenContentFocused()) {
        return "FOCUS_ON_SELECTED_TAB_ITEM";
      }

      if (isRoot && focusManager.isFocusOnContent()) {
        return "FOCUS_ON_SELECTED_TOP_MENU_ITEM";
      }

      if (isHook) {
        return "FORCE_GO_BACK";
      }

      // default
      return "GO_BACK";
    }, [isHome, isRoot, isTabsScreen, isStartUpHook, isHook]);

    return (
      <Component
        {...props}
        backToTopAction={backToTopAction}
        emitFocusOnSelectedTab={emitFocusOnSelectedTab}
        emitFocusOnSelectedTopMenuItem={emitFocusOnSelectedTopMenuItem}
      />
    );
  };
}
