require 'ansi/code'
require 'logging'

module MJ; module Logging;

    #
    # Basic Layout for the logging framework.
    #
    # Will prefix message according to the following list:
    #
    #   WARNING => 'warning: '
    #   ERROR   => 'error: '
    #   REST    => ''
    class BasicLayout < ::Logging::Layout

        include ANSI::Code

        def format( event )
          obj = format_obj(event.data)

          return case event.level

          when ::Logging::level_num(:ERROR)
              red   { sprintf("error: %s\n", obj) }

          when ::Logging::level_num((:WARN))
              yellow { sprintf("warning: %s\n", obj) }

          else
              if obj.start_with?( '###')
                  blue { obj + "\n" }
              else
                  obj + "\n"
              end
          end
        end

    end # class BasicLayout


    # :TODO: Map the Logging Levels to Logger Levels instead of hardcoding them here.
    class LoggerAdapter

        def initialize( prefix )
            @prefix = prefix.upcase
        end

        def debug( string )
            logger.debug( "<#{@prefix}> #{string}" )
        end

        def debug?
            return logger.level > ::Logging.level_num(:debug)
        end

        def info( string )
            logger.info( "<#{@prefix}> info #{string}" )
        end

        def info?
            return logger.level > ::Logging.level_num(:info)
        end

        def warn( string )
            logger.arn( "<#{@prefix}> #{string}" )
        end

        def warn?
            return logger.level > ::Logging.level_num(:warn)
        end

        def error( string )
            logger.error( "<#{@prefix}> #{string}" )
        end

        def error?
            return logger.level > ::Logging.level_num(:error)
        end

        def fatal( string )
            logger.error( "<#{@prefix}> #{string}" )
        end

        def fatal?
            return logger.level > ::Logging.level_num(:error)
        end

        def unknown( string )
            logger.error( "<#{@prefix}> UNKNOWN: #{string}" )
        end
    end

end; end