/**
 * 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-c">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;
