import fs from "node:fs/promises";
import os from "node:os";
import path from "node:path";

import { beforeEach, describe, expect, it, vi } from "vitest";

beforeEach(() => {
  vi.resetModules();
});

describe("resolvePythonExecutablePath", () => {
  it("resolves a working python path and caches the result", async () => {
    const tmp = await fs.mkdtemp(path.join(os.tmpdir(), "clawdbot-python-"));
    const originalPath = process.env.PATH;
    try {
      const realPython = path.join(tmp, "python-real");
      await fs.writeFile(realPython, "#!/bin/sh\nexit 0\n", "utf-8");
      await fs.chmod(realPython, 0o755);

      const shimDir = path.join(tmp, "shims");
      await fs.mkdir(shimDir, { recursive: true });
      const shim = path.join(shimDir, "python3");
      await fs.writeFile(
        shim,
        `#!/bin/sh\nif [ "$1" = "-c" ]; then\n  echo "${realPython}"\n  exit 0\nfi\nexit 1\n`,
        "utf-8",
      );
      await fs.chmod(shim, 0o755);

      process.env.PATH = `${shimDir}${path.delimiter}/usr/bin`;

      const { resolvePythonExecutablePath } = await import(
        "./gmail-setup-utils.js"
      );

      const resolved = await resolvePythonExecutablePath();
      expect(resolved).toBe(realPython);

      process.env.PATH = "/bin";
      const cached = await resolvePythonExecutablePath();
      expect(cached).toBe(realPython);
    } finally {
      process.env.PATH = originalPath;
      await fs.rm(tmp, { recursive: true, force: true });
    }
  }, 60_000);
});
