// Discord tests cover setup surface plugin behavior.
import { installChannelDmPolicyContractSuite } from "openclaw/plugin-sdk/channel-test-helpers";
import type { OpenClawConfig } from "openclaw/plugin-sdk/config-contracts";
import { describe, expect, it } from "vitest";
import { createDiscordSetupWizardBase } from "./setup-core.js";

const discordSetupWizard = createDiscordSetupWizardBase({
  promptAllowFrom: async ({ cfg }) => cfg,
  resolveAllowFromEntries: async ({ entries }) =>
    entries.map((entry) => ({
      input: entry,
      resolved: false,
      id: null,
    })),
  resolveGroupAllowlist: async ({ entries }) =>
    entries.map((entry) => ({
      input: entry,
      resolved: false,
    })),
});

describe("discordSetupWizard.dmPolicy", () => {
  installChannelDmPolicyContractSuite({
    dmPolicy: discordSetupWizard.dmPolicy!,
    cases: [
      {
        name: "Discord named accounts",
        channel: "discord",
        accountId: "alerts",
        accountConfig: { token: "discord-token" },
        inheritedAllowFrom: ["123"],
      },
    ],
  });
});

describe("discordSetupWizard.status", () => {
  it("uses configured defaultAccount for omitted setup configured state", async () => {
    const configured = await discordSetupWizard.status.resolveConfigured({
      cfg: {
        channels: {
          discord: {
            defaultAccount: "work",
            token: "discord-root-token",
            accounts: {
              alerts: {
                token: "discord-alerts-token",
              },
              work: {
                token: "",
              },
            },
          },
        },
      } as OpenClawConfig,
    });

    expect(configured).toBe(false);
  });
});

describe("discordSetupWizard.groupAccess", () => {
  it("writes resolved Discord channel rows to their selected guild and channel", () => {
    const next = discordSetupWizard.groupAccess?.applyAllowlist?.({
      cfg: {
        channels: {
          discord: {
            guilds: {
              existing: {
                channels: {
                  keep: { enabled: true },
                },
              },
            },
          },
        },
      } as OpenClawConfig,
      accountId: "default",
      resolved: [
        {
          input: "OpenClaw/#triage",
          resolved: true,
          guildId: "guild-1",
          channelId: "channel-1",
        },
        {
          input: "missing",
          resolved: false,
        },
      ],
    });

    expect(next?.channels?.discord?.guilds?.["guild-1"]?.channels?.["channel-1"]).toEqual({
      enabled: true,
    });
    expect(next?.channels?.discord?.guilds?.["*"]).toBeUndefined();
    expect(next?.channels?.discord?.guilds?.existing?.channels?.keep).toEqual({
      enabled: true,
    });
  });
});
