/**
 * Represents a single record of data in the PivotCache.
 *
 * (CT_Record)
 * @private
 */
Ext.define('Ext.exporter.file.ooxml.excel.Record', {
    extend: 'Ext.exporter.file.ooxml.Base',

    config: {
        /**
         * @cfg {Boolean/Number/Date/String[]} items
         *
         * Cell values for this record
         */
        items: null
    },

    tplNonAttributes: [
        'items', 'stritems'
    ],

    tpl: [
        '<tpl if="stritems">',
        '<r>',
        '{stritems}',
        '</r>',
        '<tpl else>',
        '<r/>',
        '</tpl>'
    ],

    numberTpl: '<n v="{0}"/>',
    booleanTpl: '<b v="{0}"/>',
    stringTpl: '<s v="{0}"/>',
    dateTpl: '<d v="{0}"/>',

    constructor: function(config) {
        var cfg;

        if (Ext.isArray(config) || Ext.isDate(config) || Ext.isPrimitive(config)) {
            cfg = {
                items: config
            };
        }
        else {
            cfg = config;
        }

        return this.callParent([cfg]);
    },

    getRenderData: function() {
        var me = this,
            data = me.callParent(),
            items = data.items,
            str = '',
            types = [],
            i, len, v, tpl;

        if (items) {
            len = items.length;

            for (i = 0; i < len; i++) {
                v = items[i];

                if (v == null || v === '') {
                    //
                }
                else {
                    if (typeof v === 'string') {
                        tpl = me.stringTpl;
                        v = Ext.util.Base64._utf8_encode(Ext.util.Format.htmlEncode(v));
                        types.push('s');
                    }
                    else if (typeof v === 'boolean') {
                        tpl = me.booleanTpl;
                        types.push('b');
                    }
                    else if (typeof v === 'number') {
                        tpl = me.numberTpl;
                        types.push('n');
                    }
                    else if (v instanceof Date) {
                        tpl = me.dateTpl;
                        v = Ext.Date.format(v, 'Y-m-d\\TH:i:s.u');
                        types.push('d');
                    }

                    str += Ext.String.format(tpl, v);
                }
            }
        }

        data.stritems = str;

        return data;
    },

    applyItems: function(items) {
        return items !== null ? Ext.Array.from(items) : null;
    }
});
