# frozen_string_literal: true

module DiscourseAi
  module AiBot
    module Tools
      class RandomPicker < Tool
        def self.signature
          {
            name: name,
            description:
              "Handles a variety of random decisions based on the format of each input element",
            parameters: [
              {
                name: "options",
                description:
                  "An array where each element is either a range (e.g., '1-6') or a comma-separated list of options (e.g., 'sam,jane,joe')",
                type: "array",
                item_type: "string",
                required: true,
              },
            ],
          }
        end

        def self.name
          "random_picker"
        end

        def options
          parameters[:options]
        end

        def invoke
          result = nil
          # can be a naive list of strings
          if options.none? { |option| option.match?(/\A\d+-\d+\z/) || option.include?(",") }
            result = options.sample
          else
            result =
              options.map do |option|
                case option
                when /\A\d+-\d+\z/ # Range format, e.g., "1-6"
                  random_range(option)
                when /,/ # Comma-separated values, e.g., "sam,jane,joe"
                  pick_list(option)
                else
                  "Invalid format: #{option}"
                end
              end
          end

          @last_result = result
          { options: options, result: result }
        end

        private

        def random_range(range_str)
          low, high = range_str.split("-").map(&:to_i)
          rand(low..high)
        end

        def pick_list(list_str)
          list_str.split(",").map(&:strip).sample
        end

        def description_args
          { options: options, result: @last_result }
        end
      end
    end
  end
end
