
#---------------------------------------------------------------------------------
# weinre is available under *either* the terms of the modified BSD license *or* the
# MIT License (2008). See http:#opensource.org/licenses/alphabetical for full text.
#
# Copyright (c) 2010, 2011 IBM Corporation
#---------------------------------------------------------------------------------

Ex         = require('./Ex')
IDLTools   = require('./IDLTools')
StackTrace = require('./StackTrace')

_notImplemented     = {}
_showNotImplemented = false
logger              = null

#-------------------------------------------------------------------------------
module.exports = class Weinre

    #---------------------------------------------------------------------------
    constructor: ->
        throw new Ex(arguments, "this class is not intended to be instantiated")

    #---------------------------------------------------------------------------
    @addIDLs: (idls) ->
        IDLTools.addIDLs idls

    #---------------------------------------------------------------------------
    @deprecated: () ->
        StackTrace.dump arguments

    #---------------------------------------------------------------------------
    @notImplemented: (thing) ->
        return if _notImplemented[thing]

        _notImplemented[thing] = true
        return unless _showNotImplemented

        Weinre.logWarning thing + " not implemented"

    #---------------------------------------------------------------------------
    @showNotImplemented: () ->
        _showNotImplemented = true

        for key of _notImplemented
            Weinre.logWarning key + " not implemented"

    #---------------------------------------------------------------------------
    @logError: (message) ->
        getLogger().logError message

    #---------------------------------------------------------------------------
    @logWarning: (message) ->
        getLogger().logWarning message

    #---------------------------------------------------------------------------
    @logInfo: (message) ->
        getLogger().logInfo message

    #---------------------------------------------------------------------------
    @logDebug: (message) ->
        getLogger().logDebug message

#-------------------------------------------------------------------------------
class ConsoleLogger
    logError:   (message) -> console.log "error: #{message}"
    logWarning: (message) -> console.log "warning: #{message}"
    logInfo:    (message) -> console.log "info: #{message}"
    logDebug:   (message) -> console.log "debug: #{message}"

consoleLogger = new ConsoleLogger()

#-------------------------------------------------------------------------------
getLogger = () ->
    return logger if logger

    if Weinre.client
        logger = Weinre.WeinreClientCommands
        return logger

    if Weinre.target
        logger = Weinre.WeinreTargetCommands
        return logger

    consoleLogger

#-------------------------------------------------------------------------------
require("../common/MethodNamer").setNamesForClass(module.exports)
