class FivematReporter < BaseReporter

def initialize
  super
  self.indents = 0
  self.log_buffer = []
  self.current_index = 0
  self.error_buffer = []
end

defm writeln(msg)
  line = "#{self.indent_to_str()}#{msg}"
  self.writer.writeln(line)
end

defm write(msg)
  line = "#{self.indent_to_str()}#{msg}"
  self.writer.write(line)
end

defm write_errorln(msg)
  add(self.error_buffer, self.indent_to_str() . msg)
end

defm has_error_lines
  return len(self.error_buffer) > 0
end

defm flush_error_buffer
  if self.has_error_lines()
    for line in self.error_buffer
      self.writeln(line)
    end

    self.error_buffer = []
  end
end

defm on_start(stats)
end

defm on_context_start(context, stats)
  self.current_index = 0
  self.write("#{context} ")
end

defm on_context_end(context, stats)
  self.writeln('')
  self.flush_error_buffer()
end

defm on_spec_pass(meta, stats)
  duration_msg = self.get_duration_msg(meta)
  self.write('.')
  self.flush_log_buffer()
end

defm show_error(type, meta, err, stats)
  char = type[0]
  self.write(self.to_red(char))

  self.indent(1)

  self.write_errorln("#{self.current_index}) #{type}: #{meta.get_sentence()}")

  self.indent(1)
  self.write_errorln(" ". self.to_red(err.get_message()))
  self.indent(1)
  self.print_stacktrace(err)
  self.flush_log_buffer()
  self.unindent(3)
  self.write_errorln('')
end

defm on_spec_failure(meta, err, stats)
  self.current_index += 1
  self.show_error('Failure', meta, err, stats)
end

defm on_spec_error(meta, err, stats)
  self.current_index += 1
  self.show_error('Error', meta, err, stats)
end

defm indent_to_str
  return repeat("  ", self.indents)
end

defm indent(size)
  self.indents += size
end

defm unindent(size)
  self.indents -= size
end

defm write_epilogue_separator
  self.writer.writeln('')
  super
end

defm write_log_line(line)
  self.write_errorln(" log: #{line}")
end

defm write_stacktrace_line(line)
  self.write_errorln(" " . line)
end

defm flush_log_buffer
  if self.has_logs()
    self.write_errorln('')

    for line in self.log_buffer
      self.write_log_line(line)
    end

    self.log_buffer = []
  end
end

end