import extend from './extend';

import { hooks } from './hooks';

import isUndefined from './is-undefined';



function warn(msg) {

    if (hooks.suppressDeprecationWarnings === false &&

            (typeof console !==  'undefined') && console.warn) {

        console.warn('Deprecation warning: ' + msg);

    }

}



export function deprecate(msg, fn) {

    var firstTime = true;



    return extend(function () {

        if (hooks.deprecationHandler != null) {

            hooks.deprecationHandler(null, msg);

        }

        if (firstTime) {

            var args = [];

            var arg;

            for (var i = 0; i < arguments.length; i++) {

                arg = '';

                if (typeof arguments[i] === 'object') {

                    arg += '\n[' + i + '] ';

                    for (var key in arguments[0]) {

                        arg += key + ': ' + arguments[0][key] + ', ';

                    }

                    arg = arg.slice(0, -2); // Remove trailing comma and space

                } else {

                    arg = arguments[i];

                }

                args.push(arg);

            }

            warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack);

            firstTime = false;

        }

        return fn.apply(this, arguments);

    }, fn);

}



var deprecations = {};



export function deprecateSimple(name, msg) {

    if (hooks.deprecationHandler != null) {

        hooks.deprecationHandler(name, msg);

    }

    if (!deprecations[name]) {

        warn(msg);

        deprecations[name] = true;

    }

}



hooks.suppressDeprecationWarnings = false;

hooks.deprecationHandler = null;

