import * as React from 'react';
import Head from 'next/head';
import CssBaseline from '@mui/material/CssBaseline';
import Script from 'next/script';
import { CacheProvider, EmotionCache } from '@emotion/react';
import { ThemeProvider } from '@mui/material/styles';
import { DefaultSeo } from 'next-seo';
import { appWithTranslation } from 'next-i18next';

import { ConfirmationProvider, Snackbar, theme } from '@<%= npmScope %>/<%= designSystemProject %>';
import { setDayJsLocale } from '@<%= npmScope %>/util-react-common'
import FlagsProvider from '../src/services/firebase-remote-config.service';
import { GTM_ID } from '../src/services/analytics.service';
import createEmotionCache from '../src/utils/create-emotion-cache';
import i18nConfig from '../next-i18next.config';
import defaultConfigSeo from '../next-seo.config';
import { AuthProviderApp } from '../src/utils/auth-strapi';
import LayoutBase from '../src/design-system/components/layout/layout-base'

import '../src/styles/globals.css';

// Client-side cache, shared for the whole session of the user in the browser.
const clientSideEmotionCache = createEmotionCache();

interface MyAppProps extends AppPropsWithLayout {
  emotionCache?: EmotionCache;
}

const MyApp = (props: MyAppProps) => {
  const { Component, emotionCache = clientSideEmotionCache, pageProps, router } = props;

  const layoutType = Component.layoutType || 'LayoutBasic';

	React.useEffect(() => {
		setDayJsLocale(router.locale || router.defaultLocale as string)
	// eslint-disable-next-line react-hooks/exhaustive-deps
	}, [router.locale])

  const ComponentProvider = (
    <ConfirmationProvider>
      <Snackbar>
        <FlagsProvider>
          <AuthProviderApp>
            <LayoutBase layoutType={layoutType}>
              {/* Google Tag Manager - Global base code */}
              <Script
                id="gtag-base"
                strategy="afterInteractive"
                dangerouslySetInnerHTML={{
                  __html: `
                    (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
                    new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
                    j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
                    'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
                    })(window,document,'script','dataLayer', '${GTM_ID}');
                  `,
                }}
              />
              <DefaultSeo {...defaultConfigSeo} />
              <Component {...pageProps} />
            </LayoutBase>
          </AuthProviderApp>
        </FlagsProvider>
      </Snackbar>
    </ConfirmationProvider>
  );

  return (
    <CacheProvider value={emotionCache}>
      <Head>
        <meta name="viewport" content="initial-scale=1, width=device-width" />
      </Head>
      <ThemeProvider theme={theme}>
        {/* CssBaseline kickstart an elegant, consistent, and simple baseline to build upon. */}
        <CssBaseline />
        {ComponentProvider}
      </ThemeProvider>
    </CacheProvider>
  );
};

export default appWithTranslation(MyApp, i18nConfig);
