import getNavigationActionCreators from './routers/getNavigationActionCreators';
import getChildNavigation from './getChildNavigation';
import getChildrenNavigationCache from './getChildrenNavigationCache';

export default function getNavigation(
  router,
  state,
  dispatch,
  actionSubscribers,
  getScreenProps,
  getCurrentNavigation
) {
  const actions = router.getActionCreators(state, null);

  const navigation = {
    actions,
    router,
    state,
    dispatch,
    getScreenProps,
    getChildNavigation: (childKey) =>
      getChildNavigation(navigation, childKey, getCurrentNavigation),
    isFocused: (childKey) => {
      const { routes, index } = getCurrentNavigation().state;
      if (childKey == null || routes[index].key === childKey) {
        return true;
      }
      return false;
    },
    addListener: (eventName, handler) => {
      if (eventName !== 'action') {
        return { remove: () => {} };
      }
      actionSubscribers.add(handler);
      return {
        remove: () => {
          actionSubscribers.delete(handler);
        },
      };
    },
    dangerouslyGetParent: () => null,
    isFirstRouteInParent: () => true,
    _childrenNavigation: getChildrenNavigationCache(getCurrentNavigation()),
  };

  const actionCreators = {
    ...getNavigationActionCreators(navigation.state),
    ...actions,
  };

  Object.keys(actionCreators).forEach((actionName) => {
    navigation[actionName] = (...args) =>
      navigation.dispatch(actionCreators[actionName](...args));
  });

  return navigation;
}
