import {Container} from 'inversify';
import {getBaseContainer} from './baseIoc';
import type {HomePagePropsType} from '../types/types';
import { ServiceTypes } from '@brainly-gene/core';

<% if (apollo && !reactQuery) { %>
  import { type Factory, factory } from '@brainly-gene/core';
  import { ApolloClientType } from '@brainly-gene/apollo';

<% } %>

<% if (reactQuery && !apollo) { %>
  import { type Factory, factory } from '@brainly-gene/core';
  import type { ReactQueryClientType } from '@brainly-gene/core';
<% } %>

<% if (apollo && reactQuery) { %>
  import { type Factory, factory } from '@brainly-gene/core';
  import type { ReactQueryClientType } from '@brainly-gene/core';
  import type { ApolloClientType } from '@brainly-gene/apollo';
<% } %>

export function getHomePageContainer(props?: HomePagePropsType) {
  const baseContainer = getBaseContainer();
<% if (apollo && !reactQuery) { %>
  const apolloClient = baseContainer.get<ApolloClientType>('apolloClient');
  apolloClient.hydrate(props?.dehydratedApolloClient);

  const clients = {
    [ServiceTypes.apollo]: () => {
      return apolloClient.getClient();
    },
  };
<% } %>

<% if (reactQuery && !apollo) { %>
    const queryClient = baseContainer.get<ReactQueryClientType>('reactQueryClient');
    queryClient.hydrate(props?.dehydratedQueryClient);

    const clients = {
      [ServiceTypes.reactQuery]: () => {
        return queryClient.getClient();
      },
    };
<% } %>

<% if (apollo && reactQuery) { %>
  const queryClient = baseContainer.get<ReactQueryClientType>('reactQueryClient');
  queryClient.hydrate(props?.dehydratedQueryClient);
  const apolloClient = baseContainer.get<ApolloClientType>('apolloClient');
  apolloClient.hydrate(props?.dehydratedApolloClient);

  const clients = {
    [ServiceTypes.reactQuery]: () => {
      return queryClient.getClient();
    },
    [ServiceTypes.apollo]: () => {
      return apolloClient.getClient();
    },
  };
<% } %>

  const container = new Container();
  container.parent = baseContainer;

<% if (apollo || reactQuery) { %>
  container.bind<Factory>('serviceFactory').toFunction(factory(clients));
<% } %>

  return container;
}
