/**
 * A special column used by MultiGrouping feature
 */
Ext.define('Ext.grid.column.Groups', {
    extend: 'Ext.grid.column.Column',
    alias: 'widget.groupscolumn',
 
    /**
     * @property {Boolean} isGroupsColumn
     * `true` in this class to identify an object as an instantiated Grouping, or subclass thereof.
     */
    isGroupsColumn: true,
 
    /**
     * @cfg {String} text
     * Any valid text or HTML fragment to display in the header cell for the grouping column.
     */
    text: "Groups",
 
    /**
     * @cfg {Number} width
     * The default width in pixels of the grouping column.
     */
    width: 200,
 
    /**
     * @cfg {Boolean} draggable
     * False to disable drag-drop reordering of this column.
     */
    draggable: false,
 
    // Flag to Lockable to move instances of this column to the locked side.
    autoLock: true,
 
    // May not be moved from its preferred locked side when grid is enableLocking:true
    lockable: false,
 
    /**
     * @cfg producesHTML
     * @inheritdoc
     */
    producesHTML: false,
 
    /**
     * @cfg ignoreExport
     * @inheritdoc
     */
    ignoreExport: true,
 
    /**
     * @cfg hideable
     * @inheritdoc
     */
    hideable: false,
 
    /**
     * @cfg dataIndex
     * @inheritdoc
     */
    dataIndex: '',
 
    groupable: false,
 
    groupHeaderTpl: '{columnName}: {name}',
    groupSummaryTpl: 'Summary ({name})',
    summaryTpl: 'Summary',
 
    collapsibleCls: Ext.baseCSSPrefix + 'grid-advanced-group-hd-collapsible',
    hdNotCollapsibleCls: Ext.baseCSSPrefix + 'grid-advanced-group-hd-not-collapsible',
    collapsedCls: Ext.baseCSSPrefix + 'grid-advanced-group-hd-collapsed',
    groupCls: Ext.baseCSSPrefix + 'grid-advanced-group-hd',
    recordCls: Ext.baseCSSPrefix + 'grid-advanced-group-record',
    groupTitleCls: Ext.baseCSSPrefix + 'grid-advanced-group-title',
 
    depthToIndent: 25,
 
    constructor: function(config) {
        var me = this;
 
        // Copy the prototype's default width setting into an instance property to provide
        // a default width which will not be overridden by Container.applyDefaults
        // use of Ext.applyIf
        // eslint-disable-next-line no-self-assign
        me.width = me.width;
 
        me.callParent([config]);
 
        // Override any setting from the HeaderContainer's defaults
        me.sortable = false;
        me.groupable = false;
 
        me.scope = me;
    },
 
    defaultRenderer: function(value, metaData, record, rowIdx, colIdx, dataSource, view) {
        var me = this,
            ret = ' ',
            level = 0,
            attribute = '',
            data, tpl;
 
        if (dataSource.isMultigroupStore) {
            data = dataSource.renderData[record.getId()];
 
            if (data) {
                if (data.group) {
                    level = data.group.getLevel();
                }
 
                if (data.isGroup) {
                    level--;
                    tpl = this.lookupTpl('groupHeaderTpl');
                    // eslint-disable-next-line max-len
                    attribute = ' data-groupName = "' + Ext.htmlEncode(data.group.getLabel()) + '';
 
                    metaData.tdCls = me.collapsibleCls;
 
                    if (data.group.isCollapsed) {
                        metaData.tdCls += ' ' + me.collapsedCls;
                    }
                }
                else if (data.isGroupSummary) {
                    tpl = this.lookupTpl('groupSummaryTpl');
                }
                else if (data.isSummary) {
                    tpl = this.lookupTpl('summaryTpl');
                }
 
                if (tpl) {
                    value = tpl.apply(data);
                }
 
                value = value || ' ';
                ret = '<div ' + attribute + 'class="' + me.groupTitleCls + '">' + value + '</div>';
 
                if (!data.isSummary) {
                    metaData.innerCls = data.isGroup ? me.groupCls : me.recordCls;
                    // eslint-disable-next-line max-len
                    metaData.style = (dataSource.isRTL ? 'margin-right: ' : 'margin-left: ') + me.depthToIndent * level + 'px';
                }
            }
        }
 
        return ret;
    },
 
    updater: function(cell, value, record, view, dataSource) {
        var cellInner = cell && cell.querySelector(this.getView().innerSelector);
 
        if (cellInner) {
            // eslint-disable-next-line max-len
            cellInner.innerHTML = this.defaultRenderer(value, null, record, null, null, dataSource, view);
        }
    }
 
});