import React, { useEffect } from 'react';
import Head from '@docusaurus/Head';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import useBaseUrl from '@docusaurus/useBaseUrl';
import DocPaginator from '@theme/DocPaginator';
import DocVersionSuggestions from '@theme/DocVersionSuggestions';
import TOC from '@theme/TOC';

const isClient = typeof window !== 'undefined';
const isDev = process.env.NODE_ENV == 'development';

function DocItem(props) {
  const {
    siteConfig: {
      url: siteUrl,
      title: siteMetaTitle,
      tagline: siteMetaDescription,
      themeConfig: { image: siteMetaImage },
      customFields: { versionLabels = {}, metaTitleSuffix = '', privateRepo = false, rootEditUrl },
    } = {},
  } = useDocusaurusContext();
  const { content: MDXContent } = props;
  const { frontMatter, metadata } = MDXContent;
  const { permalink, editUrl, lastUpdatedAt, lastUpdatedBy, version } = metadata;
  const {
    /* metadata */
    title = siteMetaTitle,
    image = siteMetaImage,
    description = siteMetaDescription,
    meta_title: metaTitle = title,
    meta_image: metaImage = image,
    meta_image_alt: metaImageAlt = `Title image for page: ${metaTitle}`,
    meta_description: metaDescription = description,
    keywords,
    /* options */
    abstract,
    hide_title: hideTitle,
    hide_table_of_contents: hideTOC,
  } = frontMatter;

  // ensure trailing slash on canonical URL
  const canonical = permalink && (permalink.match(/\/$/) ? permalink : permalink + '/');

  // NB images right now have to in /static/ and references in abs path
  const metaImageUrl = useBaseUrl(metaImage, { absolute: true });

  useEffect(() => {
    if (isDev && isClient) {
      // console.table(props);
      // console.table(metadata);
    }
  });

  return (
    <>
      <Head>
        <title>{metaTitle + metaTitleSuffix}</title>
        <meta property="og:title" content={metaTitle + metaTitleSuffix} />
        <meta name="description" content={metaDescription} />
        <meta property="og:description" content={metaDescription} />
        {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={metaImageAlt} />}
        {canonical && <meta property="og:url" content={siteUrl + canonical} />}
        {canonical && <link rel="canonical" href={siteUrl + canonical} />}
      </Head>
      <article className="docpage-content-main m__pr-m l__px-m pt-s pb-xl stack stack-m">
        {!hideTitle && (
          <header className={'prose-sans-m'} style={{}}>
            <DocVersionSuggestions />
            <div className="version-badge">
              <span className="badge badge--secondary">Version: {versionLabels[version] || version}</span>
            </div>
            <h1 className="docpage-title f-sans-xxl">{title}</h1>
            {abstract && <p className="docpage-abstract">{abstract}</p>}
          </header>
        )}
        <div className={'prose-mdx prose-sans-s'}>
          <MDXContent />
        </div>
        <footer className={'shim-xxl'}>
          <DocPaginator metadata={metadata} />
          {(lastUpdatedAt || lastUpdatedBy) && (
            <div className="col text--right">
              <em>
                <small>
                  Last updated{' '}
                  {lastUpdatedAt && (
                    <>
                      on{' '}
                      <time
                        dateTime={new Date(lastUpdatedAt * 1000).toISOString()}
                        className="docLastUpdatedAt"
                      >
                        {new Date(lastUpdatedAt * 1000).toLocaleDateString()}
                      </time>
                      {lastUpdatedBy && ' '}
                    </>
                  )}
                  {lastUpdatedBy && !privateRepo && (
                    <>
                      by <strong>{lastUpdatedBy}</strong>
                    </>
                  )}
                  {process.env.NODE_ENV === 'development' && (
                    <div>
                      <small> (Simulated during dev for better perf)</small>
                    </div>
                  )}
                </small>
              </em>
            </div>
          )}
          {(rootEditUrl || editUrl) && !privateRepo && (
            <a href={rootEditUrl || editUrl} target="_blank" rel="noreferrer noopener">
              <svg
                fill="currentColor"
                height="1.2em"
                width="1.2em"
                preserveAspectRatio="xMidYMid meet"
                viewBox="0 0 40 40"
                style={{
                  marginRight: '0.3em',
                  verticalAlign: 'sub',
                }}
              >
                <g>
                  <path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z" />
                </g>
              </svg>
              Edit this page
            </a>
          )}
        </footer>
      </article>
      {!hideTOC && (
        <aside className="docpage-content-side sticky-sidebar d-none m__d-flex">
          <TOC headings={MDXContent.rightToc} />{' '}
        </aside>
      )}
    </>
  );
}

export default DocItem;
