// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

// @ts-check

import { readFileSync, writeFileSync } from "node:fs";
import { dirname, join } from "node:path";
import { fileURLToPath } from "node:url";

import qSharpSampleList from "../../../samples/samples.mjs";
import openQasmSampleList from "../../../samples/OpenQASM/samples.mjs";

const thisDir = dirname(fileURLToPath(import.meta.url));
const qSharpSampleDir = join(thisDir, "..", "..", "..", "samples");
const openQasmSampleDir = join(
  thisDir,
  "..",
  "..",
  "..",
  "samples",
  "OpenQASM",
);

const tsDir = join(thisDir, "src");
const qSharpGeneratedTsPath = join(tsDir, "samples.generated.ts");
const openQasmGeneratedTsPath = join(tsDir, "openqasm-samples.generated.ts");

embedSampleContentsInTsFile(
  qSharpSampleList,
  qSharpSampleDir,
  qSharpGeneratedTsPath,
);
embedSampleContentsInTsFile(
  openQasmSampleList,
  openQasmSampleDir,
  openQasmGeneratedTsPath,
);

/**
 * @param {any[]} sampleList
 * @param {string} sampleDir
 * @param {import("fs").PathOrFileDescriptor} generatedTsFileName
 */
function embedSampleContentsInTsFile(
  sampleList,
  sampleDir,
  generatedTsFileName,
) {
  const result = sampleList.map((sample) => {
    const samplePath = join(sampleDir, sample.file);
    const sampleText = readFileSync(samplePath, "utf8");
    return {
      title: sample.title,
      shots: sample.shots,
      code: sampleText,
      omitFromTests: sample.omitFromTests,
    };
  });

  writeFileSync(
    generatedTsFileName,
    `export default ${JSON.stringify(result, undefined, 2)}`,
    "utf-8",
  );
}
