/*
 *  Copyright 2015 Anyware Services
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

/**
 * @private
 * This tool displays the available skins and models 
 */
Ext.define('Ametys.plugins.skinfactory.skin.SkinTool', {
    extend: 'Ametys.plugins.web.skin.SkinTool',

    /**
     * @private
     * @property {Ext.XTemplate} _filterHintTpl Template used for filter hint
     */
    _filterHintTpl: Ext.create('Ext.Template',
            '{{i18n PLUGINS_SKINFACTORY_SKIN_MODEL_FILTER_HINT1}}<b>{label}</b> <em> ({id})</em>{{i18n PLUGINS_SKINFACTORY_SKIN_MODEL_FILTER_HINT2}}',
            '<br/>{{i18n PLUGINS_SKINFACTORY_SKIN_MODEL_FILTER_HINT_LINK}}'
    ),

    /**
     * Called when a message is received
     * @param {Ametys.message.Message} message The message received.
     * @private
     */
    _onMessage: function(message)
    {
        if (message.getTarget(new RegExp('^(' + Ametys.message.MessageTarget.SKIN + "|" + Ametys.message.MessageTarget.SKINMODEL + "|" + Ametys.message.MessageTarget.SITE + ')$')) != null)
        {
            this.showOutOfDate();
        }
        
        var skinFilter = message.getTarget(Ametys.message.MessageTarget.SKINFILTER);
        if (skinFilter != null)
        {
            if (message.getType() == Ametys.message.Message.CREATED)
            {
                this._applyFilter(skinFilter.getParameters());
            }
            else if (message.getType() == Ametys.message.Message.DELETED)
            {
                this._removeFilter();
            }
        }
    },
    
    _getDockedItems: function ()
    {
    	return [{
    		dock: 'top',
    		xtype: 'button',
    		ui: 'tool-hintmessage',
            itemId: 'filter-hint',
            hidden: true,
            text: '',
            handler: function () {
	    		Ext.create("Ametys.message.Message", {
	                type: Ametys.message.Message.DELETED,
	                targets: {
	                    id: Ametys.message.MessageTarget.SKINFILTER,
	                    parameters: {}
	                }
	            });
	    	}
    	}]
    },

    _getItems: function ()
    {
        return [ this._createDataView("models", "Ametys.plugins.skinfactory.skin.SkinModel", "{{i18n PLUGINS_SKINFACTORY_ADMINISTRATOR_SKINS_MODELS_TITLE}}", Ametys.message.MessageTarget.SKINMODEL), ...this.callParent(arguments)];
    },

    refresh: function ()
    {
        this.showRefreshing();
        Ametys.plugins.skinfactory.model.SkinModelDAO.getSkinsAndModels([true], this._refreshCb, {
            waitMessage: false,
            scope: this
        });
    },

    /**
     * Callback on tool refresh
     * @param {Object} response The list of models and skins
     * @param {Object[]} response.models The list of models
     * @param {Object[]} response.skins The list of skins
     * @private
     */
    _refreshCb: function (response)
    {
        var modelStore = this.getContentPanel().getComponent("dataview-models").getComponent("models").getStore();
        modelStore.removeAll();

        if (response.models)
        {
            modelStore.add(response.models);
        }
        
        this.callParent(arguments);
    },

    /**
     * Set a filter to display only a model and its skins
     * @param {Object} modelData The model to filter
     * @param {String} modelData.id The id of the model
     * @param {String} modelData.label The label of the model
     * @private
     */
    _applyFilter: function (modelData)
    {
        var filterModel = new Ext.util.Filter({
            filterFn: function(item)
            {
                if (item.data.type == "model")
                {
                    // Filter the models by data.id
                    return item.data.id == modelData.id;
                }
                else if (item.data.type == "skin" && item.data.model)
                {
                    // Filter the skins by data.model.id
                    return item.data.model.id == modelData.id;
                }
                return false;
            }
        });
        
        Ext.Array.each (this._dataViews, function (dv) {
        	var total = dv.getStore().getCount();
        	dv.getStore().addFilter(filterModel);
        	var count = dv.getStore().getCount();
        	dv.ownerCt.setTitle (dv._title + " (" + count + "/" + total + ")");
        })

        var filterHint = this.getContentPanel().getComponent("filter-hint");
        filterHint.setText(this._filterHintTpl.apply(modelData))
        filterHint.show();
    },

    /**
     * Remove all filters
     * @private
     */
    _removeFilter: function ()
    {
    	Ext.Array.each (this._dataViews, function (dv) {
        	dv.getStore().clearFilter();
        	
        	var count = dv.getStore().getCount();
    		dv.ownerCt.setTitle (dv._title + " (" + count + ")")
        })
        
        this.getContentPanel().getComponent("filter-hint").hide();
    	
    }
});