/**
 * @class Ext.app.Application
 */
Ext.define('Ext.overrides.app.Application', {
    override: 'Ext.app.Application',
    uses: [
        'Ext.tip.QuickTipManager'
    ],
 
    // @cmd-auto-dependency {aliasPrefix: "view.", mvc: true, requires: ["Ext.plugin.Viewport"]} 
    /**
     * @cfg {Boolean/String} [autoCreateViewport=false]
     * @deprecated 5.1 Instead use {@link #mainView}
     * @member Ext.app.Application
     */
    autoCreateViewport: false,
 
    config: {
        /**
         * @cfg {Boolean} enableQuickTips 
         * @deprecated 6.2.0 Use {@link #quickTips}.
         */
        enableQuickTips: null
    },
 
    /**
     * @cfg {Boolean} quickTips 
     * True to automatically set up Ext.tip.QuickTip support.
     *
     * @since 6.2.0
     */
    quickTips: true,
 
    updateEnableQuickTips: function(enableQuickTips) {
        this.setQuickTips(enableQuickTips);
    },
 
    applyMainView: function(mainView) {
        var view, proto, config, protoPlugins, configPlugins;
 
        if (typeof mainView === 'string') {
            view = this.getView(mainView);
            config = {};
        } else {
            config = mainView;
            view = Ext.ClassManager.getByConfig(mainView);
        }
        proto = view.prototype;
 
        if (!proto.isViewport) {
            // Need to copy over any plugins defined on the prototype and on the config. 
            protoPlugins = Ext.Array.from(proto.plugins);
            configPlugins = Ext.Array.from(config.plugins);
            config = Ext.apply({}, config);
            config.plugins = ['viewport'].concat(protoPlugins, configPlugins);
        }
 
        return view.create(config);
    },
 
    getDependencies: function(cls, data, requires) {
        var Controller = Ext.app.Controller,
            proto = cls.prototype,
            namespace = data.$namespace,
            viewportClass = data.autoCreateViewport;
 
        if (viewportClass) {
            //<debug> 
            if (!namespace) {
                Ext.raise("[Ext.app.Application] Can't resolve namespace for " +
                    data.$className + ", did you forget to specify 'name' property?");
            }
            //</debug> 
 
            if (viewportClass === true) {
                viewportClass = 'Viewport';
            } else {
                requires.push('Ext.plugin.Viewport');
            }
 
            Controller.processDependencies(proto, requires, namespace, 'view', viewportClass);
        }
    },
 
    onBeforeLaunch: function() {
        var me = this,
            autoCreateViewport = me.autoCreateViewport;
 
        if (me.getQuickTips()) {
            me.initQuickTips();
        }
 
        if(autoCreateViewport) {
            me.initViewport();
        }
 
        this.callParent(arguments);
    },
 
    getViewportName: function () {
        var name = null,
            autoCreate = this.autoCreateViewport;
 
        if (autoCreate) {
            name = (autoCreate === true) ? 'Viewport' : autoCreate;
        }
 
        return name;
    },
 
    initViewport: function() {
        this.setMainView(this.getViewportName());
    },
 
    initQuickTips: function() {
        Ext.tip.QuickTipManager.init();
    }
});