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

const CompLibrary = require("../../core/CompLibrary.js");

const hljs = require("highlight.js");

const MarkdownBlock = CompLibrary.MarkdownBlock; /* Used to read markdown */
const Container = CompLibrary.Container;
const GridBlock = CompLibrary.GridBlock;

const pre = "```";

const pascaligoExampleSmall = `${pre}pascaligo
// variant defining pseudo multi-entrypoint 
// actions
type action is
| Increment of int
| Decrement of int

function add 
  (const a: int; const b: int): int is 
  block { skip } with a + b

function subtract 
  (const a: int; const b: int): int 
  is block { skip } with a - b

// real entrypoint that re-routes the flow 
// based on the action provided
function main 
  (const p: action; const s: int): 
  (list(operation) * int) is
 block { skip } 
  with ((nil : list(operation)),
    case p of
    | Increment(n) -> add(s, n)
    | Decrement(n) -> subtract(s, n)
  end)
${pre}`;

const pascaligoExample = `${pre}pascaligo
// variant defining pseudo multi-entrypoint actions
type action is
| Increment of int
| Decrement of int

function add (const a : int ; const b : int) : int is
 block { skip } with a + b

function subtract (const a : int ; const b : int) : int is
 block { skip } with a - b

// real entrypoint that re-routes the flow based 
// on the action provided
function main (const p : action ; const s : int) : 
  (list(operation) * int) is
 block { skip } with ((nil : list(operation)),
  case p of
  | Increment(n) -> add(s, n)
  | Decrement(n) -> subtract(s, n)
 end)
${pre}`;
const cameligoExampleSmall = `${pre}ocaml
type storage = int

(* variant defining pseudo multi-entrypoint 
  actions *)
type action =
  | Increment of int
  | Decrement of int

let add (a: int) (b: int): int = a + b

let subtract (a: int) (b: int): int = a - b

(* real entrypoint that re-routes the flow 
   based on the action provided *)
let%entry main(p : action) storage =
  let storage =
    match p with
    | Increment n -> add storage n
    | Decrement n -> subtract storage n
  in (([] : operation list), storage)
${pre}`;

const cameligoExample = `${pre}ocaml
type storage = int

(* variant defining pseudo multi-entrypoint actions *)
type action =
  | Increment of int
  | Decrement of int

let add (a: int) (b: int): int = a + b

let subtract (a: int) (b: int): int = a - b

(* real entrypoint that re-routes the flow based on 
   the action provided *)
let%entry main(p : action) storage =
  let storage =
    match p with
    | Increment n -> add storage n
    | Decrement n -> subtract storage n
  in (([] : operation list), storage)
${pre}`;

const PascalLIGOTab = () => (
  <div
    id="tab-group-3-content-4"
    className="tab-pane active code-snippet"
    data-group="group_3"
    tabIndex="-1"
  >
    <MarkdownBlock>{pascaligoExampleSmall}</MarkdownBlock>
    <MarkdownBlock>{pascaligoExample}</MarkdownBlock>
  </div>
);

const CamelLIGOTab = () => (
  <div
    id="tab-group-3-content-5"
    className="tab-pane code-snippet"
    data-group="group_3"
    tabIndex="-1"
  >
    <MarkdownBlock>{cameligoExampleSmall}</MarkdownBlock>
    <MarkdownBlock>{cameligoExample}</MarkdownBlock>
  </div>
);

const LinkButton = props => (
  <a href={props.href} target={props.target}>
    <button className={props.className}>{props.children}</button>
  </a>
);

class HomeSplash extends React.Component {
  render() {
    const { siteConfig, language = "" } = this.props;
    const { baseUrl, docsUrl } = siteConfig;
    const docsPart = `${docsUrl ? `${docsUrl}/` : ""}`;
    const langPart = `${language ? `${language}/` : ""}`;
    const docUrl = doc => `${baseUrl}${docsPart}${langPart}${doc}`;

    const SampleCode = props => (
      <div className="sample-code-container">
        <div className="sample-code">
          <div className="tabs">
            <div className="nav-tabs">
              <div
                id="tab-group-3-tab-4"
                className="nav-link active"
                data-group="group_3"
                data-tab="tab-group-3-content-4"
              >
                PascaLIGO
              </div>
              <div
                className="nav-link"
                data-group="group_3"
                data-tab="tab-group-3-content-5"
              >
                CameLIGO
              </div>
              <div className="disabled">ReasonLIGO (coming soon) </div>
            </div>
            <div className="tab-content">
              {PascalLIGOTab()}
              {CamelLIGOTab()}
            </div>
          </div>
        </div>
      </div >
    );

    return (
      <div className="home-container">
        <div className="home-text">
          <div className="projectTitle">
            <img alt={siteConfig.title} src={`${siteConfig.baseUrl}img/logo.svg`} />
          </div>
          <h4 className="tagline-text">{siteConfig.tagline}</h4>
          <p className="body">{siteConfig.taglineSub}</p>
          <LinkButton
            href="https://ligolang.gitlab.io/ligo-web-ide/"
            className="large-primary-button"
          >
            Try Online
          </LinkButton>
          <p></p>
          <LinkButton
            href={docUrl("setup/installation.html")}
            className="large-secondary-button"
          >
            Get Started
          </LinkButton>


        </div>
        <SampleCode />
      </div>
    );
  }
}

