// Mattermost tests cover config schema plugin behavior.
import { describe, expect, it } from "vitest";
import { MattermostConfigSchema } from "./config-schema-core.js";

describe("MattermostConfigSchema", () => {
  it("accepts SecretRef botToken at top-level", () => {
    const result = MattermostConfigSchema.safeParse({
      botToken: { source: "env", provider: "default", id: "MATTERMOST_BOT_TOKEN" },
      baseUrl: "https://chat.example.com",
    });
    expect(result.success).toBe(true);
  });

  it("accepts SecretRef botToken on account", () => {
    const result = MattermostConfigSchema.safeParse({
      accounts: {
        main: {
          botToken: { source: "env", provider: "default", id: "MATTERMOST_BOT_TOKEN_MAIN" },
          baseUrl: "https://chat.example.com",
        },
      },
    });
    expect(result.success).toBe(true);
  });

  it("accepts replyToMode", () => {
    const result = MattermostConfigSchema.safeParse({
      replyToMode: "all",
    });
    expect(result.success).toBe(true);
  });

  it('rejects dmPolicy="open" without wildcard allowFrom', () => {
    const result = MattermostConfigSchema.safeParse({
      dmPolicy: "open",
    });
    expect(result.success).toBe(false);
  });

  it('accepts dmPolicy="open" with wildcard allowFrom', () => {
    const result = MattermostConfigSchema.safeParse({
      dmPolicy: "open",
      allowFrom: ["*"],
    });
    expect(result.success).toBe(true);
  });

  it("accepts documented streaming modes and progress config", () => {
    const result = MattermostConfigSchema.safeParse({
      streaming: {
        mode: "progress",
        progress: {
          label: "Shelling",
          maxLines: 4,
          toolProgress: false,
        },
      },
      accounts: {
        quiet: {
          streaming: "off",
        },
      },
    });
    expect(result.success).toBe(true);
  });

  it("accepts groups with requireMention", () => {
    const result = MattermostConfigSchema.safeParse({
      groups: {
        "*": { requireMention: true },
        "channel-123": { requireMention: false },
      },
    });
    expect(result.success).toBe(true);
  });

  it("accepts groups on account", () => {
    const result = MattermostConfigSchema.safeParse({
      accounts: {
        main: {
          baseUrl: "https://chat.example.com",
          groups: {
            "*": { requireMention: true },
          },
        },
      },
    });
    expect(result.success).toBe(true);
  });

  it("rejects unknown properties inside groups entry", () => {
    const result = MattermostConfigSchema.safeParse({
      groups: {
        "*": { requireMention: true, unknownProp: "bad" },
      },
    });
    expect(result.success).toBe(false);
  });

  it("rejects unsupported direct-message reply threading config", () => {
    const result = MattermostConfigSchema.safeParse({
      dm: {
        replyToMode: "all",
      },
    });
    expect(result.success).toBe(false);
  });

  it("rejects unsupported per-chat-type reply threading config", () => {
    const result = MattermostConfigSchema.safeParse({
      replyToModeByChatType: {
        direct: "all",
      },
    });
    expect(result.success).toBe(false);
  });
});
