/**
 * @abstract
 * @class Ext.chart.series.Polar
 * @extends Ext.chart.series.Series
 *
 * Common base class for series implementations that plot values using polar coordinates.
 */
Ext.define('Ext.chart.series.Polar', {
 
    extend: 'Ext.chart.series.Series',
 
    config: {
        /**
         * @cfg {Number} [rotation=0]
         * The angle in degrees at which the first polar series item should start.
         */
        rotation: 0,
 
        /**
         * @cfg {Number} radius 
         * @private
         * Use {@link Ext.chart.series.Pie#cfg!radiusFactor radiusFactor} instead.
         *
         * The internally used radius of the polar series. Set to `null` will fit the
         * polar series to the boundary.
         */
        radius: null,
 
        /**
         * @cfg {Array} center for the polar series.
         */
        center: [0, 0],
 
        /**
         * @cfg {Number} [offsetX=0]
         * The x-offset of center of the polar series related to the center of the boundary.
         */
        offsetX: 0,
 
        /**
         * @cfg {Number} [offsetY=0]
         * The y-offset of center of the polar series related to the center of the boundary.
         */
        offsetY: 0,
 
        /**
         * @cfg {Boolean} [showInLegend=true]
         * Whether to add the series elements as legend items.
         */
        showInLegend: true,
 
        /**
         * @private
         * @cfg {String} xField 
         */
        xField: null,
 
        /**
         * @private
         * @cfg {String} yField 
         */
        yField: null,
 
        /**
         * @cfg {String} angleField 
         * The store record field name for the angular axes in radar charts,
         * or the size of the slices in pie charts.
         */
        angleField: null,
 
        /**
         * @cfg {String} radiusField 
         * The store record field name for the radial axes in radar charts,
         * or the radius of the slices in pie charts.
         */
        radiusField: null,
 
        xAxis: null,
 
        yAxis: null
    },
 
    directions: ['X', 'Y'],
    fieldCategoryX: ['X'],
    fieldCategoryY: ['Y'],
 
    deprecatedConfigs: {
        field: 'angleField',
        lengthField: 'radiusField'
    },
 
    constructor: function (config) {
        var me = this,
            configurator = me.self.getConfigurator(),
            configs = configurator.configs,
            p;
 
        if (config) {
            for (in me.deprecatedConfigs) {
                if (in config && !(config in configs)) {
                    Ext.raise("'" + p + "' config has been deprecated. Please use the '" +
                        me.deprecatedConfigs[p] + "' config instead.");
                }
            }
        }
        me.callParent([config]);
    },
 
    getXField: function () {
        return this.getAngleField();
    },
 
    updateXField: function (value) {
        this.setAngleField(value);
    },
 
    getYField: function () {
        return this.getRadiusField();
    },
 
    updateYField: function (value) {
        this.setRadiusField(value);
    },
 
    applyXAxis: function (newAxis, oldAxis) {
        return this.getChart().getAxis(newAxis) || oldAxis;
    },
 
    applyYAxis: function (newAxis, oldAxis) {
        return this.getChart().getAxis(newAxis) || oldAxis;
    },
 
    getXRange: function () {
        return [this.dataRange[0], this.dataRange[2]];
    },
 
    getYRange: function () {
        return [this.dataRange[1], this.dataRange[3]];
    },
 
    themeColorCount: function() {
        var me = this,
            store = me.getStore(),
            count = store && store.getCount() || 0;
 
        return count;
    },
 
    isStoreDependantColorCount: true,
 
    getDefaultSpriteConfig: function () {
        return {
            type: this.seriesType,
            renderer: this.getRenderer(),
            centerX: 0,
            centerY: 0,
            rotationCenterX: 0,
            rotationCenterY: 0
        };
    },
 
    applyRotation: function (rotation) {
        return Ext.draw.sprite.AttributeParser.angle(Ext.draw.Draw.rad(rotation));
    },
 
    updateRotation: function (rotation) {
        var sprites = this.getSprites();
 
        if (sprites && sprites[0]) {
            sprites[0].setAttributes({
                baseRotation: rotation
            });
        }
    }
});