import { describe, it, expect } from "vitest";
import { extractPrompt } from "../../src/feishu/trigger.js";
import type { MessageReceiveEvent } from "../../src/feishu/client.js";

const bot = { key: "@_user_1", id: { open_id: "ou_bot" }, name: "Bot" };

function msg(text: string, mentions: typeof bot[] | undefined = [bot]): MessageReceiveEvent["message"] {
  return {
    message_id: "m",
    chat_id: "c",
    chat_type: "group",
    message_type: "text",
    content: JSON.stringify({ text }),
    mentions,
  };
}

describe("extractPrompt (@bot mention parsing)", () => {
  it("extracts the prompt after @bot", () => {
    expect(extractPrompt(msg("@_user_1 帮我写教案"))).toBe("帮我写教案");
  });

  it("strips multiple mentions", () => {
    const other = { key: "@_user_2", id: { open_id: "ou_other" }, name: "Other" };
    expect(extractPrompt(msg("@_user_1 @_user_2 检查例题2", [bot, other]))).toBe("检查例题2");
  });

  it("returns null when only @bot with no prompt", () => {
    expect(extractPrompt(msg("@_user_1"))).toBeNull();
  });

  it("returns null when @bot followed by whitespace only", () => {
    expect(extractPrompt(msg("@_user_1   "))).toBeNull();
  });
  it("returns null when no mentions", () => {
    const m: MessageReceiveEvent["message"] = {
      message_id: "m", chat_id: "c", chat_type: "group",
      message_type: "text",
      content: JSON.stringify({ text: "hello" }),
      mentions: undefined,
    };
    expect(extractPrompt(m)).toBeNull();
  });

  it("returns null for non-text message_type (content still parseable)", () => {
    const m = msg("{}", [bot]);
    // message_type check is the caller's job; extractPrompt only parses content.
    // But with empty text it returns null.
    expect(extractPrompt({ ...m, content: JSON.stringify({ text: "" }) })).toBeNull();
  });

  it("returns null when content is not valid JSON", () => {
    const m: MessageReceiveEvent["message"] = {
      message_id: "m",
      chat_id: "c",
      chat_type: "group",
      message_type: "text",
      content: "not json",
      mentions: [bot],
    };
    expect(extractPrompt(m)).toBeNull();
  });

  it("returns null when JSON has no text field", () => {
    const m: MessageReceiveEvent["message"] = {
      message_id: "m",
      chat_id: "c",
      chat_type: "group",
      message_type: "text",
      content: JSON.stringify({ foo: "bar" }),
      mentions: [bot],
    };
    expect(extractPrompt(m)).toBeNull();
  });
});
