import { UserMessage } from "../llm-invoker";
import * as cut from "./bedrock-llm-client-adapter";

jest.mock("../clients/bedrock", () => ({
  invokeModel: jest.fn().mockResolvedValue({
    body: Buffer.from(
      JSON.stringify({
        output: {message: { role: "assistant", content: [{ text: "Mocked response" }] }},
        usage: {
          promptTokens: 10,
          completionTokens: 5,
          totalTokens: 15,
        },
        raw: {},
      }),
      "utf-8"
    ),
  }),
}));

describe("Bedrock LLM Client Adapter", () => {
  it("should be implemented", () => {
    const adapter = new cut.BedrockLLMClientAdapter();
    expect(adapter).toBeDefined();
    expect(adapter.invoke).toBeDefined();
    expect(typeof adapter.invoke).toBe("function");
  });

  it("should invoke model with messages and memories", async () => {
    const adapter = new cut.BedrockLLMClientAdapter();
    const messages: UserMessage[] = [
      { role: "user", content: "Hello, how are you?" },
      { role: "assistant", content: "I'm fine, thank you!" },
    ];
    const memories = [{ content: "User prefers short responses." }];

    const response = await adapter.invoke(messages, memories);

    expect(response).toBeDefined();
    expect(response.message).toBeDefined();
    expect(response.usage).toBeDefined();
  });

  it("should return mocked response", async () => {
    const adapter = new cut.BedrockLLMClientAdapter();
    const messages: UserMessage[] = [
      { role: "user", content: "What is the weather like?" },
    ];
    const memories = [{ content: "User likes sunny weather." }];
    const response = await adapter.invoke(messages, memories);

    expect(response.message.role).toBe("assistant");
    expect(response.message.content).toBe("Mocked response");
    expect(response.usage.promptTokens).toBe(10);
    expect(response.usage.completionTokens).toBe(5);
    expect(response.usage.totalTokens).toBe(15);
  });
});
