import { describe, expect, it, vi } from "vitest";
import type { OpenClawPluginApi } from "./runtime-api.js";

const registerFeishuDocToolsMock = vi.hoisted(() => vi.fn());
const registerFeishuChatToolsMock = vi.hoisted(() => vi.fn());
const registerFeishuWikiToolsMock = vi.hoisted(() => vi.fn());
const registerFeishuDriveToolsMock = vi.hoisted(() => vi.fn());
const registerFeishuPermToolsMock = vi.hoisted(() => vi.fn());
const registerFeishuBitableToolsMock = vi.hoisted(() => vi.fn());
const feishuPluginMock = vi.hoisted(() => ({ id: "feishu-test-plugin" }));
const setFeishuRuntimeMock = vi.hoisted(() => vi.fn());
const registerFeishuSubagentHooksMock = vi.hoisted(() => vi.fn());

vi.mock("./src/channel.js", () => ({
  feishuPlugin: feishuPluginMock,
}));

vi.mock("./src/docx.js", () => ({
  registerFeishuDocTools: registerFeishuDocToolsMock,
}));

vi.mock("./src/chat.js", () => ({
  registerFeishuChatTools: registerFeishuChatToolsMock,
}));

vi.mock("./src/wiki.js", () => ({
  registerFeishuWikiTools: registerFeishuWikiToolsMock,
}));

vi.mock("./src/drive.js", () => ({
  registerFeishuDriveTools: registerFeishuDriveToolsMock,
}));

vi.mock("./src/perm.js", () => ({
  registerFeishuPermTools: registerFeishuPermToolsMock,
}));

vi.mock("./src/bitable.js", () => ({
  registerFeishuBitableTools: registerFeishuBitableToolsMock,
}));

vi.mock("./src/runtime.js", () => ({
  setFeishuRuntime: setFeishuRuntimeMock,
}));

vi.mock("./src/subagent-hooks.js", () => ({
  registerFeishuSubagentHooks: registerFeishuSubagentHooksMock,
}));

describe("feishu plugin register", () => {
  it("registers the Feishu channel, tools, and subagent hooks", async () => {
    const { default: plugin } = await import("./index.js");
    const registerChannel = vi.fn();
    const api = {
      runtime: { log: vi.fn() },
      registerChannel,
      on: vi.fn(),
      config: {},
      registrationMode: "full",
    } as unknown as OpenClawPluginApi;

    plugin.register(api);

    expect(setFeishuRuntimeMock).toHaveBeenCalledWith(api.runtime);
    expect(registerChannel).toHaveBeenCalledTimes(1);
    expect(registerChannel).toHaveBeenCalledWith({ plugin: feishuPluginMock });
    expect(registerFeishuSubagentHooksMock).toHaveBeenCalledWith(api);
    expect(registerFeishuDocToolsMock).toHaveBeenCalledWith(api);
    expect(registerFeishuChatToolsMock).toHaveBeenCalledWith(api);
    expect(registerFeishuWikiToolsMock).toHaveBeenCalledWith(api);
    expect(registerFeishuDriveToolsMock).toHaveBeenCalledWith(api);
    expect(registerFeishuPermToolsMock).toHaveBeenCalledWith(api);
    expect(registerFeishuBitableToolsMock).toHaveBeenCalledWith(api);
  });
});
