/*
ajax запрос для проверки и отображения доп вычислений для всех полей в edit_field.php
 */

$(document).ready(function() {
    var option = document.querySelector('select[name="cb_super_dev"] option[value="2"]')
    var ajaxQueue = [];
    var MAX_SIMULTANEOUS_REQUESTS = 3;
    var currentRequests = 0;

    /**
     * Обрабатывает очередь AJAX-запросов, выполняя не более заданного количества одновременных запросов.
     * @returns {void}
     */
    function processQueue() {
        if (currentRequests < MAX_SIMULTANEOUS_REQUESTS && ajaxQueue.length > 0) {
            currentRequests++;
            var request = ajaxQueue.shift();
            if(request) {
                $.ajax(request).always(function() {
                    currentRequests--;
                    processQueue();
                });
            } else {
                processQueue();
            }
        }
    }

    /**
     * Добавляет AJAX-запрос в очередь и инициирует его обработку.
     * @param {Object} request Объект запроса, содержащий параметры для выполнения AJAX-запроса.
     * @returns {void}
     */
    function addToQueue(request) {
        ajaxQueue.push(request);
        processQueue();
    }

    /**
     * Инициализирует AJAX-запрос для получения данных о действиях, связанных с полем, и добавляет его в очередь запросов.
     * @param {string} searchRequest Строка запроса, содержащая параметры для идентификации поля и связанных с ним действий.
     * @returns {void}
     */
    function prepareAndLoad(element) {
        var $this = $(element);
        var searchRequest = $this[0].search;
        //вычисляем fieldId из запроса
        var fieldId = searchRequest.substr(searchRequest.indexOf("field=") + 6);
        var container = $(`.preloaderBlockForCalcs${fieldId}`);

        container.find('.preloader__block').remove();

        var $link; 
        if (container.find(`.mouseHoverTip${fieldId}`).length === 0) {
            //создаем структуру для заполнения
            var $tipWrapper = $('<span>', { class: `mouseHoverTip mouseHoverTip${fieldId}` }).appendTo(container);
            
            $link = $('<a>', {
                class: 'fieldTipLink mouseHoverTipLink fieldTipLinkGray fieldTipLinkMarginLeft',
                text: 'php',
                title: 'Ожидает загрузки... (Наведите, чтобы загрузить сейчас)',
                tabindex: '-1',
                style: 'color: #ccc;'
            }).appendTo($tipWrapper);
        } else {
            $link = container.find(`.mouseHoverTip${fieldId} a.fieldTipLink`);
        }

        var request = {
            method: 'GET',
            url: 'edit_field_actions.php' + searchRequest,
            headers: {
                'X-Content-Exists': '1',
                'Content-Type': 'application/json; charset=utf-8'
            },
            success: function(resp) {
                var $wrapper = $(`.mouseHoverTip${fieldId}`);
                var $activeLink = $wrapper.find('a.fieldTipLink');

                //если хоть какое-то действие существует, тогда создаем ссылку php
                var hasActions = (resp['buttons'].length != 0 || resp['calcs'].length != 0 || resp['reports'].length != 0 || resp['crons'].length != 0 || resp['ext_files'].length != 0);

                if (hasActions) {
                    $activeLink.removeData('pendingRequest');
                    $activeLink.off('mouseenter.priorityLoad');

                    if (container.attr('group_id') == 1) {
                        $activeLink
                            .removeClass('fieldTipLinkGray')
                            .addClass('fieldTipLinkGreen')
                            .attr('title', 'Открыть действие')
                            .attr('tabindex', '1')
                            .css({'color': '', 'cursor': 'pointer', 'text-decoration': ''});
                    } else {
                        $activeLink.css({'color': 'black', 'cursor': 'default'}).attr('title', '');
                    }

                    //проверяем если в ответе есть действия
                    for (item in resp) {
                        if (resp[item].length != 0) {
                            var titleParagraph = `<p class="paragraphInPHPLinks">${resp[item]['title']}:</p>`
                            if ($wrapper.find(`.mouseHoverAnswer${fieldId}`).length === 0) {
                                $('<span>', { class: `mouseHoverAnswer mouseHoverAnswer${fieldId}` }).appendTo($wrapper);
                            }
                            $(`.mouseHoverAnswer${fieldId}`).append(titleParagraph);
                            fillCalcs(resp[item], item, fieldId);
                        }
                    }

                    $activeLink.on("click", function () {
                        $(document).find('span.mouseHoverAnswer , span.mouseHoverAnswer-left').hide();
                        $(this).next().removeClass('mouseHoverAnswer').addClass('mouseHoverAnswer-left a-top').css('display','block');
                    });

                } else {
                    $wrapper.remove();
                }

                //удаляем прелодер
                $('.preloader__block').remove();
                if($('.hide-while-loading')) $('.hide-while-loading').removeClass('hide-while-loading');
            },
            error: function() {
                $(`.mouseHoverTip${fieldId}`).remove();
            }
        };

        $link.data('pendingRequest', request);

        $link.on('mouseenter.priorityLoad', function() {
            var $thisLink = $(this);
            var req = $thisLink.data('pendingRequest');

            var queueIndex = ajaxQueue.indexOf(req);

            if (queueIndex > -1) {
                ajaxQueue.splice(queueIndex, 1);

                $thisLink.css('color', '#999'); 

                $.ajax(req).always(function() {
                    processQueue();
                });
            }
        });
        
        addToQueue(request);
    }

    if (option && option.hasAttribute('selected')) {
        //из элемента берем путь для запроса, там ?table_id=111&field_id=1111
        if ($('.cb_super_user a').length) {
            $('.cb_super_user a').each(function () { prepareAndLoad(this); });
        } else if ($('form a.cb_field_title__link').length) {
            $('form a.cb_field_title__link').each(function () { prepareAndLoad(this); });
        } else {
            $('.preloader__block').remove();
            if($('.hide-while-loading')) $('.hide-while-loading').removeClass('hide-while-loading');
        }
    }

    setTimeout(function(){
        if (ajaxQueue.length === 0 && currentRequests === 0) {
             $('.preloader__block').remove();
             $('.hide-while-loading').removeClass('hide-while-loading');
        }
    }, 1000);

    //заполняем поля
    function fillCalcs(response, item, fieldId) {
      var resultLink = "";

       // цикл по элементам ответа
      for (let i in response) {
        //шагаем по массиву действий
        if (i == "title") continue;
        for (let elem in response[i]) {
          resultLink += sumCalcs(item, response[i][elem]['id'], response[i][elem]['name'], response[i][elem]['ko'] ? "" : response[i][elem]['code'], response[i][elem]['help']);
        }
      }
      $(`.mouseHoverAnswer${fieldId}`).append(resultLink);
    }

    //заполнение ссылок
    function sumCalcs(item, actionId, actionName, actionCode, actionHelp) {
        var link = "";
        switch (item) {
            case "buttons": link = `<a target='_blank' href='edit_button.php?button=${actionId}' title='${actionHelp}'>${actionName}</a>&nbsp;(<a style='cursor: pointer;' onclick=\"open_calc('part=button_php&button=${actionId}',0);return false;\">${actionCode}</a>)`; break;
            case "calcs": link = `<a target='_blank' href='edit_calc.php?calc_id=${actionId}' title='${actionHelp}'>${actionName}</a>&nbsp;(<a style='cursor: pointer;' onclick=\"open_calc('calc_id=${actionId}',0);return false;\">${actionCode}</a>)`; break;
            case "reports": link = `<a target='_blank' href='edit_report.php?report=${actionId}' title='${actionHelp}'>${actionName}</a>` + (actionCode != '' ? `(&nbsp;<a style='cursor: pointer;' onclick=\"open_calc('report=${actionId}&part=report_code',0);return false;\">${actionCode}</a>)` : ''); break;
            case "crons": link = `<a target='_blank' href='edit_cron.php?cron_id=${actionId}' title='${actionHelp}'>${actionName}</a>&nbsp;(<a style='cursor: pointer;' onclick=\"open_calc('cron_id=${actionId}&part=cron_php',0);return false;\">${actionCode}</a>)`; break;
            case "ext_files": link = `<a style='cursor: pointer;' onclick=\"open_calc('ext_file_id=${actionId}',0);return false;\">${actionName}</a>`; break;
        }
        return link + "<br/>";
    }
});