import * as fs from "node:fs/promises";
import * as path from "node:path";
import { createManifest } from "./cleanup";
import { findFiles, loadJson } from "@embeddable.com/sdk-utils";
import { ResolvedEmbeddableConfig } from "./defineConfig";
const ctx = {
  client: {
    tmpDir: "tmpDir",
    stencilBuild: "stencilBuild",
    buildDir: "buildDir",
  },
  buildTime: [80, 525000],
};

vi.mock("node:fs/promises", () => ({
  writeFile: vi.fn(),
  readFile: vi.fn(),
  rename: vi.fn(),
}));

vi.mock("@embeddable.com/sdk-utils", () => ({
  findFiles: vi.fn(),
  loadJson: vi.fn(),
}));

vi.mock("node:path", async () => {
  const actual = await vi.importActual("node:path");
  return {
    ...actual,
    resolve: vi.fn(),
    basename: vi.fn(),
    join: vi.fn(),
  };
});

describe("cleanup", () => {
  describe("createManifest", () => {
    beforeEach(() => {
      vi.mocked(fs.writeFile).mockImplementation(async () => undefined);
      vi.mocked(fs.rename).mockImplementation(async () => undefined);
      vi.mocked(findFiles).mockResolvedValue([["", ""]]);
      vi.mocked(loadJson).mockResolvedValue({
        test: "test_value",
      });
      vi.mocked(path.basename).mockReturnValue("basename");
      vi.mocked(path.join).mockImplementation((...args) => args.join("/"));

      Object.defineProperties(process, {
        platform: {
          value: "darwin",
        },
        version: {
          value: "v18.20.2",
        },
        env: {
          value: {
            npm_config_user_agent: "npm/10.7.0",
          },
        },
      });
    });
    it("should create manifest", async () => {
      await createManifest({
        ctx: ctx as unknown as ResolvedEmbeddableConfig,
        typesFileName: "typesFileName",
        metaFileName: "metaFileName",
        editorsMetaFileName: "editorsMetaFileName",
        stencilWrapperFileName: "stencilWrapperFileName",
      });

      expect(fs.writeFile).toHaveBeenCalledWith(
        "tmpDir/embeddable-manifest.json",
        JSON.stringify({
          entryFiles: {
            "embeddable-types.js": "typesFileName",
            "embeddable-components-meta.js": "metaFileName",
            "embeddable-editors-meta.js": "editorsMetaFileName",
            "embeddable-wrapper.esm.js": "stencilWrapperFileName",
          },
          metadata: {
            nodeVersion: "v18.20.2",
            platform: "darwin",
            sdkVersions: {},
            packageManager: "npm",
            packageManagerVersion: "10.7.0",
            globalHooks: {
              test: "test_value",
            },
            metrics: {
              buildTime: "PT1M20.001S",
            },
            origin: "push",
          },
        }),
      );
    });
  });
});
