import initializeApollo from '@/apollo/client';
import * as Calculation from '@/Components/Calculation';
import { Error } from '@/Components/Common/Error';
import * as hooks from '@/process/hooks';
import { getPageTitle } from '@/utils/page';
import { makeGetUserType } from '@/utils/user';
import { dehydrate, QueryClient } from '@tanstack/react-query';
import Head from 'next/head';

function Content() {
  hooks.useSentryScope();
  hooks.useMainData();
  hooks.useGetUsers();
  hooks.useInsuranceData();
  hooks.useReactions();

  return (
    <Calculation.Layout>
      <Head>
        <title>{getPageTitle('Без ограничений')}</title>
      </Head>
      <Calculation.Form />
      <Calculation.Settings />
      <Calculation.Output />
    </Calculation.Layout>
  );
}

export default function Page(props) {
  if (props.statusCode !== 200) return <Error {...props} />;

  return <Content />;
}

/** @type {import('next').GetServerSideProps} */
export async function getServerSideProps({ req }) {
  const { cookie = '' } = req.headers;

  const queryClient = new QueryClient();
  const apolloClient = initializeApollo();
  const getUserType = makeGetUserType({ apolloClient, queryClient });

  try {
    const user = await getUserType({ cookie });

    if (!user.unlimited) {
      return {
        props: {
          initialQueryState: dehydrate(queryClient),
          statusCode: 403,
        },
      };
    }

    return {
      props: {
        calculation: {},
        initialApolloState: apolloClient.cache.extract(),
        initialQueryState: dehydrate(queryClient),
        mode: 'unlimited',
        statusCode: 200,
        user,
      },
    };
  } catch (error) {
    return {
      props: {
        error: JSON.stringify(error),
        initialQueryState: dehydrate(queryClient),
        statusCode: 500,
      },
    };
  }
}
