/**
 * Import Validation Tests
 *
 * These tests validate that the SDK can be imported correctly across
 * different module systems (ESM and CJS).
 */

import { execa, type Options as ExecaOptions } from "execa";
import { dirname, resolve } from "path";
import { fileURLToPath } from "url";
import { describe, expect, it } from "vitest";

const __dirname = dirname(fileURLToPath(import.meta.url));
const fixturesDir = resolve(__dirname, "../fixtures");

// Find the SDK package in the monorepo
const _sdkDir = resolve(__dirname, "../../../../packages/trigger-sdk");

// Common execa options
const execaOpts: ExecaOptions = {
  env: {
    ...process.env,
    // Ensure Node.js can resolve workspace packages
    NODE_PATH: resolve(__dirname, "../../../../node_modules"),
  },
  timeout: 30_000,
};

describe("ESM Import Tests", () => {
  it("should import SDK using ESM syntax", async () => {
    const result = await execa("node", ["test.mjs"], {
      ...execaOpts,
      cwd: resolve(fixturesDir, "esm-import"),
    });

    expect(result.stdout).toContain("SUCCESS");
    expect(result.exitCode).toBe(0);
  });

  it("should validate superjson serialization in ESM", async () => {
    const result = await execa("node", ["superjson-test.mjs"], {
      ...execaOpts,
      cwd: resolve(fixturesDir, "esm-import"),
    });

    expect(result.stdout).toContain("SUCCESS");
    expect(result.exitCode).toBe(0);
  });
});

describe("CJS Require Tests", () => {
  it("should require SDK using CommonJS syntax", async () => {
    const result = await execa("node", ["test.cjs"], {
      ...execaOpts,
      cwd: resolve(fixturesDir, "cjs-require"),
    });

    expect(result.stdout).toContain("SUCCESS");
    expect(result.exitCode).toBe(0);
  });

  it("should work with --experimental-require-module flag on older Node", async () => {
    // This flag is needed for Node < 22.12.0 to require ESM modules
    // On newer Node.js, it's a no-op
    const result = await execa("node", ["--experimental-require-module", "test.cjs"], {
      ...execaOpts,
      cwd: resolve(fixturesDir, "cjs-require"),
    });

    expect(result.stdout).toContain("SUCCESS");
    expect(result.exitCode).toBe(0);
  });
});

describe("TypeScript Compilation Tests", () => {
  it("should typecheck SDK imports successfully", async () => {
    const result = await execa("npx", ["tsc", "--noEmit"], {
      ...execaOpts,
      cwd: resolve(fixturesDir, "typescript"),
    });

    expect(result.exitCode).toBe(0);
  });
});
