const fs = require("fs");

function list_ids_in_directory(directory, hardcoded_labels) {
  if (hardcoded_labels === undefined) {
    hardcoded_labels = {};
  }

  const files = fs.readdirSync(`../${directory}`).sort();
  let ids = [];
  for (const name of files) {
    if (fs.lstatSync(`../${directory}/${name}`).isDirectory()) {
      // Recurse into the directory.
      const inner_ids = list_ids_in_directory(`${directory}/${name}`);
      ids = ids.concat(inner_ids);
    } else {
      if (name.endsWith(".md")) {
        const slug = name.replace(/\.md$/, "");
        let id = `${directory}/${slug}`;
        if (id.match(/\/\d+-.+/)) {
          id = id.replace(/\/\d+-/, "/");
        }

        if (id in hardcoded_labels) {
          label = hardcoded_labels[id];
          ids.push({ type: "doc", id, label });
        } else {
          ids.push({ type: "doc", id });
        }
      }
    }
  }
  return ids;
}

// note: to handle errors where you don't want a markdown file in the sidebar, add it as a comment.
// this will fix errors like `Error: File not accounted for in sidebar: ...`
module.exports = {
  // users
  // architects
  // modelers
  // developers
  // operators

  overviewSidebar: {
    DataHub: [
      "README",
      // "docs/faq", // hide from sidebar: out of date
      "docs/features",
      {
        Architecture: [
          "docs/architecture/architecture",
          "docs/components",
          "docs/architecture/metadata-ingestion",
          "docs/architecture/metadata-serving",
          // "docs/what/gma",
          // "docs/what/gms",
        ],
      },
      "docs/roadmap",
      "docs/CONTRIBUTING",
      "docs/demo",
      "docs/saas",
      "releases",
    ],
    "Getting Started": [
      "docs/quickstart",
      "docs/cli",
      "metadata-ingestion/README",
      "docs/debugging",
    ],
    "Metadata Ingestion": [
      // add a custom label since the default is 'Metadata Ingestion'
      // note that we also have to add the path to this file in sidebarsjs_hardcoded_titles in generateDocsDir.ts
      {
        type: "doc",
        label: "Quickstart",
        id: "metadata-ingestion/README",
      },
      {
        Sources: list_ids_in_directory("metadata-ingestion/source_docs", {
          "metadata-ingestion/source_docs/s3": "S3",
        }),
      },
      "metadata-ingestion/transformers",
      {
        Sinks: list_ids_in_directory("metadata-ingestion/sink_docs"),
      },
      {
        Scheduling: [
          "metadata-ingestion/schedule_docs/intro",
          "metadata-ingestion/schedule_docs/cron",
          "metadata-ingestion/schedule_docs/airflow",
        ],
      },
      {
        Lineage: [
          "docs/lineage/intro",
          "docs/lineage/airflow",
          "docker/airflow/local_airflow",
          "docs/lineage/sample_code",
          "spark-lineage/README",
        ],
      },
      {
        Guides: [
          "metadata-ingestion/adding-source",
          "docs/how/add-custom-ingestion-source",
          "docs/how/add-custom-data-platform",
          "docs/how/add-user-data",
        ],
      },
    ],
    "Metadata Modeling": [
      "docs/modeling/metadata-model",
      "docs/modeling/extending-the-metadata-model",
      // TODO: change the titles of these, removing the "What is..." portion from the sidebar"
      // "docs/what/entity",
      // "docs/what/aspect",
      // "docs/what/urn",
      // "docs/what/relationship",
      // "docs/what/search-document",
      // "docs/what/snapshot",
      // "docs/what/delta",
      // "docs/what/mxe",
    ],
    "GraphQL API": [
      {
        label: "Overview",
        type: "doc",
        id: "docs/api/graphql/overview",
      },
      {
        Reference: [
          {
            type: "doc",
            label: "Queries",
            id: "graphql/queries",
          },
          {
            type: "doc",
            label: "Mutations",
            id: "graphql/mutations",
          },
          {
            type: "doc",
            label: "Objects",
            id: "graphql/objects",
          },
          {
            type: "doc",
            label: "Inputs",
            id: "graphql/inputObjects",
          },
          {
            type: "doc",
            label: "Interfaces",
            id: "graphql/interfaces",
          },
          {
            type: "doc",
            label: "Unions",
            id: "graphql/unions",
          },
          {
            type: "doc",
            label: "Enums",
            id: "graphql/enums",
          },
          {
            type: "doc",
            label: "Scalars",
            id: "graphql/scalars",
          },
        ],
      },
      {
        Guides: [
          {
            type: "doc",
            label: "Getting Started",
            id: "docs/api/graphql/getting-started",
          },
          {
            type: "doc",
            label: "Querying Metadata Entities",
            id: "docs/api/graphql/querying-entities",
          },
        ],
      },
    ],
    "Usage Guides": ["docs/policies"],
    "Developer Guides": [
      // TODO: the titles of these should not be in question form in the sidebar
      "docs/developers",
      "docs/docker/development",
      {
        type: "doc",
        label: "Ingesting files from S3",
        id: "metadata-ingestion/source_docs/s3",
      },
      //"metadata-ingestion/examples/transforms/README"
      //"docs/what/graph",
      //"docs/what/search-index",
      //"docs/how/add-new-aspect",
      //"docs/how/build-metadata-service",
      //"docs/how/graph-onboarding",
      //"docs/demo/graph-onboarding",
      "docs/how/auth/jaas",
      "docs/how/auth/sso/configure-oidc-react",
      "docs/how/auth/sso/configure-oidc-react-google",
      "docs/how/auth/sso/configure-oidc-react-okta",
      "docs/how/restore-indices",
      "docs/how/extract-container-logs",
      "docs/how/delete-metadata",
      "datahub-web-react/src/app/analytics/README",
      "metadata-ingestion/developing",
      {
        "Module READMEs": [
          "datahub-web-react/README",
          "datahub-frontend/README",
          "datahub-graphql-core/README",
          "metadata-service/README",
          // "metadata-jobs/README",
          "metadata-jobs/mae-consumer-job/README",
          "metadata-jobs/mce-consumer-job/README",
        ],
      },
      {
        Advanced: [
          "docs/advanced/no-code-modeling",
          "docs/advanced/db-retention",
          "docs/advanced/aspect-versioning",
          "docs/advanced/es-7-upgrade",
          "docs/advanced/high-cardinality",
          "docs/advanced/no-code-upgrade",
          "docs/how/migrating-graph-service-implementation",
          "docs/advanced/mcp-mcl",
          "docs/advanced/field-path-spec-v2",
          "docs/advanced/monitoring",
          // WIP "docs/advanced/backfilling",
          // WIP "docs/advanced/derived-aspects",
          // WIP "docs/advanced/entity-hierarchy",
          // WIP "docs/advanced/partial-update",
          // WIP "docs/advanced/pdl-best-practices",
          // WIP "docs/introducing-metadata-service-authentication"
          // WIP "metadata-models-custom/README"
        ],
      },
    ],
    "Deployment Guides": [
      "docs/how/kafka-config",
      "docker/README",
      "docs/deploy/kubernetes",
      "docker/datahub-upgrade/README",
      "docs/deploy/aws",
      "docs/deploy/gcp",
      "docs/deploy/confluent-cloud",
      // Purposely not including the following:
      // - "docker/datahub-frontend/README",
      // - "docker/datahub-gms/README",
      // - "docker/datahub-mae-consumer/README",
      // - "docker/datahub-mce-consumer/README",
      // - "docker/datahub-ingestion/README",
      // - "docker/elasticsearch-setup/README",
      // - "docker/ingestion/README",
      // - "docker/kafka-setup/README",
      // - "docker/mariadb/README",
      // - "docker/mysql/README",
      // - "docker/neo4j/README",
      // - "docker/postgres/README",
      // - "perf-test/README",
    ],
    Community: [
      "docs/slack",
      "docs/links",
      "docs/townhalls",
      "docs/townhall-history",
      "docs/CODE_OF_CONDUCT",
      "docs/rfc",
      {
        RFCs: list_ids_in_directory("docs/rfc/active"),
      },
    ],
  },
};
