import React, { useEffect } from 'react';
import Head from '@docusaurus/Head';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import useBaseUrl from '@docusaurus/useBaseUrl';
// import { TabulaProvider } from '@rasahq/react-tabula';
import ThemeProvider from '@theme/_contexts/ThemeProvider';
import SidebarProvider from '@theme/_contexts/SidebarProvider';
import UserPreferencesProvider from '@theme/_contexts/UserPreferencesProvider';
import TopNavbar from '@theme/TopNavbar';
import Footer from '@theme/Footer';
import { GraphQLClient, ClientContext as GraphQLClientContext } from 'graphql-hooks';
import { SegmentManager } from '@rasahq/react-tabula';
import Link from '@docusaurus/Link';
import logLevel from 'loglevel';

const log = logLevel.getLogger('docusaurus');
log.setLevel('debug');

import faviconUrl from '!file-loader!./_assets/favicon.ico';
import touchIcon from '!file-loader!./_assets/apple-touch-icon.png';
import favicon32 from '!file-loader!./_assets/favicon-32x32.png';
import favicon16 from '!file-loader!./_assets/favicon-16x16.png';
import pinnedTab from '!file-loader!./_assets/safari-pinned-tab.svg';

const pkgVersion = require('../package.json')['version'];
const isClient = typeof window !== 'undefined';
const isDev = process.env.NODE_ENV == 'development';

function Providers({ children }) {
  return (
    <ThemeProvider>
      <SidebarProvider>
        <UserPreferencesProvider>{children}</UserPreferencesProvider>
      </SidebarProvider>
    </ThemeProvider>
  );
}

function Layout(props) {
  const { siteConfig = {} } = useDocusaurusContext();
  const {
    title: siteTitle,
    themeConfig: { image: siteMetaImage },
    url: siteUrl,
    customFields: { datocmsToken },
  } = siteConfig;
  const { children, title, description, image, keywords, permalink, version } = props;
  const metaTitle = title ? `${title} | ${siteTitle}` : siteTitle;
  const metaImage = image || siteMetaImage;
  const metaImageUrl = useBaseUrl(metaImage, {
    absolute: true,
  });

  /*
  Datocms Provider Setup

  const { Provider: GraphQLClientProvider } = GraphQLClientContext;
  const datoClient =
    !isClient && datocmsToken
      ? null
      : new GraphQLClient({
          url: 'https://graphql.datocms.com/',
          headers: {
            Authorization: datocmsToken,
          },
        });
    <GraphQLClientProvider value={datoClient}>
    </GraphQLClientProvider>

   */

  // ENSURE TRAILING SLASH ON CANONICAL URL
  const canonical = permalink && (permalink.match(/\/$/) ? permalink : permalink + '/');

  // TABULA CONFIG LOCALSTORAGE SETUP
  // TODO: extract this to a hook
  const tabulaConfig =
    isClient && isDev ? JSON.parse(window?.localStorage.getItem('tabula')) || { debug: false } : {};
  const setTabulaConfig =
    isClient && isDev
      ? () => window.localStorage.setItem('tabula', JSON.stringify(tabulaConfig))
      : () => undefined;
  useEffect(() => {
    log.debug('mounted Layout component');
    if (isDev && isClient) {
      document.body.classList.toggle('debug', tabulaConfig.debug);
      document.body.addEventListener('keyup', function (event) {
        if (event.shiftKey == true && event.ctrlKey == true && (event.keyCode || event.which) == 68) {
          tabulaConfig.debug = !tabulaConfig.debug;
          document.body.classList.toggle('debug', tabulaConfig.debug);
          setTabulaConfig();
        }
      });
    }
  });

  return (
    <Providers>
      <Head>
        <html lang="en" />
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
        {/* eslint-disable-next-line react/no-unknown-property */}
        <meta http-equiv="X-UA-Compatible" content="ie=edge" />
        <link rel="apple-touch-icon" sizes="180x180" href={`${touchIcon}?v=${pkgVersion}`} />
        <link rel="icon" type="image/png" sizes="32x32" href={`${favicon32}?v=${pkgVersion}`} />
        <link rel="icon" type="image/png" sizes="16x16" href={`${favicon16}?v=${pkgVersion}`} />
        <link rel="mask-icon" href={`${pinnedTab}?v=${pkgVersion}`} color="#5bbad5" />
        <link rel="shortcut icon" href={`${faviconUrl}?v=${pkgVersion}`} />
        <meta name="apple-mobile-web-app-title" content={siteTitle} />
        <meta name="application-name" content={siteTitle} />
        <meta name="msapplication-TileColor" content="#603cba" />
        <meta name="theme-color" content="#ffffff" />
        {metaTitle && <title>{metaTitle}</title>}
        {metaTitle && <meta property="og:title" content={metaTitle} />}
        {description && <meta name="description" content={description} />}
        {description && <meta property="og:description" content={description} />}
        {version && <meta name="docsearch:version" content={version} />}
        {keywords && keywords.length && <meta name="keywords" content={keywords.join(',')} />}
        {metaImage && <meta property="og:image" content={metaImageUrl} />}
        {metaImage && <meta property="twitter:image" content={metaImageUrl} />}
        {metaImage && <meta name="twitter:image:alt" content={`Image for ${metaTitle}`} />}
        {canonical && <meta property="og:url" content={siteUrl + canonical} />}
        {canonical && <link rel="canonical" href={siteUrl + canonical} />}
        <meta name="twitter:card" content="summary_large_image" />
      </Head>
      <TopNavbar />
      <main className="main">{children}</main>
      <Footer />
      <SegmentManager className="link-plain" linkComponent={Link}>
        Analytics Preferences
      </SegmentManager>
    </Providers>
  );
}

export default Layout;
