import * as R from "ramda";
import { createSelector } from "@reduxjs/toolkit";

import { getPathAttributes } from "@applicaster/zapp-react-native-utils/navigationUtils";

const riverSelector = R.prop("rivers");
const pathnameSelector = R.prop("pathname");
const navigationStackSelector = R.prop("stack");

// @TODO extract to zapp-react-native-redux/selectors, remove ramda
export const homeRiverSelector = createSelector(
  riverSelector,
  R.compose(R.find(R.propEq("home", true)), R.values)
);

export const activeRiverSelector = createSelector(
  riverSelector,
  pathnameSelector,
  (rivers, pathname) => {
    const homePathname = R.compose(
      R.find(R.propEq("home", true)),
      R.values
    )(rivers);

    if (pathname === "/") {
      return homePathname;
    }

    const activePath = R.compose(
      R.defaultTo(null),
      R.prop(R.__, rivers),
      R.prop("screenId"),
      R.findLast(({ screenId }) => !!R.path([screenId, "navigations"], rivers)),
      getPathAttributes
    )({ pathname });

    return activePath || homePathname;
  }
);

export const firstStackEntriesSelector = createSelector(
  navigationStackSelector,
  R.compose(
    R.reject(R.compose(R.test(/\/hooks\//), R.prop("route"))),
    (stack) => [R.head(stack)],
    R.when(R.has("mainStack"), R.prop("mainStack"))
  )
);

export const previousStackEntriesSelector = createSelector(
  navigationStackSelector,
  R.compose(
    R.reject(R.compose(R.test(/\/hooks\//), R.prop("route"))),
    R.init,
    R.when(R.has("mainStack"), R.prop("mainStack"))
  )
);

export const lastEntrySelector = createSelector<
  unknown,
  unknown,
  NavigationScreenState
>(
  navigationStackSelector,
  R.compose(R.last, R.when(R.has("mainStack"), R.prop("mainStack")))
);
