/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import React from 'react';
import {NextPageContext} from 'next';
import {AppProps} from 'next/app';
import {ThemeProvider} from '../src/theme';
import {theme} from '../src/theme/theme';
import {GlobalStyle} from '../src/theme/global';
import {AppWrapper, AppContainer, Header, Footer, Children, Head as DefaultHead} from 'src/components';
import {LanguageProvider} from '../context/languageContext';
import {headerProps} from '../services/formatData/header';
import {footerProps} from 'services/formatData';
import {LanguageProps} from 'src/interfaces';
//import { useRouter } from 'next/router';
import { useEffect } from 'react';
import TagManager from 'react-gtm-module';
//import {setGlobalAnchorTarget} from '../utils/globalAnchorRetarget';

interface Props extends AppProps {
  ctx: NextPageContext;
}

const GlobalLayout = ({
  children,
  header,
  footer,
}: {
  children: React.ReactNode;
  header: LanguageProps;
  footer: LanguageProps;
}) => {
  
  return (
    <AppWrapper>
      <DefaultHead title="" />
      <GlobalStyle />
      <Header header={header} />
      <AppContainer hasHeader={true}>
        <Children>{children}</Children>
      </AppContainer>
      <Footer footer={footer} />
      
    </AppWrapper>
  );
};

function Application({Component, pageProps, header, footer}: any) {

  useEffect(() => {
    TagManager.initialize({ gtmId: process.env.GTM_KEY });

  }, []);

  return (<ThemeProvider theme={theme}>
    <LanguageProvider>
      <GlobalLayout {...header} {...footer}>
        <Component {...pageProps} />
      </GlobalLayout>
    </LanguageProvider>
  </ThemeProvider>);

};

Application.getInitialProps = async ({Component, ctx}: Props) => {
  const header = await headerProps();
  const footer = await footerProps();

  return {
    pageProps: Component.getInitialProps ? await Component.getInitialProps(ctx) : {},
    header: {header},
    footer: {footer},
  };
};

//export const dynamic = 'force-dynamic';
//export const revalidate = 0;
export default Application;
