module Savon
  class LogMessage

    def initialize(message, filter, options = {})
      self.message     = message
      self.filter      = filter
      self.with_pretty = options[:pretty]
      self.with_filter = options[:filter]
    end

    attr_accessor :message, :filter, :with_pretty, :with_filter

    def filter?
      with_filter && filter.any?
    end

    def pretty?
      with_pretty
    end

    def to_s
      return message unless pretty? || filter?

      doc = Nokogiri::XML(message)
      doc = apply_filter(doc) if filter?
      doc.to_xml(pretty_options)
    end

    private

    def apply_filter(doc)
      return doc unless doc.errors.empty?

      filter.each do |fi|
        doc.xpath("//*[local-name()='#{fi}']").each { |node| node.content = "***FILTERED***" }
      end

      doc
    end

    def pretty_options
      return {} unless pretty?
      { :indent => 2 }
    end

  end
end