/**
 * This class is used to create an xml Excel Row
 */
Ext.define('Ext.exporter.file.excel.Row', {
    extend: 'Ext.exporter.file.Base',

    config: {
        /**
         * @cfg {Boolean} [autoFitHeight=false]
         *
         * Set this to 1 if you want to auto fit its height
         */
        autoFitHeight: false,

        /**
         * @cfg {String} caption
         *
         * Specifies the caption that should appear when the Component's custom row and column
         * headers are showing.
         */
        caption: null,

        /**
         * @cfg {Ext.exporter.file.excel.Cell[]} cells
         *
         * Collection of cells available on this row.
         */
        cells: [],

        /**
         * @cfg {Number} height
         *
         * Row's height in the Excel table
         */
        height: null,

        /**
         * @cfg {String} index
         *
         * Index of this row in the Excel table
         */
        index: null,

        /**
         * @cfg {Number} span
         *
         * Specifies the number of adjacent rows with the same formatting as this row.
         * When a Span attribute is used, the spanned row elements are not written out.
         *
         * As mentioned in the index config, rows must not overlap. Doing so results in an XML
         * Spreadsheet document that is invalid. Care must be taken with this attribute to ensure
         * that the span does not include another row index that is specified.
         *
         * Unlike columns, rows with the Span attribute must be empty. A row that contains
         * a Span attribute and one or more Cell elements is considered invalid. The Span attribute
         * for rows is a short-hand method for setting formatting properties for multiple,
         * empty rows.
         *
         */
        span: null,

        /**
         * @cfg {String} styleId
         *
         * Excel style attached to this row
         */
        styleId: null
    },

    /**
     * @method getCells
     * @return {Ext.util.Collection}
     *
     * Returns the collection of cells available in this row
     */

    /* eslint-disable indent */
    tpl: [
        '           <Row',
            '<tpl if="this.exists(index)"> ss:Index="{index}"</tpl>',
            '<tpl if="this.exists(caption)"> c:Caption="{caption}"</tpl>',
            '<tpl if="this.exists(autoFitHeight)"> ',
                'ss:AutoFitHeight="{autoFitHeight:this.toNumber}"',
            '</tpl>',
            '<tpl if="this.exists(span)"> ss:Span="{span}"</tpl>',
            '<tpl if="this.exists(height)"> ss:Height="{height}"</tpl>',
            '<tpl if="this.exists(styleId)"> ss:StyleID="{styleId}"</tpl>',
        '>\n',
        '<tpl if="cells"><tpl for="cells.getRange()">{[values.render()]}</tpl></tpl>',
        '           </Row>\n',
        /* eslint-enable indent */
        {
            exists: function(value) {
                return !Ext.isEmpty(value);
            },

            toNumber: function(value) {
                return Number(Boolean(value));
            }
        }
    ],

    destroy: function() {
        this.setCells(null);
        this.callParent();
    },

    applyCells: function(data, dataCollection) {
        return this.checkCollection(data, dataCollection, 'Ext.exporter.file.excel.Cell');
    },

    /**
     * Convenience method to add cells. You can also use workbook.getCells().add(config).
     * @param {Object/Array} config
     * @return {Ext.exporter.file.excel.Cell/Ext.exporter.file.excel.Cell[]}
     */
    addCell: function(config) {
        return this.getCells().add(config || {});
    },

    /**
     * Convenience method to fetch a cell by its id.
     * @param id
     * @return {Ext.exporter.file.excel.Cell}
     */
    getCell: function(id) {
        return this.getCells().get(id);
    }
});