class Index extends React.Component {
  render() {
    const { config: siteConfig, language = "" } = this.props;
    const { baseUrl } = siteConfig;

    const Block = props => (
      <Container
        padding={["bottom", "top"]}
        id={props.id}
        background={props.background}
      >
        <GridBlock
          align="center"
          contents={props.children}
          layout={props.layout}
        />
      </Container>
    );

    const FeatureCallout = () => (
      <div
        className="productShowcaseSection paddingBottom"
        style={{ textAlign: "center" }}
      >
        <h2>Feature Callout</h2>
        <MarkdownBlock>These are features of this project</MarkdownBlock>
      </div>
    );

    const TryOut = () => (
      <Block id="try">
        {[
          {
            content:
              "To make your landing page more attractive, use illustrations! Check out " +
              "[**unDraw**](https://undraw.co/) which provides you with customizable illustrations which are free to use. " +
              "The illustrations you see on this page are from unDraw.",
            image: `${baseUrl}img/undraw_code_review.svg`,
            imageAlign: "left",
            title: "Wonderful SVG Illustrations"
          }
        ]}
      </Block>
    );

    const Description = () => (
      <Block background="dark">
        {[
          {
            content:
              "This is another description of how this project is useful",
            image: `${baseUrl}img/undraw_note_list.svg`,
            imageAlign: "right",
            title: "Description"
          }
        ]}
      </Block>
    );

    const LearnHow = () => (
      <Block background="light">
        {[
          {
            content:
              "Each new Docusaurus project has **randomly-generated** theme colors.",
            image: `${baseUrl}img/undraw_youtube_tutorial.svg`,
            imageAlign: "right",
            title: "Randomly Generated Theme Colors"
          }
        ]}
      </Block>
    );

    const FeatureCard = props => (
      <div className="card" key={props.title}>
        <img src={props.image} />
        <div className="card-text">
          <h4>{props.title}</h4>
          <p className="body">{props.content}</p>
        </div>
      </div>
    );

    const Features = () => (
      <div className="features">
        <h2>Features</h2>

        <div className="flex-inline-container">
          {[
            {
              content:
                "Write types, then code, and benefit from the safety coming from type systems.",
              image: `${baseUrl}img/strong-type-system.svg`,
              title: "Strong Type System"
            },
            {
              content:
                "Write in PascaLIGO (pascal-like syntax) or CameLIGO (caml-like syntax). If you know OCaml, you can also add your own syntax.",
              image: `${baseUrl}img/syntax-agnostic.svg`,
              title: "Syntax Agnostic"
            },

            {
              content: "With Granary, you can use LIGO as a lib from NodeJS.",
              image: `${baseUrl}img/easy-integration.svg`,
              title: "Easy Integration"
            }
          ].map(FeatureCard)}
        </div>
      </div>
    );

    const Roadmap = () => (
      <div className="roadmap">
        <Block background="light">
          {[
            {
              content:
                "<h4>June 2019</h4>" +
                "<em><ul>" +
                "<li>First public release</li>" +
                "<li>PascaLIGO and CameLIGO syntaxes</li>" +
                "<li>Docs and Tutorials</li>" +
                "<li>Integration testing in ReasonML/JS with Granary</li>" +
                "</ul></em>" +
                "<h4>July 2019</h4>" +
                "<em><ul>" +
                "<li>Try LIGO online editor</li>" +
                "<li>Unit testing toolkit</li>" +
                "<li>ReasonLIGO syntax support</li>" +
                "<li>Repository with best practices & patterns for LIGO</li>" +
                "</ul></em>" +
                "<h4>August 2019</h4>" +
                "<em>" +
                "Long term plans will be announced soon" +
                "</em>",
              image: ``,
              imageAlign: "right",
              title: "Roadmap"
            }
          ]}
        </Block>
      </div>
    );

    const Partners = () => {
      if ((siteConfig.partners || []).length === 0) {
        return null;
      }

      const PartnerShowcase = siteConfig.partners
        .filter(user => user.pinned)
        .map(user => (
          <a className="partner-link" href={user.infoLink} key={user.infoLink}>
            <img src={user.image} alt={user.caption} title={user.caption} />
          </a>
        ));

      return (
        <div className="partners-container hide-small">
          {PartnerShowcase}
          <div className="partners-text">
            <h3>Partners</h3>

          </div>
        </div>
      );
    };

    const Team = () => {
      if ((siteConfig.team || []).length === 0) {
        return null;
      }

      const showcase = siteConfig.team
        .filter(user => user.pinned)
        .map(user => (
          <a
            className="profileContainer"
            href={user.infoLink}
            key={user.infoLink}
          >
            <img className="profileImage" src={user.image} alt={user.caption} />
            <p className="headline">{user.caption}</p>
          </a>
        ));

      return (
        <div className="team">
          <h2>Team</h2>
          <div className="flex-inline-container">{showcase}</div>
        </div>
      );
    };

    return (
      <div className="landing">
        <HomeSplash siteConfig={siteConfig} language={language} />
        <div className="mainContainer">
          <Features />
          {/* <Roadmap /> */}
          {/* <FeatureCallout /> */}
          {/* {/* <LearnHow /> */}
          {/* <TryOut /> */}
          {/* <Description /> */}
          <Team />
          <Partners />
        </div>
      </div>
    );
  }
}

module.exports = Index;