/* eslint-disable no-undef */
const path = require(`path`);
const fs = require("fs");

exports.createPages = async ({ actions, graphql, reporter }) => {
  const { createPage } = actions;

  const projectTemplate = path.resolve(`src/templates/project.js`);

  const result = await graphql(`
    query AllPagesQuery {
      allProjectsJson {
        nodes {
          lang
          urlname
        }
      }
    }
  `);

  if (result.errors) {
    reporter.panicOnBuild(`Error while running GraphQL query.`);
    return;
  }

  result.data.allProjectsJson.nodes.forEach((node) => {
    // eslint-disable-next-line no-undef
    console.log("Creating Page: ", `/${node.lang}/projects/${node.urlname}`);

    if (node.lang !== "ignoreme")
      createPage({
        path: `/${node.lang}/projects/${node.urlname}`,
        component: projectTemplate,
        context: {
          lang: node.lang,
          urlname: node.urlname,
        },
      });
  });
};

const config = require("./config.js");

exports.onPostBuild = async ({ graphql, reporter }) => {
  console.log("Building static api...");

  const apiPrefix = "./public/api";

  if (!fs.existsSync(apiPrefix)) fs.mkdirSync(apiPrefix);

  fs.writeFileSync(
    `${apiPrefix}.json`,
    JSON.stringify({
      success: true,
      endpoints: {
        projects: [
          {
            name: "Projects Overview",
            description: "Returns overview of all available projects",
            path: "/api/projects.json",
          },
          {
            name: "Projects Overview for Language",
            description:
              "Returns overview of all available projects in a specified language",
            path: "/api/projects/:lang.json",
          },
          {
            name: "Get specific Project",
            description: "Returns specific project in specified language",
            path: "/api/projects/:lang/:slug.json",
          },
        ],
      },
    })
  );

  const projectsPrefix = apiPrefix + "/projects";

  if (!fs.existsSync(projectsPrefix)) fs.mkdirSync(projectsPrefix);

  await graphql(`
    query {
      allProjectsJson {
        nodes {
          longDescription
          urlname
          shortDescription
          name
          links {
            github
            website
          }
          lang
          image {
            publicURL
          }
          featured
        }
      }
    }
  `).then((res) => {
    if (res.errors) {
      reporter.panicOnBuild(`Error while running GraphQL query.`);
      return;
    }

    let projects = res.data.allProjectsJson.nodes.filter((project) => {
      return project.lang !== "ignoreme";
    });

    fs.writeFileSync(
      `${projectsPrefix}.json`,
      JSON.stringify({
        success: true,
        projects: projects.map((project) => {
          return {
            slug: project.urlname,
            lang: project.lang,
            api: `/api/projects/${project.lang}/${project.urlname}.json`,
          };
        }),
      })
    );

    config.languages.forEach((lang) => {
      if (!fs.existsSync(`${projectsPrefix}/${lang}`))
        fs.mkdirSync(`${projectsPrefix}/${lang}`);

      fs.writeFileSync(
        `${projectsPrefix}/${lang}.json`,
        JSON.stringify({
          success: true,
          projects: projects
            .filter((project) => {
              return project.lang == lang;
            })
            .map((project) => {
              return {
                slug: project.urlname,
                lang: project.lang,
                api: `/api/projects/${project.lang}/${project.urlname}.json`,
              };
            }),
        })
      );
    });

    projects.forEach((project) => {
      fs.writeFileSync(
        `${projectsPrefix}/${project.lang}/${project.urlname}.json`,
        JSON.stringify({
          success: true,
          project: {
            slug: project.urlname,
            lang: project.lang,
            name: project.name,
            shortDescription: project.shortDescription,
            longDescription: project.longDescription,
            links:
              project.links !== null
                ? {
                    github: project.links.github,
                    website: project.links.website,
                  }
                : null,
            image: project.image.publicURL,
            featured: project.featured,
            frontend: `/${project.lang}/projects/${project.urlname}`,
          },
        })
      );
    });
  });
};