# frozen_string_literal: true

require_relative "dialect_context"

RSpec.describe DiscourseAi::Completions::Dialects::OllamaTools do
  describe "#translated_tools" do
    it "translates a tool from our generic format to the Ollama format" do
      tools = [
        {
          name: "github_file_content",
          description: "Retrieves the content of specified GitHub files",
          parameters: [
            {
              name: "repo_name",
              description: "The name of the GitHub repository (e.g., 'discourse/discourse')",
              type: "string",
              required: true,
            },
            {
              name: "file_paths",
              description: "The paths of the files to retrieve within the repository",
              type: "array",
              item_type: "string",
              required: true,
            },
            {
              name: "branch",
              description: "The branch or commit SHA to retrieve the files from (default: 'main')",
              type: "string",
              required: false,
            },
          ],
        },
      ]

      ollama_tools = described_class.new(tools)

      translated_tools = ollama_tools.translated_tools

      expect(translated_tools).to eq(
        [
          {
            type: "function",
            function: {
              name: "github_file_content",
              description: "Retrieves the content of specified GitHub files",
              parameters: {
                type: "object",
                properties: {
                  "repo_name" => {
                    description: "The name of the GitHub repository (e.g., 'discourse/discourse')",
                    type: "string",
                  },
                  "file_paths" => {
                    description: "The paths of the files to retrieve within the repository",
                    type: "array",
                  },
                  "branch" => {
                    description:
                      "The branch or commit SHA to retrieve the files from (default: 'main')",
                    type: "string",
                  },
                },
                required: %w[repo_name file_paths],
              },
            },
          },
        ],
      )
    end
  end

  describe "#from_raw_tool_call" do
    it "converts a raw tool call to the Ollama tool format" do
      raw_message = {
        content: '{"repo_name":"discourse/discourse","file_paths":["README.md"],"branch":"main"}',
      }

      ollama_tools = described_class.new([])
      tool_call = ollama_tools.from_raw_tool_call(raw_message)

      expect(tool_call).to eq(
        {
          role: "assistant",
          content: nil,
          tool_calls: [
            {
              type: "function",
              function: {
                repo_name: "discourse/discourse",
                file_paths: ["README.md"],
                branch: "main",
                name: nil,
              },
            },
          ],
        },
      )
    end
  end

  describe "#from_raw_tool" do
    it "converts a raw tool to the Ollama tool format" do
      raw_message = { content: "Hello, world!", name: "github_file_content" }

      ollama_tools = described_class.new([])
      tool = ollama_tools.from_raw_tool(raw_message)

      expect(tool).to eq({ role: "tool", content: "Hello, world!", name: "github_file_content" })
    end
  end
end
