# frozen_string_literal: true
#
module DiscourseAi
  module Automation
    module LlmTriage
      def self.handle(
        post:,
        model:,
        search_for_text:,
        system_prompt:,
        category_id: nil,
        tags: nil,
        canned_reply: nil,
        canned_reply_user: nil,
        hide_topic: nil
      )
        if category_id.blank? && tags.blank? && canned_reply.blank? && hide_topic.blank?
          raise ArgumentError, "llm_triage: no action specified!"
        end

        post_template = +""
        post_template << "title: #{post.topic.title}\n"
        post_template << "#{post.raw}"

        filled_system_prompt = system_prompt.sub("%%POST%%", post_template)

        if filled_system_prompt == system_prompt
          raise ArgumentError, "llm_triage: system_prompt does not contain %%POST%% placeholder"
        end

        result = nil

        llm = DiscourseAi::Completions::Llm.proxy(translate_model(model))

        result =
          llm.generate(
            filled_system_prompt,
            temperature: 0,
            max_tokens: llm.tokenizer.tokenize(search_for_text).length * 2 + 10,
            user: Discourse.system_user,
          )

        if result.strip == search_for_text.strip
          user = User.find_by_username(canned_reply_user) if canned_reply_user.present?
          user = user || Discourse.system_user
          if canned_reply.present?
            PostCreator.create!(
              user,
              topic_id: post.topic_id,
              raw: canned_reply,
              reply_to_post_number: post.post_number,
              skip_validations: true,
            )
          end

          changes = {}
          changes[:category_id] = category_id if category_id.present?
          changes[:tags] = tags if SiteSetting.tagging_enabled? && tags.present?

          if changes.present?
            first_post = post.topic.posts.where(post_number: 1).first
            changes[:bypass_bump] = true
            changes[:skip_validations] = true
            first_post.revise(Discourse.system_user, changes)
          end

          post.topic.update!(visible: false) if hide_topic
        end
      end

      def self.translate_model(model)
        return "google:gemini-pro" if model == "gemini-pro"
        return "open_ai:#{model}" if model != "claude-2"

        if DiscourseAi::Completions::Endpoints::AwsBedrock.correctly_configured?("claude-2")
          "aws_bedrock:claude-2"
        else
          "anthropic:claude-2"
        end
      end
    end
  end
end
