import {Container} from 'inversify';
import {getBaseContainer} from './baseIoc';
import type {HomePagePropsType} from '../types/types';

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

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

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

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;
}
