import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
import { ZappPipesEntryContext } from "@applicaster/zapp-react-native-ui-components/Contexts";
import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks/navigation";
import { useEffect } from "react";
import * as R from "ramda";

import { handlePresentNavigation } from "../../../helpers";
import {
  noResolvedEntryError,
  noTargetScreenError,
  resolveError,
  typeWarningMessage,
} from "./const";

import {
  getHomeScreenId,
  queryIsValid,
  resolveQueryData,
  wait,
  withInitialPlayerState,
} from "./utils";
import { log_warning } from "../../../logger";

async function handleQuery({
  query,
  url,
  rivers,
  contentTypes,
  onFinish,
  navigator,
  setEntryContext,
}) {
  if (!queryIsValid(query)) {
    log_warning(typeWarningMessage(url), { query, url });

    return onFinish((done) => done?.());
  }

  try {
    const { targetScreen, entry } = await resolveQueryData({
      query,
      rivers,
      contentTypes,
    });

    if (R.isNil(entry)) {
      throw Error(noResolvedEntryError(url));
    }

    if (R.isNil(targetScreen)) {
      throw Error(noTargetScreenError(url));
    }

    const entryWithInitialPlayerState = withInitialPlayerState(query, entry);

    if (navigator.currentRoute === "/") {
      navigator.goHome();
      await wait();
    }

    setEntryContext(entryWithInitialPlayerState);

    if ((query.type || query.feed_locator) && !query.screen_id) {
      return onFinish((done) => {
        handlePresentNavigation({
          data: entryWithInitialPlayerState,
          navigator,
          pushScreen: true,
        });

        done?.();
      });
    }

    onFinish((done) => {
      handlePresentNavigation({
        data: targetScreen,
        navigator,
        pushScreen: true,
      });

      done?.();
    });
  } catch (e) {
    log_warning(resolveError(url), {
      url,
      query,
      error: e.message,
      stack: e.stack,
    });

    onFinish((done) => {
      handlePresentNavigation({ data: null, navigator });
      done?.();
    });
  }
}

export function useOpenSchemeHandler({ query, url, onFinish }) {
  const { rivers, contentTypes } = usePickFromState(["rivers", "contentTypes"]);
  const navigator = useNavigation();
  const homeId = getHomeScreenId(rivers);
  const homeRoute = `/river/${homeId}`;

  const [_, setEntryContext] =
    ZappPipesEntryContext.useZappPipesContext(homeRoute);

  useEffect(() => {
    handleQuery({
      query,
      url,
      rivers,
      contentTypes,
      onFinish,
      navigator,
      setEntryContext,
    });
  }, []);
}
