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
