import {themes as prismThemes} from 'prism-react-renderer';
const math = require('remark-math');
const katex = require('rehype-katex');

// @ts-check
// Note: type annotations allow type checking and IDEs autocompletion

/** @typedef { import('prism-react-renderer').PrismTheme['styles'] } PrismThemeStyle */
/** @typedef { import('prism-react-renderer').PrismTheme['styles'][number]['style'] } PrismThemeEntry */

/**
  Updates styles array from prisma theme based off token type
  @type {(theme: PrismThemeStyle, replace: Record<string, PrismThemeEntry>) => PrismThemeStyle}
*/
const updateThemeStyles = (styles, replace) => {
	const copy = structuredClone(styles);

	const types = Object.keys(replace)
	copy.forEach(style => {
		types.forEach((type) => {
			if (style.types.includes(type)) {
				style.style = { ...style.style, ...replace[type]}
			}
		})
	})

	return copy
}

const lightCodeTheme = prismThemes.github;
const darkCodeTheme = prismThemes.dracula;

/** @type {import('@docusaurus/types').Config} */
const config = {
  title: 'SheetJS Community Edition',
  tagline: 'Get Sheet Done',
  url: 'https://docs.sheetjs.com',
  baseUrl: '/',
  onBrokenLinks: 'throw',
  onBrokenMarkdownLinks: 'warn',
  favicon: 'img/favicon.ico',

  // Even if you don't use internalization, you can use this field to set useful
  // metadata like html lang. For example, if your site is Chinese, you may want
  // to replace "en" with "zh-Hans".
  i18n: {
    defaultLocale: 'en',
    locales: ['en'],
  },

  presets: [
    [
      'classic',
      /** @type {import('@docusaurus/preset-classic').Options} */
      ({
        docs: {
          sidebarPath: require.resolve('./sidebars.js'),
          showLastUpdateTime: true,
          editUrl: 'https://git.sheetjs.com/sheetjs/docs.sheetjs.com/src/branch/master/docz',
          remarkPlugins: [math],
          rehypePlugins: [katex /* , { strict: false } */],
        },
        //blog: {
        //  showReadingTime: true,
          // Please change this to your repo.
          // Remove this to remove the "edit this page" links.
          // editUrl: 'https://git.sheetjs.com/sheetjs/docs.sheetjs.com/src/branch/master/docz/',
        //},
        theme: {
          customCss: require.resolve('./src/css/custom.css'),
        },
        googleAnalytics: {
          trackingID: 'UA-36810333-1',
          anonymizeIP: true
        },
        gtag: {
          trackingID: 'G-0TSXVXRHM6',
          anonymizeIP: true
        }
      }),
    ],
  ],

  themeConfig:
    /** @type {import('@docusaurus/preset-classic').ThemeConfig} */
    ({
      mermaid: {
        options: {
          themeVariables: {
            edgeLabelBackground: "transparent"
          }
        }
      },
      navbar: {
        title: 'SheetJS CE Docs',
        logo: {
          alt: 'SheetJS Logo',
          src: 'img/logo.svg',
        },
        items: [
          {
            type: 'doc',
            docId: 'index',
            position: 'left',
            label: 'Docs',
          },
          //{to: '/blog', label: 'Blog', position: 'left'},
          {
            href: 'https://sheetjs.com',
            label: 'SheetJS',
            position: 'right',
          },
          {
            href: 'https://git.sheetjs.com/sheetjs/sheetjs/issues',
            label: 'Source',
            position: 'right',
          },
        ],
      },
      footer: {
        style: 'dark',
        links: [
          {
            title: 'Docs',
            items: [
              {
                label: 'Intro',
                to: '/docs',
              },
              {
                label: 'Examples',
                to: '/docs/getting-started/examples',
              },
            ],
          },
          {
            title: 'Community',
            items: [
              {
                label: 'Discord',
                href: 'https://discord.gg/sheetjs',
              },
              {
                label: 'Twitter',
                href: 'https://twitter.com/sheetjs',
              },
            ],
          },
          {
            title: 'More',
            items: [
              //{
              //  label: 'Blog',
              //  to: '/blog',
              //},
              {
                label: 'SheetJS Pro',
                href: 'https://sheetjs.com/pro',
              },
              {
                label: 'Source',
                href: 'https://git.sheetjs.com/sheetjs/sheetjs',
              },
            ],
          },
        ],
        copyright: `Copyright © ${new Date().getFullYear()} SheetJS LLC.`,
      },
      prism: {
        theme: lightCodeTheme,
        darkTheme: {
          // Dracula dark theme by default has keyword and variable font style set to italic
          // reset to normal to be consistent with the light theme (github)
          ...darkCodeTheme,
          styles: updateThemeStyles(/** @type {any} */ (darkCodeTheme.styles), {
            'keyword': {
              fontStyle: "normal"
            },
            'variable': {
              fontStyle: "normal"
            }
          })
        },
        additionalLanguages: [ "visual-basic", "swift", "java", "php", "csharp", "perl", "ruby", "cpp", "applescript", "liquid", "rust", "dart", "wolfram", "matlab", "stata", "zig", "diff", "bash" ],
      },
      liveCodeBlock: {
        playgroundPosition: 'top'
      }
    }),
  themes: [
    "@docusaurus/theme-live-codeblock",
    "@docusaurus/theme-mermaid"
  ],
  markdown: {
    mermaid: true
  },
  scripts: [
    {
      src: "https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js",
      async: true
    }
  ],
  stylesheets: [
    {
      href: '/katex/katex.min.css',
      type: 'text/css',
      crossorigin: 'anonymous',
    },
  ],
  plugins: [
    require.resolve("@cmfcmf/docusaurus-search-local"),
    [ '@docusaurus/plugin-client-redirects', {
      redirects: [
        { from: '/docs/example', to: '/docs/getting-started/examples/export/' },
        { from: '/docs/getting-started/example', to: '/docs/getting-started/examples/export/' },
        { from: '/docs/installation', to: '/docs/getting-started/' },
        { from: '/docs/interface', to: '/docs/api/' },
        { from: '/docs/demos/excel', to: '/docs/demos/' },
        { from: '/docs/getting-started/demos/', to: '/docs/demos/' },
        { from: '/docs/getting-started/demos/excel', to: '/docs/demos/' },
        { from: '/docs/demos/content', to: '/docs/demos/static/' },
        { from: '/docs/demos/git', to: '/docs/demos/cloud/github/' },
        { from: '/docs/demo/grid', to: '/docs/demos/grid/' },
        /* frontend */
        { from: '/docs/demos/angular', to: '/docs/demos/frontend/angular/' },
        { from: '/docs/demos/react', to: '/docs/demos/frontend/react/' },
        { from: '/docs/demos/svelte', to: '/docs/demos/frontend/svelte/' },
        { from: '/docs/demos/vue', to: '/docs/demos/frontend/vue/' },
        { from: '/docs/demos/bundler', to: '/docs/demos/frontend/bundler/' },
        { from: '/docs/demos/legacy', to: '/docs/demos/frontend/legacy/' },
        { from: '/docs/demos/rollup', to: '/docs/demos/frontend/bundler/rollup/' },
        { from: '/docs/getting-started/demos/legacy', to: '/docs/demos/frontend/legacy/' },
        { from: '/docs/getting-started/demos/bundler', to: '/docs/demos/frontend/bundler/' },
        /* cloud */
        { from: '/docs/demos/salesforce', to: '/docs/demos/cloud/salesforce/' },
        { from: '/docs/getting-started/demos/salesforce', to: '/docs/demos/cloud/salesforce/' },
        { from: '/docs/demos/aws', to: '/docs/demos/cloud/aws/' },
        { from: '/docs/demos/azure', to: '/docs/demos/cloud/azure/' },
        { from: '/docs/demos/netsuite', to: '/docs/demos/cloud/netsuite/' },
        { from: '/docs/demos/gsheet', to: '/docs/demos/cloud/gsheet/' },
        { from: '/docs/demos/airtable', to: '/docs/demos/cloud/airtable/' },
        /* extensions */
        { from: '/docs/demos/extendscript', to: '/docs/demos/extensions/extendscript/' },
        { from: '/docs/demos/excelapi', to: '/docs/demos/extensions/excelapi/' },
        { from: '/docs/demos/chromium', to: '/docs/demos/extensions/chromium/' },
        { from: '/docs/getting-started/demos/chromium', to: '/docs/demos/extensions/chromium/' },
        /* cloud */
        { from: '/docs/demos/cloudata', to: '/docs/demos/cloud/' },
        { from: '/docs/demos/cloudata/gsheet', to: '/docs/demos/cloud/gsheet/' },
        { from: '/docs/demos/cloudata/airtable', to: '/docs/demos/cloud/airtable/' },
        { from: '/docs/getting-started/demos/netsuite', to: '/docs/demos/cloud/netsuite/' },
        /* hosting */
        { from: '/docs/demos/hosting/dropbox', to: '/docs/demos/cloud/dropbox/' },
        { from: '/docs/demos/hosting/github', to: '/docs/demos/cloud/github/' },
        /* data */
        { from: '/docs/getting-started/demos/database', to: '/docs/demos/data/' },
        { from: '/docs/demos/database', to: '/docs/demos/data/' },
        { from: '/docs/demos/nosql', to: '/docs/demos/data/' },
        { from: '/docs/getting-started/demos/nosql', to: '/docs/demos/data/' },
        /* net */
        { from: '/docs/demos/headless', to: '/docs/demos/net/headless/' },
        { from: '/docs/demos/server', to: '/docs/demos/net/server/' },
        { from: '/docs/demos/network', to: '/docs/demos/net/network/' },
        { from: '/docs/getting-started/demos/network', to: '/docs/demos/net/network/' },
        /* local */
        { from: '/docs/demos/clipboard', to: '/docs/demos/local/clipboard/' },
        { from: '/docs/getting-started/demos/clipboard', to: '/docs/demos/local/clipboard/' },
        { from: '/docs/demos/localfile', to: '/docs/demos/local/file/' },
        { from: '/docs/demos/data/indexeddb', to: '/docs/demos/local/indexeddb/' },
        { from: '/docs/demos/data/storageapi', to: '/docs/demos/local/storageapi/' },
        { from: '/docs/demos/data/websql', to: '/docs/demos/local/websql/' },
        /* desktop */
        { from: '/docs/getting-started/demos/desktop', to: '/docs/demos/desktop/' },
        /* cli */
        { from: '/docs/getting-started/demos/cli', to: '/docs/demos/cli/' },
        { from: '/docs/demos/desktop/cli', to: '/docs/demos/cli/' },
        /* bigdata */
        { from: '/docs/demos/worker', to: '/docs/demos/bigdata/worker/' },
        { from: '/docs/demos/stream', to: '/docs/demos/bigdata/stream/' },
        /* math */
        { from: '/docs/demos/ml', to: '/docs/demos/math/' },
        { from: '/docs/demos/bigdata/ml', to: '/docs/demos/math/' },
        { from: '/docs/demos/engines/pandas', to: '/docs/demos/math/pandas/' },
        /* installation */
        { from: '/docs/installation/standalone', to: '/docs/getting-started/installation/standalone/' },
        { from: '/docs/installation/frameworks', to: '/docs/getting-started/installation/frameworks/' },
        { from: '/docs/installation/nodejs', to: '/docs/getting-started/installation/nodejs/' },
        { from: '/docs/installation/amd', to: '/docs/getting-started/installation/amd/' },
        { from: '/docs/installation/extendscript', to: '/docs/getting-started/installation/extendscript/' },
        { from: '/docs/installation/deno', to: '/docs/getting-started/installation/deno/' },
        { from: '/docs/installation/bun', to: '/docs/getting-started/installation/bun/' },
        /* misc */
        { from: '/demos/datagrid', to: '/docs/demos/grid/' },
      ]
    }]
  ]
};

module.exports = config;
