/**
 * 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.
 */

const React = require('react');

class Footer extends React.Component {
  docUrl(doc, language) {
    const baseUrl = this.props.config.baseUrl;
    const docsUrl = this.props.config.docsUrl;
    const docsPart = `${docsUrl ? `${docsUrl}/` : ''}`;
    const langPart = `${language ? `${language}/` : ''}`;
    return `${baseUrl}${docsPart}${doc}`;
  }

  pageUrl(doc, language) {
    const baseUrl = this.props.config.baseUrl;
    return baseUrl + (language ? `${language}/` : '') + doc;
  }

  render() {
    return (
      <footer className="nav-footer" id="footer">
        <section className="sitemap">
          <a href={this.props.config.baseUrl} className="nav-home">
            {this.props.config.footerIcon && (
              <img
                src={this.props.config.baseUrl + this.props.config.footerIcon}
                alt={this.props.config.title}
                width="50"
                height="100"
              />
            )}
          </a>
          <div>
            <h5>Docs</h5>
            <a href={this.docUrl('milagro-intro.html', this.props.language)}>
              Milagro Intro
            </a>
            <a href={this.docUrl('amcl-overview.html', this.props.language)}>
              Apache Milagro Crypto Library
            </a>
            <a href={this.docUrl('d-ta-overview.html', this.props.language)}>
              Decentralized Trust Authority
            </a>
            <a href={this.docUrl('zkp-mfa-overview.html', this.props.language)}>
              Zero Knowledge Proof MFA
            </a>
          </div>
          <div>
            <h5>Community</h5>
            <a
              href="../help">
              Support
            </a>
            <a
              href="../docs/contributor-guide">
              Contributing
            </a>
            <a
              href="https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=115529045"
              target="_blank"
              rel="noreferrer noopener">
              Developer Wiki
            </a>
            <a
              href="https://twitter.com/apachemilagro?lang=en"
              target="_blank"
              rel="noreferrer noopener">
              Twitter
            </a>
          </div>
          <div>
            <h5>More</h5>
            <a href={`${this.props.config.baseUrl}blog`}>Status</a>
            <a href="https://github.com/apache/incubator-milagro-crypto">GitHub</a>
            <a
              className="github-button"
              href={this.props.config.repoUrl}
              data-icon="octicon-star"
              data-count-href="/apache/incubator-milagro-crypto/stargazers"
              data-show-count="true"
              data-count-aria-label="# stargazers on GitHub"
              aria-label="Star this project on GitHub">
              Star
            </a>
          </div>
        </section>

        <a
          href="https://apache.org"
          target="_blank"
          rel="noreferrer noopener"
          className="fbOpenSource">
          <img
            src={`${this.props.config.baseUrl}img/oss_logo.png`}
            alt="Apache Incubator"
            width="170"
            height="45"
          />
        </a>
        <section className="copyright">{this.props.config.copyright}</section>
      </footer>
    );
  }
}

module.exports = Footer;
