module RubyLLM::ActiveRecord::ActsAs

def acts_as_chat(message_class: 'Message', tool_call_class: 'ToolCall')

rubocop:disable Metrics/BlockLength
def acts_as_chat(message_class: 'Message', tool_call_class: 'ToolCall')
  include ChatMethods
  @message_class = message_class.to_s
  @tool_call_class = tool_call_class.to_s
  has_many :messages,
           -> { order(created_at: :asc) },
           class_name: @message_class,
           dependent: :destroy
  delegate :complete,
           :add_message,
           to: :to_llm
end

def acts_as_message(chat_class: 'Chat', tool_call_class: 'ToolCall', touch_chat: false) # rubocop:disable Metrics/MethodLength

rubocop:disable Metrics/MethodLength
def acts_as_message(chat_class: 'Chat', tool_call_class: 'ToolCall', touch_chat: false) # rubocop:disable Metrics/MethodLength
  include MessageMethods
  @chat_class = chat_class.to_s
  @tool_call_class = tool_call_class.to_s
  belongs_to :chat, class_name: @chat_class, touch: touch_chat
  has_many :tool_calls, class_name: @tool_call_class, dependent: :destroy
  belongs_to :parent_tool_call,
             class_name: @tool_call_class,
             foreign_key: 'tool_call_id',
             optional: true,
             inverse_of: :result
  delegate :tool_call?, :tool_result?, :tool_results, to: :to_llm
end

def acts_as_tool_call(message_class: 'Message')

def acts_as_tool_call(message_class: 'Message')
  @message_class = message_class.to_s
  belongs_to :message, class_name: @message_class
  has_one :result,
          class_name: @message_class,
          foreign_key: 'tool_call_id',
          inverse_of: :parent_tool_call,
          dependent: :nullify
end