# frozen_string_literal: true

module BackupRestore
  class Logger
    attr_reader :logs

    def initialize(user_id: nil, client_id: nil)
      @user_id = user_id
      @client_id = client_id
      @publish_to_message_bus = @user_id.present? && @client_id.present?

      @logs = []
    end

    def log(message, ex = nil)
      return if Rails.env.test?

      timestamp = Time.now.strftime("%Y-%m-%d %H:%M:%S")
      puts(message)
      publish_log(message, timestamp)
      save_log(message, timestamp)

      if ex
        formatted_ex = "#{ex}\n" + ex.backtrace.join("\n")
        puts formatted_ex
        Rails.logger.error(formatted_ex)
      end
    end

    protected

    def publish_log(message, timestamp)
      return unless @publish_to_message_bus
      data = { timestamp: timestamp, operation: "restore", message: message }
      MessageBus.publish(
        BackupRestore::LOGS_CHANNEL,
        data,
        user_ids: [@user_id],
        client_ids: [@client_id],
      )
    end

    def save_log(message, timestamp)
      @logs << "[#{timestamp}] #{message}"
    end
  end
end