// Pixverse tests cover index plugin behavior.
import { capturePluginRegistration } from "openclaw/plugin-sdk/plugin-test-runtime";
import { describe, expect, it, vi } from "vitest";
import {
  PIXVERSE_BASE_URL_BY_REGION,
  PIXVERSE_DEFAULT_VIDEO_MODEL_REF,
  PIXVERSE_PROVIDER_ID,
} from "./constants.js";
import plugin from "./index.js";
import { applyPixVerseConfig, applyPixVerseProviderConfig } from "./onboard.js";

function registerPixVerseProvider() {
  const captured = capturePluginRegistration(plugin);
  expect(captured.videoGenerationProviders.map((provider) => provider.id)).toEqual([
    PIXVERSE_PROVIDER_ID,
  ]);
  const provider = captured.providers[0];
  if (!provider) {
    throw new Error("expected PixVerse setup provider");
  }
  expect(provider.id).toBe(PIXVERSE_PROVIDER_ID);
  return provider;
}

function createRuntimeContext(region: "international" | "cn") {
  const select = vi.fn(async (params: { message: string }) => {
    expect(params.message).toBe("Select PixVerse API region");
    return region;
  });
  const ctx = {
    config: {
      models: {
        providers: {
          pixverse: {
            baseUrl: "https://proxy.example/openapi/v2",
            models: [],
            params: { quality: "720p" },
          },
        },
      },
    },
    env: {},
    prompter: {
      intro: vi.fn(),
      outro: vi.fn(),
      note: vi.fn(),
      select,
      multiselect: vi.fn(),
      text: vi.fn(async () => "pixverse-test-key"),
      confirm: vi.fn(),
      progress: vi.fn(() => ({
        update: vi.fn(),
        stop: vi.fn(),
      })),
    },
    runtime: {
      error: vi.fn(),
      exit: vi.fn(),
      log: vi.fn(),
    },
    secretInputMode: "plaintext",
    isRemote: false,
    openUrl: vi.fn(),
    oauth: {
      createVpsAwareHandlers: vi.fn(),
    },
  } as never;
  return { ctx, select };
}

describe("pixverse plugin", () => {
  it("registers provider auth for the setup wizard", () => {
    const provider = registerPixVerseProvider();
    const auth = provider?.auth?.[0];

    expect(provider).toMatchObject({
      id: PIXVERSE_PROVIDER_ID,
      label: "PixVerse",
      docsPath: "/providers/pixverse",
      envVars: ["PIXVERSE_API_KEY"],
    });
    expect(auth).toMatchObject({
      id: "api-key",
      label: "PixVerse API key",
      kind: "api_key",
      wizard: {
        choiceId: "pixverse-api-key",
        choiceLabel: "PixVerse API key",
        choiceHint: "Prompts for International or CN endpoint",
        groupId: "pixverse",
        groupLabel: "PixVerse",
        groupHint: "Video generation",
        onboardingScopes: ["image-generation"],
      },
    });
  });

  it("prompts for the PixVerse region and writes provider config", async () => {
    const provider = registerPixVerseProvider();
    const auth = provider?.auth?.[0];
    if (!auth) {
      throw new Error("expected PixVerse auth method");
    }

    const { ctx, select } = createRuntimeContext("cn");
    const result = await auth.run(ctx);
    const regionSelect = select.mock.calls[0]?.[0];

    expect(regionSelect).toEqual({
      message: "Select PixVerse API region",
      initialValue: "international",
      options: [
        {
          value: "international",
          label: "International",
          hint: PIXVERSE_BASE_URL_BY_REGION.international,
        },
        {
          value: "cn",
          label: "CN",
          hint: PIXVERSE_BASE_URL_BY_REGION.cn,
        },
      ],
    });
    expect(result.profiles).toEqual([
      {
        profileId: "pixverse:default",
        credential: {
          type: "api_key",
          provider: PIXVERSE_PROVIDER_ID,
          key: "pixverse-test-key",
        },
      },
    ]);
    expect(result.configPatch?.models?.providers?.pixverse).toEqual({
      baseUrl: PIXVERSE_BASE_URL_BY_REGION.cn,
      models: [],
      params: { quality: "720p" },
      region: "cn",
    });
    expect(result.defaultModel).toBeUndefined();
    expect(result.configPatch?.agents?.defaults?.videoGenerationModel).toEqual({
      primary: PIXVERSE_DEFAULT_VIDEO_MODEL_REF,
    });
    expect(result.notes).toEqual([`PixVerse endpoint: CN (${PIXVERSE_BASE_URL_BY_REGION.cn})`]);
  });

  it("only resets custom baseUrl when a region is explicitly selected", () => {
    const config = {
      models: {
        providers: {
          pixverse: {
            baseUrl: "https://proxy.example/openapi/v2",
            models: [],
            params: { quality: "720p" },
          },
        },
      },
    };

    expect(
      applyPixVerseProviderConfig(config, "international").models?.providers?.pixverse,
    ).toEqual({
      baseUrl: "https://proxy.example/openapi/v2",
      models: [],
      params: { quality: "720p" },
      region: "international",
    });
    expect(
      applyPixVerseProviderConfig(config, "cn", { resetBaseUrl: true }).models?.providers?.pixverse,
    ).toEqual({
      baseUrl: PIXVERSE_BASE_URL_BY_REGION.cn,
      models: [],
      params: { quality: "720p" },
      region: "cn",
    });
  });

  it("preserves an existing video generation default", () => {
    const result = applyPixVerseConfig(
      {
        agents: {
          defaults: {
            videoGenerationModel: {
              primary: "openai/sora-2",
            },
          },
        },
      },
      "international",
    );

    expect(result.agents?.defaults?.videoGenerationModel).toEqual({
      primary: "openai/sora-2",
    });
  });
});
