# frozen_string_literal: true
require "rails_helper"

module DiscourseAi::Inference
  describe FunctionList do
    let :function_list do
      function =
        Function.new(name: "get_weather", description: "Get the weather in a city (default to c)")

      function.add_parameter(
        name: "location",
        type: "string",
        description: "the city name",
        required: true,
      )

      function.add_parameter(
        name: "unit",
        type: "string",
        description: "the unit of measurement celcius c or fahrenheit f",
        enum: %w[c f],
        required: false,
      )

      list = FunctionList.new
      list << function
      list
    end

    it "can handle complex parsing" do
      raw_prompt = <<~PROMPT
        !get_weather(location: "sydney,melbourne", unit: "f")
        !get_weather  (location: sydney)
        !get_weather(location  : "sydney's", unit: "m", invalid: "invalid")
        !get_weather(unit: "f", invalid: "invalid")
      PROMPT
      parsed = function_list.parse_prompt(raw_prompt)

      expect(parsed).to eq(
        [
          { name: "get_weather", arguments: { location: "sydney,melbourne", unit: "f" } },
          { name: "get_weather", arguments: { location: "sydney" } },
          { name: "get_weather", arguments: { location: "sydney's" } },
        ],
      )
    end

    it "can generate a general custom system prompt" do
      prompt = function_list.system_prompt

      # this is fragile, by design, we need to test something here
      #
      expected = <<~PROMPT
        {
        // Get the weather in a city (default to c)
        !get_weather(location: string [required] /* the city name */, unit: string [optional] /* the unit of measurement celcius c or fahrenheit f [valid values: c,f] */)
        }
      PROMPT
      expect(prompt).to include(expected)
    end
  end
end
