import React from "react";
import { ComponentDataSourceContext, ZappPipesDataProps } from "./types";
import { StaticFeedResolver } from "./resolvers/StaticFeedResolver";
import { UrlFeedResolver } from "./resolvers/UrlFeedResolver";
import { NullFeedResolver } from "./resolvers/NullFeedResolver";

type ResolverSelectorProps = ComponentDataSourceContext & {
  children: (dataProps: ZappPipesDataProps) => React.ReactNode;
};

export function ResolverSelector(props: ResolverSelectorProps) {
  const { getStaticComponentFeed, component, feedUrl, children } = props;

  const renderDefaultResolver = (
    fallbackChildren: (dataProps: ZappPipesDataProps) => React.ReactNode
  ) => {
    if (feedUrl || component?.data?.source) {
      return <UrlFeedResolver {...props}>{fallbackChildren}</UrlFeedResolver>;
    }

    return <NullFeedResolver>{fallbackChildren}</NullFeedResolver>;
  };

  if (getStaticComponentFeed) {
    return (
      <StaticFeedResolver {...props}>
        {(zappPipesDataProps) => {
          const { data, loading, error } = zappPipesDataProps.zappPipesData;

          const shouldFallback = !loading && data === null && !error;

          if (shouldFallback) {
            return renderDefaultResolver(children);
          }

          return children(zappPipesDataProps);
        }}
      </StaticFeedResolver>
    );
  }

  return renderDefaultResolver(children);
}
