module WEBrick

class BasicLog
  @log: IO?

  @opened: TrueClass?

  FATAL: 1

  ERROR: 2

  WARN: 3

  INFO: 4

  DEBUG: 5

  # log-level, messages above this level will be logged
  attr_accessor level: Integer

  type log_file = (IO | String)?

  def initialize: (?log_file log_file, ?Integer? level) -> void

  #
  # Closes the logger (also closes the log device associated to the logger)
  def close: () -> void

  def log: (Integer level, String data) -> IO?

  #
  # Synonym for log(INFO, obj.to_s)
  def <<: (_ToS obj) -> IO?

  type message = Exception | _ToStr | Object

  # Shortcut for logging a FATAL message
  def fatal: (message msg) -> IO?

  # Shortcut for logging an ERROR message
  def error: (message msg) -> IO?

  # Shortcut for logging a WARN message
  def warn: (message msg) -> IO?

  # Shortcut for logging an INFO message
  def info: (message msg) -> IO?

  # Shortcut for logging a DEBUG message
  def debug: (message msg) -> IO?

  # Will the logger output FATAL messages?
  def fatal?: () -> bool

  # Will the logger output ERROR messages?
  def error?: () -> bool

  # Will the logger output WARN messages?
  def warn?: () -> bool

  # Will the logger output INFO messages?
  def info?: () -> bool

  # Will the logger output DEBUG messages?
  def debug?: () -> bool

  private

  #
  # Formats +arg+ for the logger
  #
  # * If +arg+ is an Exception, it will format the error message and
  #   the back trace.
  # * If +arg+ responds to #to_str, it will return it.
  # * Otherwise it will return +arg+.inspect.
  def format: (message arg) -> String
end

class Log < BasicLog
  # Format of the timestamp which is applied to each logged line.  The
  # default is <tt>"[%Y-%m-%d %H:%M:%S]"</tt>
  attr_accessor time_format: String

  #
  # Same as BasicLog#initialize
  #
  # You can set the timestamp format through #time_format
  def initialize: (?BasicLog::log_file log_file, ?Integer? level) -> void

  #
  # Same as BasicLog#log
  def log: (Integer level, String data) -> IO?
end

end