import { readFileSync } from "node:fs";
import { resolve } from "node:path";
import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/plugin-test-runtime";
import { describe, expect, it } from "vitest";
import {
  VOLCENGINE_UNSUPPORTED_TOOL_SCHEMA_KEYWORDS,
  resolveVolcengineToolSchemaCompatPatch,
} from "./api.js";
import plugin from "./index.js";
import { DOUBAO_CODING_MODEL_CATALOG, DOUBAO_MODEL_CATALOG } from "./models.js";

describe("volcengine plugin", () => {
  it("augments the catalog with bundled standard and plan models", async () => {
    const provider = await registerSingleProviderPlugin(plugin);
    const entries = await provider.augmentModelCatalog?.({
      env: process.env,
      entries: [],
    } as never);

    expect(entries).toEqual([
      ...DOUBAO_MODEL_CATALOG.map((entry) => ({
        provider: "volcengine",
        id: entry.id,
        name: entry.name,
        reasoning: entry.reasoning,
        input: [...entry.input],
        contextWindow: entry.contextWindow,
      })),
      ...DOUBAO_CODING_MODEL_CATALOG.map((entry) => ({
        provider: "volcengine-plan",
        id: entry.id,
        name: entry.name,
        reasoning: entry.reasoning,
        input: [...entry.input],
        contextWindow: entry.contextWindow,
      })),
    ]);
  });

  it("declares its coding provider auth alias in the manifest", () => {
    const pluginJson = JSON.parse(
      readFileSync(resolve(import.meta.dirname, "openclaw.plugin.json"), "utf-8"),
    );

    expect(pluginJson.providerAuthAliases).toEqual({
      "volcengine-plan": "volcengine",
    });
  });

  it("declares OpenAI-compatible streaming usage support in the manifest", () => {
    const pluginJson = JSON.parse(
      readFileSync(resolve(import.meta.dirname, "openclaw.plugin.json"), "utf-8"),
    );

    expect(pluginJson.providerRequest?.providers).toMatchObject({
      volcengine: {
        openAICompletions: { supportsStreamingUsage: true },
      },
      "volcengine-plan": {
        openAICompletions: { supportsStreamingUsage: true },
      },
    });
  });

  it("marks direct and coding models with tool schema keyword compat", async () => {
    const provider = await registerSingleProviderPlugin(plugin);

    expect(provider.hookAliases).toContain("volcengine-plan");
    expect(resolveVolcengineToolSchemaCompatPatch()).toEqual({
      unsupportedToolSchemaKeywords: [...VOLCENGINE_UNSUPPORTED_TOOL_SCHEMA_KEYWORDS],
    });

    const normalized = provider.normalizeResolvedModel?.({
      provider: "volcengine-plan",
      modelId: "kimi-k2.5",
      model: {
        id: "kimi-k2.5",
        provider: "volcengine-plan",
        api: "openai-completions",
        compat: { unsupportedToolSchemaKeywords: ["not"] },
      },
    } as never);

    const normalizedCompat = normalized?.compat as
      | { unsupportedToolSchemaKeywords?: string[] }
      | undefined;
    expect(normalizedCompat?.unsupportedToolSchemaKeywords).toEqual([
      "not",
      ...VOLCENGINE_UNSUPPORTED_TOOL_SCHEMA_KEYWORDS,
    ]);
  });
});
