import { module, test } from "qunit";
import AiPersona from "discourse/plugins/discourse-ai/discourse/admin/models/ai-persona";

module("Discourse AI | Unit | Model | ai-persona", function () {
  test("init properties", function (assert) {
    const properties = {
      tools: [
        ["ToolName", { option1: "value1", option2: "value2" }],
        "ToolName2",
        "ToolName3",
      ],
    };

    const aiPersona = AiPersona.create(properties);

    assert.deepEqual(aiPersona.tools, ["ToolName", "ToolName2", "ToolName3"]);
    assert.equal(
      aiPersona.getToolOption("ToolName", "option1").value,
      "value1"
    );
    assert.equal(
      aiPersona.getToolOption("ToolName", "option2").value,
      "value2"
    );
  });

  test("update properties", function (assert) {
    const properties = {
      id: 1,
      name: "Test",
      tools: ["ToolName"],
      allowed_group_ids: [12],
      system: false,
      enabled: true,
      system_prompt: "System Prompt",
      priority: false,
      description: "Description",
      top_p: 0.8,
      temperature: 0.7,
      default_llm: "Default LLM",
      force_default_llm: false,
      user: null,
      user_id: null,
      max_context_posts: 5,
      vision_enabled: true,
      vision_max_pixels: 100,
      rag_uploads: [],
      rag_chunk_tokens: 374,
      rag_chunk_overlap_tokens: 10,
      rag_conversation_chunks: 10,
      question_consolidator_llm: "Question Consolidator LLM",
      allow_chat: false,
      tool_details: true,
      forced_tool_count: -1,
      allow_personal_messages: true,
      allow_topic_mentions: true,
      allow_chat_channel_mentions: true,
      allow_chat_direct_messages: true,
    };

    const aiPersona = AiPersona.create({ ...properties });

    aiPersona.getToolOption("ToolName", "option1").value = "value1";

    const updatedProperties = aiPersona.updateProperties();

    // perform remapping for save
    properties.tools = [["ToolName", { option1: "value1" }, false]];

    assert.deepEqual(updatedProperties, properties);
  });

  test("create properties", function (assert) {
    const properties = {
      id: 1,
      name: "Test",
      tools: ["ToolName"],
      allowed_group_ids: [12],
      system: false,
      enabled: true,
      system_prompt: "System Prompt",
      priority: false,
      description: "Description",
      top_p: 0.8,
      temperature: 0.7,
      user: null,
      user_id: null,
      default_llm: "Default LLM",
      max_context_posts: 5,
      vision_enabled: true,
      vision_max_pixels: 100,
      rag_uploads: [],
      rag_chunk_tokens: 374,
      rag_chunk_overlap_tokens: 10,
      rag_conversation_chunks: 10,
      question_consolidator_llm: "Question Consolidator LLM",
      allow_chat: false,
      tool_details: true,
      forced_tool_count: -1,
      allow_personal_messages: true,
      allow_topic_mentions: true,
      allow_chat_channel_mentions: true,
      allow_chat_direct_messages: true,
      force_default_llm: false,
    };

    const aiPersona = AiPersona.create({ ...properties });

    aiPersona.getToolOption("ToolName", "option1").value = "value1";

    const createdProperties = aiPersona.createProperties();

    properties.tools = [["ToolName", { option1: "value1" }, false]];

    assert.deepEqual(createdProperties, properties);
  });

  test("working copy", function (assert) {
    const aiPersona = AiPersona.create({
      name: "Test",
      tools: ["ToolName"],
    });

    aiPersona.getToolOption("ToolName", "option1").value = "value1";

    const workingCopy = aiPersona.workingCopy();

    assert.equal(workingCopy.name, "Test");
    assert.equal(
      workingCopy.getToolOption("ToolName", "option1").value,
      "value1"
    );
    assert.deepEqual(workingCopy.tools, ["ToolName"]);
  });
});