$(document).ready(function(){

    var
        $table = $('#table-line'),
        $tableContent = $('<tbody>'),
        $tableBody = $table.find('tbody').first(),
        activeLines = [],
        currentActiveLine,
        currencyFields = ['admoney', 'salemoney', 'usdollarmoney', 'localmoney', 'AdMoney', 'OrderSum', 'Price'],
        notFormatFields = ['Timestamp', 'Basket'],
        dateTimeFields = ['Timestamp', 'period'];
        
    // Шаблон содержимого ячейки Basket
    var templateBasketContent = _.template('\n'+
    '       <div class="b-basket-content">   \n' +
    '       <table>   \n' +
    '           <tbody>   \n' +
    '           <% _.each(data, function(item) { %>   \n' +
    '               <tr>   \n' +
    '                   <td><a class="basket-link" href="<%=item.URL %>" target="_blank"><%=item.Title %></a></td>   \n' +
    '                   <td><span class="quantity"><%=item.Quantity %></span></td>   \n' +
    '                   <td><span class="price"><%=formatPrice(item.Price) %></span></td>   \n' +
    '               </tr>   \n' +
    '           <% }) %>  \n' +
    '           </tbody>   \n' +
    '       </table>   \n' +
    '       </div>  \n' +
    '');
    
    // Шаблон ячейки Время-Дата
    var templateTimestampContent = _.template('\n'+
    '           <b><%=data.time %></b><br />   \n' +
    '           <span><%=data.date %></span><br />   \n' +
    '');
    
    
    function valueFormat(value)
    {
        var
            isCurrencyValue = currencyFields.indexOf(currentActiveLine) > -1,
            isNonFormatValue = notFormatFields.indexOf(currentActiveLine) > -1,
            format = (isCurrencyValue) ? d3.format(',.0f') : d3.format(',.0f');
    
        if (isNonFormatValue) {
            return value;
        }
    
        if (isCurrencyValue) {
            return format(value) + ' грн.';
        } else {
            return format(value);
        }
    }
    
    function getDateValue(dataDate)
    {
        return dataDate.split(' ')[0];
    }
    function getHourMinValue(dataDate)
    {
        var
            timeVal = dataDate.split(' ')[1].split(':'),
            timeValCorrected = timeVal[0]+':'+timeVal[1];
        return timeValCorrected;
    }
    
    function RenderInterval(dataLineChartStat)
    {
        var
            dataTable = dataLineChartStat,
            dataPeriod = dataLineChartStat['period'],
            dataTableForSort = [],
            $selectedField = $('thead th b.selected', $table),
            sortField = false,
            isDesc = true;
        
        /*
        dataTable = {};
        for (var key in dataLineChartStat) {
            dataTable[key] = dataLineChartStat[key];
        }
        */
        
        // Определение поля для сортировки строк в таблице:
        if ($selectedField.length > 0) {
            sortField = $selectedField.attr('id');
            isDesc = $selectedField.hasClass('desc');
        }
        if (!sortField) {
            switch(dataLineChartStat.report) {
                case 'common':
                    sortField = 'period';
                    isDesc = true;
                break;
                case 'transaction':
                    sortField = 'Timestamp';
                    isDesc = true;
                break;
                default:
                    sortField = 'period';
                    isDesc = true;
                break;
            }
        }
        //console.log('AAA sortField = ', sortField, '  isDesc = ', isDesc);
        
        // Подготовка данных для сортировки:
        dataPeriod.forEach(function(dataTableItem, ind){
            var dataTableSortItem = {};
            dataTableSortItem['period'] = dataTableItem;
            activeLines.forEach(function(activeLine){
                dataTableSortItem[activeLine] = dataTable[activeLine][ind];
            });
            dataTableForSort.push(dataTableSortItem);
        });
        
        // Сортировка данных для таблицы:
        dataTableForSort.sort(function(a,b){
            if (dateTimeFields.indexOf(sortField) > -1) {
                var
                    aT = new Date(a[sortField]),
                    bT = new Date(b[sortField]);

                return (isDesc) ? bT-aT : aT-bT;
            } else {
                return (isDesc) ? b[sortField]-a[sortField] : a[sortField]-b[sortField];
            }
        });
        //console.log('AAA dataTableForSort = ', dataTableForSort);

        // Отрисовка таблицы:
        dataTableForSort.forEach(function(item){
            $row = $('<tr>');
            $row.append($('<td>').html(item['period']));
            activeLines.forEach(function(line){
                if (line == 'Basket') {
                    var dataBasket = item[line];
                    currentActiveLine = 'Price';
                    $row.append($('<td class="'+ line +'">').append(templateBasketContent({data: dataBasket, formatPrice: valueFormat})));
                } else if (line == 'Timestamp') {
                    $row.append($('<td class="'+ line +'">').append(templateTimestampContent({
                        data: {date: getDateValue(item[line]), time: getHourMinValue(item[line])}
                    })));

                } else {
                    currentActiveLine = line;
                    $row.append($('<td class="'+ line +'">').html(valueFormat(item[line])));
                }
            });
            $row.appendTo($tableContent);
        });
        
        // Добавляем строку "Итого" для отчета 'common':
        if (dataLineChartStat.report == 'common') {
        
            $row = $('<tr class="total">');
            $row.append($('<td>').html("Итого"));
            
            activeLines.forEach(function(item){
                currentActiveLine = item;
                var isNotSumValue = notFormatFields.indexOf(currentActiveLine) > -1;

                if (!isNotSumValue) {
                    var totalValue = 0;
                    for(var i = dataPeriod.length-1; i >= 0; i--) {
                        totalValue += dataTable[item][i];
                    }
                } else {
                    totalValue = '';
                }

                $row.append($('<td>').html(valueFormat(totalValue)));
            });
            $row.appendTo($tableContent);
        }
        
        // Добавляем строку "Всего заказов" для отчета 'transaction':
        if (dataLineChartStat.report == 'transaction') {
        
            $row = $('<tr class="total-orders">');
            $row.append($('<td>').html("Всего заказов: " + dataPeriod.length));
            
            activeLines.forEach(function(item){
                currentActiveLine = item;
                var isNotSumValue = notFormatFields.indexOf(currentActiveLine) > -1;

                if (!isNotSumValue) {
                    var totalValue = 0;
                    for(var i = dataPeriod.length-1; i >= 0; i--) {
                        totalValue += dataTable[item][i];
                    }
                } else {
                    totalValue = '';
                }

                $row.append($('<td class="'+ item +'">').html(valueFormat(totalValue)));
            });
            $row.appendTo($tableContent);
        }
        
    }
    
    $.extend({
        TableStat: {
            Render: function(dataLineChartStat) {
                
                // Формируем список переключателей (категорий) activeLines:
                activeLines = [];
                $('thead.metric.sortable th b.cat', $table).each(function(){
                    activeLines.push($(this).attr('id'));
                });
               
                //console.log('AAA TableStat render: ', dataLineChartStat);
                //console.log('AAA activeLines: ', activeLines);
                

                if (dataLineChartStat.type == 'interval') {
                    RenderInterval(dataLineChartStat);
                }

                if (dataLineChartStat.report == 'transaction') {
                    RenderInterval(dataLineChartStat);
                }

                $tableBody.html('').append($tableContent.children());
                
            },
            // Определяем список категорий, отмеченных галочками в таблице:
            CheckedCategories: function() {
                var listCats = [];
                $('thead.metric.sortable th input[type="checkbox"]', $table).each(function(){
                    if ($(this).is(":checked")) {
                        listCats.push($(this).data('field'));
                    }
                });
                return listCats;
            },
            
        }
    });

});

