import type { Server } from "node:http";
import { beforeEach, describe, expect, it, vi } from "vitest";

const loadActivatedBundledPluginPublicSurfaceModuleSync = vi.hoisted(() => vi.fn());

vi.mock("./facade-runtime.js", () => ({
  loadActivatedBundledPluginPublicSurfaceModuleSync,
}));

describe("browser bridge facade", () => {
  beforeEach(() => {
    loadActivatedBundledPluginPublicSurfaceModuleSync.mockReset();
  });

  it("stays cold until a bridge function is called", async () => {
    await import("./browser-bridge.js");

    expect(loadActivatedBundledPluginPublicSurfaceModuleSync).not.toHaveBeenCalled();
  });

  it("delegates bridge lifecycle calls through the activated runtime facade", async () => {
    const bridge = {
      server: {} as Server,
      port: 19001,
      baseUrl: "http://127.0.0.1:19001",
      state: {
        resolved: {
          enabled: true,
        },
      },
    };
    const startBrowserBridgeServer = vi.fn(async () => bridge);
    const stopBrowserBridgeServer = vi.fn(async () => undefined);
    loadActivatedBundledPluginPublicSurfaceModuleSync.mockReturnValue({
      startBrowserBridgeServer,
      stopBrowserBridgeServer,
    });

    const facade = await import("./browser-bridge.js");

    await expect(
      facade.startBrowserBridgeServer({
        resolved: bridge.state.resolved as never,
        authToken: "token",
      }),
    ).resolves.toEqual(bridge);
    await expect(facade.stopBrowserBridgeServer(bridge.server)).resolves.toBeUndefined();
    expect(loadActivatedBundledPluginPublicSurfaceModuleSync).toHaveBeenCalledWith({
      dirName: "browser",
      artifactBasename: "runtime-api.js",
    });
    expect(startBrowserBridgeServer).toHaveBeenCalledWith({
      resolved: bridge.state.resolved,
      authToken: "token",
    });
    expect(stopBrowserBridgeServer).toHaveBeenCalledWith(bridge.server);
  });
});
