
var bdgHelper = bdgHelper||{};
var  _actualDatesData = {"curYear":2026} || {};

var bdgHelper = bdgHelper || {};
var _actualDatesData = _actualDatesData || false;

function getPointPlacement(groupsCount) {
    var opts = {
        '2': [0.25, -0.25],
        '4': [0.26, 0.11, -0.10, -0.24],
        '6': [0.435, 0.27, 0.10, -0.09, -0.23, -0.39]
    };

    return opts[groupsCount];
}

function getColors(chartType) {
    var opts = {
        'main_chart': [
            '#d6dade',
            '#1f589a',
            '#d6dade',
            '#1f589a'
        ],
        'income': [
            '#d6dade',
            '#93D3C7',
            '#38b9a0',
            '#d6dade',
            '#87A3C4',
            '#1f589a'
        ],
        'outcome': [
            '#d6dade',
            '#feebba',
            '#fdd973',
            '#d6dade',
            '#87A3C4',
            '#1f589a'
        ],
        'diff': [
            '#d6dade',
            '#f2b5b8',
            '#e76b71',
            '#d6dade',
            '#87A3C4',
            '#1f589a'
        ]
    };

    return opts[chartType];
}

function getCategoryArray(type) {
    var _baseYear = 2020;

    if (_actualDatesData && _actualDatesData['curYear'] >= _baseYear) {
        _baseYear = Number(_actualDatesData['curYear']) || _baseYear;
    }

    function gY(diff) {
        return '' + (_baseYear + diff);
    }

    var _OLD_YEARS_ARRAY = [gY(-3), gY(-2), gY(-1)];
    var _CURRENT_YEAR = [gY(0)];
    var _FUTURE_YEARS_ARRAY = [gY(1), gY(2)];
    var result = [];

    switch (type) {
        case 'old': {
            result = result.concat(_OLD_YEARS_ARRAY);
            break;
        }
        case 'now': {
            result = result.concat(_CURRENT_YEAR);
            break;
        }
        case 'future': {
            result = result.concat(_FUTURE_YEARS_ARRAY);
            break;
        }
        case 'old-now': {
            result = result.concat(_OLD_YEARS_ARRAY, _CURRENT_YEAR);
            break;
        }
        case 'now-future': {
            result = result.concat(_CURRENT_YEAR, _FUTURE_YEARS_ARRAY);
            break;
        }
        case 'old-now-future': {
            result = result.concat(_OLD_YEARS_ARRAY, _CURRENT_YEAR, _FUTURE_YEARS_ARRAY);
            break;
        }
    }

    return result;
}

var getNum = function (x) {
    var num = x;
    if (!num && num !== 0) return null;
    if (typeof x !== 'number') {
        if (typeof x !== 'string') {
            return null;
        }
        num = parseFloat(x);
    }
    if (isNaN(num) || !isFinite(num)) {
        return null
    }
    return num;
};

function getInMlnNum(num, fix) {
    var x = getNum(num);
    if(x === null) {
        return null;
    }
    var mln = x / Math.pow(10, 6);
    if (fix === void(0)) {
        fix = [mln >= 1, mln >= 0.1, mln >= 0.001, true].indexOf(true);
    }
    if(!fix) {
        mln = Math.round(mln);
    } else {
        mln = Number(mln.toFixed(fix));
    }

    return mln;
}

