# A backend that broadcast to others backends.
# Each of the referenced backends may have a different severity level filter.
#
# When this backend level is set that level setting takes precedence
# over the severity filter of each referenced backend.
#
# This backend is not to be used explicitly. It is used by `Log::Builder` configuration
# to allow a given source to emit to multiple backends.
class Log::BroadcastBackend < Log::Backend
  property level : Severity? = nil

  @backends = Hash(Log::Backend, Severity).new

  def initialize
    super(:direct)
  end

  def append(backend : Log::Backend, level : Severity) : Nil
    @backends[backend] = level
  end

  def write(entry : Entry) : Nil
    @backends.each do |backend, level|
      backend.dispatch(entry) if (@level || level) <= entry.severity
    end
  end

  def close : Nil
    @backends.each_key &.close
  end

  # :nodoc:
  def min_level : Severity
    @backends.each_value.min? || Severity::None
  end

  # :nodoc:
  def single_backend? : Tuple(Log::Backend, Log::Severity)?
    if @backends.size == 1
      @backends.first
    end
  end

  # :nodoc:
  def remove(backend : Log::Backend) : Nil
    @backends.delete(backend)
  end
end
