/**
 * This is the window that allows field settings configuration.
 */
Ext.define('Ext.pivot.plugin.configurator.window.FieldSettings', {
    extend: 'Ext.pivot.plugin.configurator.window.Window',

    requires: [
        'Ext.form.field.Display'
    ],

    title: 'Field settings',

    formatText: 'Format as',
    summarizeByText: 'Summarize by',
    customNameText: 'Custom name',
    sourceNameText: 'Source name',
    alignText: 'Align',
    alignLeftText: 'Left',
    alignCenterText: 'Center',
    alignRightText: 'Right',

    field: null,

    getSettingsForm: function() {
        var me = this,
            dataFormatters = [],
            dataAggregators = [],
            settings = me.field.getSettings(),
            formatters = settings.getFormatters(),
            renderers = settings.getRenderers(),
            fns = settings.getAggregators(),
            length, i, list;

        length = fns.length;

        for (i = 0; i < length; i++) {
            dataAggregators.push([
                me.field.getAggText(fns[i]),
                fns[i]
            ]);
        }

        list = Ext.Object.getAllKeys(formatters || {});
        length = list.length;

        for (i = 0; i < length; i++) {
            dataFormatters.push([
                list[i],
                formatters[list[i]],
                1
            ]);
        }

        list = Ext.Object.getAllKeys(renderers || {});
        length = list.length;

        for (i = 0; i < length; i++) {
            dataFormatters.push([
                list[i],
                renderers[list[i]],
                2
            ]);
        }

        return Ext.apply(me.callParent(arguments), {
            items: [{
                xtype: 'displayfield',
                fieldLabel: me.sourceNameText,
                name: 'dataIndex'
            }, {
                xtype: 'textfield',
                fieldLabel: me.customNameText,
                name: 'header',
                allowBlank: false
            }, {
                xtype: 'combo',
                fieldLabel: me.alignText,
                editable: false,
                queryMode: 'local',
                valueField: 'value',
                name: 'align',
                store: new Ext.data.ArrayStore({
                    fields: ['text', 'value'],
                    data: [
                        [me.alignLeftText, 'left'],
                        [me.alignCenterText, 'center'],
                        [me.alignRightText, 'right']
                    ]
                })
            }, {
                xtype: 'combo',
                fieldLabel: me.formatText,
                editable: false,
                queryMode: 'local',
                valueField: 'value',
                name: 'formatter',
                store: new Ext.data.ArrayStore({
                    fields: ['text', 'value', 'type'],
                    data: dataFormatters
                })
            }, {
                xtype: 'combo',
                fieldLabel: me.summarizeByText,
                editable: false,
                queryMode: 'local',
                valueField: 'value',
                name: 'aggregator',
                store: new Ext.data.ArrayStore({
                    fields: ['text', 'value'],
                    data: dataAggregators
                })
            }]
        });
    },

    beforeApplySettings: function(settings) {
        var formatAs = this.down('[name=formatter]'),
            store, item;

        if (formatAs) {
            store = formatAs.getStore();
            item = store.findRecord('value', settings.formatter, 0, false, true, true);

            if (item) {
                if (item.get('type') === 1) {
                    settings.formatter = item.get('value');
                    settings.renderer = null;
                }
                else {
                    settings.renderer = item.get('value');
                    settings.formatter = null;
                }
            }
        }
    },

    loadSettings: function(settings) {
        var format = settings.formatter;

        if (Ext.isFunction(format)) {
            format = null;
        }

        if (!format && !Ext.isFunction(settings.renderer)) {
            format = settings.renderer;
        }

        settings.formatter = format;
        this.callParent([settings]);
    }
});