if ($.isEmptyObject(bdgHelper)) {

    var spacesRegex = /\B(?=(\d{3})+(?!\d))/g;
    var NULL_NUMBER_FORMAT = '-';
    var SPACE_NUMBER_FORMAT = '\xa0';

    bdgHelper.defaultChartOpts = {
        chart: {
//                type: 'column',
            borderColor: '#d4e6ec',
            borderRadius: 0,
            borderWidth: 1,
            spacing: [50, 50, 20, 20],
            backgroundColor: 'transparent'
        },
        credits: {
            enabled: false
        },
        exporting: {
            //enabled: false
        },
        title: {
            text: ''
        },
        subtitle: {
            text: ''
        },
//            colors: ['#058DC7', '#50B432', '#ED561B', '#DDDF00', '#24CBE5', '#64E572',
//                '#FF9655', '#FFF263', '#6AF9C4'],
        xAxis: {
            categories: [],
            labels: {
                style: {
                    color: '#4c5c6e'
                }
            }
        },
        yAxis: {
            title: {
                text: ''
            },
            labels: {
                style: {
                    color: '#4c5c6e'
                }
            }
        },
        plotOptions: {
            column: {
                //groupPadding: 0,
                pointPadding: 0,    // in one group
                borderWidth: 0
            }
        },
        series: []

    };

    bdgHelper.templateOptions = {
        fact: {
            chart: {
                type: 'column'
            },
            colors: [
                '#d6dade',
                '#1f589a',
                '#87cefa',
                '#888888'
            ],
            xAxis: {
                gridLineColor: 'transparent',
                categories: []
            },
            yAxis: {
                gridLineColor: 'transparent'
            },
            tooltip: {
                headerFormat: '<span style="font-size:10px">{point.key}</span><table>',
                pointFormat: '<tr><td style="color: #4c5c6e;padding:0">{series.name}: </td>' +
                '<td style="padding:0; text-align: right"><b>{point.y}</b></td></tr>',
                footerFormat: '</table>',
                shared: true,
                useHTML: true
            }

        },
        pie: {
            chart: {
                plotBackgroundColor: null,
                plotBorderWidth: null,
                plotShadow: false
            },
            tooltip: {
                pointFormat: '{series.name}: <b>{point.y}</b> ({point.percentage:.2f}%)'
            },
            plotOptions: {
                pie: {
                    allowPointSelect: true,
                    cursor: 'pointer',
                    dataLabels: {
                        enabled: false
                    },
                    showInLegend: true
                }
            },
            series: [{
                type: 'pie',
                name: ' ',
                data: []
            }]
        }
    };
    bdgHelper.chartBuilder = function (chartTarget, nil, options) {
        function asyncAjax() {
            var dfd = new jQuery.Deferred();
            var showConstData = function () {
                if (options.constData) {
                    dfd.resolve(options.constData);
                }
                dfd.reject();
            };
            var localUrl = options.dataUrl || options.constDataUrl;
            if (localUrl) {
                $.ajax({
                    url: localUrl, success: function (data) {
                        dfd.resolve(typeof data === 'string' ? JSON.parse(data) : data);
                    }, error: function () {
                        showConstData();
                    }
                });
            }
            else {
                showConstData();
            }
            return dfd.promise();
        }

        $.when(asyncAjax()).then(function (incData) {
                var incDataIsArr = incData instanceof Array;
                var ajaxData = $.extend(true, (incDataIsArr ? [] : {}), incData);
                if (typeof options.ajaxDataMod === 'function') {
                    ajaxData = options.ajaxDataMod(ajaxData)
                }
                var chartData = $.extend(true, (incDataIsArr ? [] : {}), ajaxData),
                    categories = options.categories || [],
                    hasDrilldown = !!options.drilldown;


                if (typeof options.chartDataMod === 'function') {
                    chartData = options.chartDataMod(chartData)
                }


                var opts = $.extend(true,
                    {},
                    (options.noDefOpts ? {} : bdgHelper.defaultChartOpts),
                    bdgHelper.templateOptions[options.chartTemplate] || {},
                    options.chartOptions
                );

                opts.series = chartData;
                if (opts.yAxis && opts.yAxis.hasOwnProperty('categories')) {
                    opts.yAxis.categories = categories;
                }
                if (opts.xAxis && opts.xAxis.hasOwnProperty('categories')) {
                    opts.xAxis.categories = categories;
                }
                if (typeof options.optionsMod === 'function') {
                    opts = options.optionsMod(opts);
                }
                if (hasDrilldown && opts.plotOptions.column) {

                    (function (buildDrill) {
                        _.extend(opts.plotOptions.column, {
                            point: {
                                events: {
                                    click: function () {
                                        var drl = this.drill;
                                        var drilldownData = null;
                                        if (drl && drl.series) {
                                            drilldownData = _.extend([], drl.series);
                                            if (typeof options.drilldownDataMod === 'function') {
                                                drilldownData = options.drilldownDataMod(drilldownData);
                                            }
                                            buildDrill(drilldownData, drl.id);
                                        }
                                    }
                                }
                            }
                        });
                    })(getQuarterDrillBuilder(
                        typeof options.drilldown === 'object' && options.drilldown.target || chartTarget,
                        options,
                        typeof options.drilldown === 'object' && options.drilldown.colors || options.chartOptions.colors || ['#000']));
                }


                $(chartTarget).empty().highcharts(opts);
            },
            //if error in ajax
            function () {
                $(chartTarget).empty().append('Ошибка получения данных');
            }
        );
    };
    bdgHelper.modFuncCollection = {
        tableWithPercentage: function buildTable(categories, tableData) {
            var tabl = $('<table class="e_table"/>'),
                th = $('<tr class="e_table_header"><td class="e_table_header_cell m_table_cross">Бюджетный период</td></tr>');
            //theader

            tabl.append(th);
            $.each(categories, function (a) {
                th.append('<td class="e_table_header_cell" style="text-align: center;">' + categories[a] + '</td>');
            });
            //custom
            th.append('<td style="text-align: center;">Доля в ' + categories[0] + ', %</td>');

            //tbody
            $.each(tableData, function (a) {
                var obj = this;
                var tr = $('<tr class="b_budget e_table_row ' + ((a % 2) ? 'm_row_even' : 'm_row_odd') + '"><td class="e_table_cell m_table_row_name">' + obj.name + '</td></tr>');
                $.each(obj.data, function (a) {
                    tr.append($('<td class="e_table_cell">' + obj.data[a] + '</td>'));
                });
                //custom
                var percentTd = $('<td class="e_table_cell"></td>');
                tr.append(percentTd);
                var txt = '';
                if (a == 0) {
                    txt = '100';
                }
                else {
                    txt = (100 * tableData[a].data[0] / tableData[0].data[0]).toFixed(2);
                }
                percentTd.text(txt);

                tabl.append(tr);
            });
            return tabl;
        }
    };

    bdgHelper.intFormatter = function intWithSpaces(numerable) {
        var x = Math.round(getNum(numerable));
        if (x === null) {
            return NULL_NUMBER_FORMAT;
        }
        return x.toString().replace(spacesRegex, SPACE_NUMBER_FORMAT);
    };

    bdgHelper.floatFormatter = function numberWithSpaces(numerable, preccesion) {
        if (preccesion === void(0)) {
            preccesion = 2;
        }
        var x = getNum(numerable);
        if (x === null) {
            return NULL_NUMBER_FORMAT;
        }
        var parts = x.toFixed(preccesion).split(".");
        parts[0] = parts[0].replace(spacesRegex, SPACE_NUMBER_FORMAT);
        return parts.join(".");
    };
}


