/*
 *  Copyright 2019 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.
 */

/**
 * This step of {@link Ametys.plugins.web.page.AddPageWizard} wizard allow to select tags in a simplified way, displaying only a list of combo-box instead of the tree.
 */
Ext.define("Ametys.plugins.web.page.AddPageWizard.TagsCardLite", {
	
	extend: "Ametys.plugins.web.page.AddPageWizard.TagsCard",

    resetModel: function (callback)
	{
		this._model = {};
        this._model["tags"] = Ametys.plugins.web.page.AddPageWizard.getInitialConfig('default-tags') || [];
        this._tagsNameFilter = Ametys.plugins.web.page.AddPageWizard.getInitialConfig('pagecontent-card-tags-categories-filter') || [];
	    
	    callback();
    },
	
	updateModel: function ()
	{
		var selectedTags = [];
		
		var currentTreePanel = Ext.getCmp("add-page-tags-card-treepanel");
        
        for (var i = 0; i < currentTreePanel.items.items.length; i++)
        {
            selectedTags = selectedTags.concat(currentTreePanel.items.items[i].getValue());
        }
		
		this._model['tags'] = selectedTags;
	},
	
	onEnter: function()
	{
        this._loading = true;
		var fullModel = Ametys.plugins.web.page.AddPageWizard.getModel();
		
		var tagsFilter = this.getTagsFilters(fullModel);
        var targetType = this.getTargetType(fullModel);
        
        var hierarchySeparator = Ametys.plugins.web.page.AddPageWizard.getInitialConfig('pagecontent-card-tags-categories-filter-hierarchy-separator');
        var showCategories = !Ametys.plugins.web.page.AddPageWizard.getInitialConfig('pagecontent-card-tags-categories-filter-only-subcategories');
        
        Ametys.data.ServerComm.callMethod({
                role: "org.ametys.web.repository.page.AddPageWizardHelper",
                methodName: "getTags",
                parameters: [this._tagsNameFilter, tagsFilter, targetType, showCategories, hierarchySeparator, Ametys.getAppParameters()],
                callback: {
                    handler: this._onLoad,
                    scope: this
                },
                waitMessage: false,
                errorMessage: true
            });
            
		if (!this.shouldDisplayCard())
		{
			this._cardPanel.hide();
		}
	},
	
	/**
	 * Listener on load of record
	 * @param {Object[]} tags list of tags and sub-tags to display 
	 */
	_onLoad: function (tags)
	{
        this._loading = false;
        this._tagsList = tags;
        this.updateUI();
		Ametys.plugins.web.page.AddPageWizard._onChange();
	},
	
	updateUI: function (callback)
	{
        var values = this._model['tags']
                        || Ametys.plugins.web.page.AddPageWizard.getInitialConfig('default-tags')
                        || Ametys.plugins.web.page.AddPageWizard.getInitialConfig('default-selected-tags') 
                        || [];
        
        var currentTreePanel = Ext.getCmp("add-page-tags-card-treepanel");
        var treeOwnerCt = currentTreePanel.ownerCt;
        var treePosition = treeOwnerCt.items.indexOf(currentTreePanel);

        var childrens = [];
        if (this._tagsList != null)
        {
            for (var i = 0; i < this._tagsList.length; i++)
            {
                var combo = this.generateAList(this._tagsList[i]);
                combo.setValue(values);
                childrens.push(combo);
            }
        }
        
        currentTreePanel.destroy();
        var tagsTree = Ext.create('Ext.container.Container', {
                flex: 1,
                id: "add-page-tags-card-treepanel",
                defaults: {
                    xtype: 'textfield',
                    cls: 'ametys',
                    msgTarget: 'side',
                    labelAlign: 'top',
                    labelSeparator: '',
                    labelStyle: 'font-weight: bold',
                    labelWidth: 130,
                    maxWidth: 470,
                    width: '100%'
                },
                items: childrens
        });
        
        treeOwnerCt.insert(treePosition, tagsTree);
        
        if (Ext.isFunction(callback))
        {
            callback(true);
        }
	},
	
	isModelOk: function (fullModel)
	{
        return !this._loading;
	},
    
    generateAList: function(tagObject)
    {
        return Ext.create('Ext.form.field.Tag', {
            fieldLabel: tagObject.title,
            store: {
                fields: [
	                {name: 'title', type: 'string'},
	                {name: 'name', type: 'string'}
	            ],
                data: tagObject.tags,
                sorters: ['title']
            },
            displayField: 'title',
            valueField: 'name',
            queryMode: 'local',
            filterPickList: false,
            listeners: {
                'change': Ext.bind(this.updateModel, this),
                'keyup': Ext.bind(this.updateModel, this)
            }
        });
    }
    
	
});