/**
 * Copyright (c) 2017-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

import React, {useContext} from 'react';

import Link from '@docusaurus/Link';
import Search from '@theme/Search';
import DocusaurusContext from '@docusaurus/context';
import styles from './styles.module.css';

function Navbar(props) {
  const context = useContext(DocusaurusContext);
  const {
    siteConfig = {},
    env = {},
    metadata = {},
    docsMetadatas = {},
  } = context;
  const {baseUrl, headerLinks, headerIcon, algolia} = siteConfig;
  const {language: thisLanguage, version: thisVersion} = metadata;

  const translationEnabled = env.translation.enabled;
  const versioningEnabled = env.versioning.enabled;

  // function to generate each header link
  const makeLinks = link => {
    if (link.search && algolia) {
      // return algolia search bar
      return (
        <li className={styles.navListItem} key="search-box">
          <Search {...props} />
        </li>
      );
    }
    if (link.languages) {
      // TODO in the future for <LanguageDropdown /> like in v1
      return null;
    }
    if (link.doc) {
      // set link to document with current page's language/version
      const langPart = translationEnabled ? `${thisLanguage}-` : '';
      const versionPart =
        versioningEnabled && thisVersion !== 'next'
          ? `version-${thisVersion || env.versioning.defaultVersion}-`
          : '';
      const id = langPart + versionPart + link.doc;
      if (!docsMetadatas[id]) {
        const errorStr = `We could not find the doc wih id: ${id}. Please check your headerLinks correctly\n`;
        throw new Error(errorStr);
      }
      return (
        <li key={link.doc} className={styles.navListItem}>
          <Link
            activeClassName={styles.navLinkActive}
            className={styles.navLink}
            to={docsMetadatas[id].permalink}>
            {link.label}
          </Link>
        </li>
      );
    }
    if (link.page) {
      // set link to page with current page's language if appropriate
      const pageHref = `${baseUrl}${thisLanguage ? `${thisLanguage}/` : ''}${
        link.page
      }`;
      return (
        <li key={link.page} className={styles.navListItem}>
          <Link
            activeClassName={styles.navLinkActive}
            className={styles.navLink}
            to={pageHref}>
            {link.label}
          </Link>
        </li>
      );
    }
    if (link.href) {
      // set link to specified href
      return (
        <li key={link.label} className={styles.navListItem}>
          <Link to={link.href} className={styles.navLink}>
            {link.label}
          </Link>
        </li>
      );
    }
    if (link.blog) {
      // set link to blog url
      const blogUrl = `${baseUrl}blog`;
      return (
        <li key="Blog" className={styles.navListItem}>
          <Link
            activeClassName={styles.navLinkActive}
            className={styles.navLink}
            to={blogUrl}>
            Blog
          </Link>
        </li>
      );
    }
    return null;
  };

  return (
    <nav className={styles.navbar}>
      <div className={styles.navbarInner}>
        <ul className={styles.navList}>
          <li key="logo" className={styles.navListItem}>
            <Link className={styles.navBrand} to="/">
              <img
                alt="Docusaurus Logo"
                className={styles.navLogo}
                src={baseUrl + headerIcon}
              />
              <strong>Docusaurus</strong>
            </Link>
          </li>
          {headerLinks.map(makeLinks)}
        </ul>
      </div>
    </nav>
  );
}

export default Navbar;