const path = require(`path`);
const { createFilePath } = require('gatsby-source-filesystem');

const renderRdfType = async ({
  template,
  type,
  matcher,
  createPage,
  graphql,
}) => {
  // Person RDF rendering
  const rdfResult = await graphql(`
    {
      allRdf(
        filter: {
          data: { rdf_type: {elemMatch: {id: {${matcher}: ${type}}}} }
        }
      ) {
        edges {
          node {
            path
          }
        }
      }
    }
  `);
  if (rdfResult.errors) {
    return Promise.reject(rdfResult.errors);
  }
  rdfResult.data.allRdf.edges.forEach(({ node }) => {
    createPage({
      path: node.path,
      component: template,
      context: {}, // additional data can be passed via context
    });
  });
};

const renderMarkdownType = async ({
  type,
  matcher,
  templatePath,
  createPage,
  graphql,
}) => {
  // mdx news rendering
  const mdxNewsTemplate = path.resolve(templatePath);
  const mdxNewsResult = await graphql(`
    {
      allMdx(filter: { fields: { type: { ${matcher}: ${type} } } }) {
        edges {
          node {
            fields {
              path
            }
          }
        }
      }
    }
  `);
  if (mdxNewsResult.errors) {
    return Promise.reject(mdxNewsResult.errors);
  }
  mdxNewsResult.data.allMdx.edges.forEach(({ node }) => {
    createPage({
      path: node.fields.path,
      component: mdxNewsTemplate,
      context: {}, // additional data can be passed via context
    });
  });
};

exports.createPages = async ({
  actions: { createPage, createRedirect },
  graphql,
}) => {
  // redirect to students subpage
  createRedirect({
    fromPath: `/students`,
    isPermanent: true,
    redirectInBrowser: true,
    toPath: `/students/teaching/`,
  });
  createRedirect({
    fromPath: `/students/`,
    isPermanent: true,
    redirectInBrowser: true,
    toPath: `/students/teaching/`,
  });
  // redirect to collaborators subpage
  createRedirect({
    fromPath: `/collaborators`,
    isPermanent: true,
    redirectInBrowser: true,
    toPath: `/collaborators/activeprojects/`,
  });
  createRedirect({
    fromPath: `/collaborators/`,
    isPermanent: true,
    redirectInBrowser: true,
    toPath: `/collaborators/activeprojects/`,
  });

  // mdx news rendering
  await renderMarkdownType({
    type: '"news"',
    matcher: 'eq',
    templatePath: 'src/templates/newsPage.js',
    createPage,
    graphql,
  });

  // mdx teaching rendering
  await renderMarkdownType({
    type: '"teaching"',
    matcher: 'eq',
    templatePath: 'src/templates/teachingPage.js',
    createPage,
    graphql,
  });

  // mdx thesis rendering
  await renderMarkdownType({
    type: '"theses"',
    matcher: 'eq',
    templatePath: 'src/templates/thesisPage.js',
    createPage,
    graphql,
  });

  // rest pages mdx rendering
  await renderMarkdownType({
    type: '["news", "teaching", "theses"]',
    matcher: 'nin',
    templatePath: 'src/templates/markdownPage.js',
    createPage,
    graphql,
  });

  // Person RDF rendering
  const personTemplate = path.resolve(`src/templates/personPage.js`);
  const personType = 'https://schema.dice-research.org/Person';
  await renderRdfType({
    template: personTemplate,
    type: `"${personType}"`,
    matcher: 'eq',
    createPage,
    graphql,
  });

  // Project RDF rendering
  const projectTemplate = path.resolve(`src/templates/projectPage.js`);
  const projectTypes = [
    'https://dice-research.org/FundedProject',
    'https://dice-research.org/ProductionReadyProject',
    'https://dice-research.org/IncubatorProject',
    'https://dice-research.org/AlumniProject',
  ];
  await renderRdfType({
    template: projectTemplate,
    type: `["${projectTypes.join('","')}"]`,
    matcher: 'in',
    createPage,
    graphql,
  });

  // Demo RDF rendering
  const demoTemplate = path.resolve(`src/templates/demoPage.js`);
  const demoType = 'https://schema.dice-research.org/Demo';
  await renderRdfType({
    template: demoTemplate,
    type: `"${demoType}"`,
    matcher: 'eq',
    createPage,
    graphql,
  });
};

exports.onCreateNode = ({ node, actions, getNode }) => {
  const { createNodeField } = actions;
  // We only want to operate on `Mdx` nodes. If we had content from a
  // remote CMS we could also check to see if the parent node was a
  // `File` node here
  if (node.internal.type === 'Mdx') {
    // generate path from frontmatter or from node path
    const basePath = createFilePath({ node, getNode });
    const nodePath =
      node.internal.frontmatter && node.internal.frontmatter.path
        ? node.internal.frontmatter.path
        : basePath;
    createNodeField({
      name: 'path',
      node,
      value: nodePath,
    });

    // generate article type from frontmatter or from node path
    const baseType = basePath.split('/')[1] || 'page';
    const nodeType =
      node.internal.frontmatter && node.internal.frontmatter.type
        ? node.internal.frontmatter.type
        : baseType;
    createNodeField({
      name: 'type',
      node,
      value: nodeType,
    });
  }
};