import * as React from "react";
import * as R from "ramda";

import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";

enum ReactHooks {
  useEffect = "useEffect",
  useLayoutEffect = "useLayoutEffect",
}

function callHook(hook, pathname) {
  return function (effect, deps = []) {
    React?.[hook]?.(effect, [pathname, ...deps]);
  };
}

function getHooksWrappers(pathname) {
  return R.compose(
    R.reduce(
      (hooksWrappers, hook) =>
        R.assoc(hook, callHook(hook, pathname), hooksWrappers),
      {}
    ),
    R.values
  )(ReactHooks);
}

function hasScreenHook(plugin) {
  return (
    plugin?.module?.useScreenHook &&
    typeof plugin.module.useScreenHook === "function"
  );
}

function invokeScreenHook(hooksWrappers) {
  return function (plugin) {
    return plugin?.module?.useScreenHook(hooksWrappers);
  };
}

export function usePluginScreenHooks(pathname: string) {
  const { plugins } = usePickFromState(["plugins"]);

  const hooks = React.useMemo(
    () => R.filter(hasScreenHook, plugins) || [],
    [plugins]
  );

  const hooksWrappers = React.useMemo(
    () => getHooksWrappers(pathname),
    [pathname]
  );

  hooks.forEach(invokeScreenHook(hooksWrappers));
}
