/**
 * Записать в корзину (создать корзину, если не существует)
 */
function cart_write(supply_id, delivery, amount = 1) {
    // Инициализация
    let data = {};
    data['supply_id'] = supply_id;
    data['amount'] = amount;
    data['delivery'] = delivery;
    data['_csrf'] = yii.getCsrfToken();

    $.ajax({
        url: '/order/write',
        type: 'post',
        dataType: 'json',
        data: data,
        success: cart_response_success,
        error: cart_response_error
    });

    // Пересчет количества товаров в корзине для кнопки в меню
    setTimeout(cart_count, 500);

    return false;
};

/**
 * Удалить корзину
 */
function cart_delete() {
    $.ajax({
        url: '/order/delete',
        type: 'post',
        dataType: 'json',
        data: {
            '_csrf': yii.getCsrfToken()
        },
        success: cart_response_success,
        error: cart_response_error
    });

    // Пересчет количества товаров в корзине для кнопки в меню
    setTimeout(cart_count, 500);

    return false;
};

/**
 * Сформировать заказ
 */
function cart_request() {
    $.ajax({
        url: '/order/request',
        type: 'post',
        dataType: 'json',
        data: {
            '_csrf': yii.getCsrfToken()
        },
        success: cart_response_success,
        error: cart_response_error
    });

    // Пересчет количества товаров в корзине для кнопки в меню
    setTimeout(cart_count, 500);

    return false;
};

/**
 * Управление чекбоксами
 */
function cart_list_checkbox(target) {
    // Инициализация
    let elements = document.getElementsByClassName('cart_list_target');
    let reg = /^\w+_([^_]*)$/;
    let catn = reg.exec(target.id)[1];

    if (catn === 'all') {
        if (target.checked === true) {
            for ($i = 0; $i < elements.length; $i++) {
                // Перебор всех выбранных элементов

                elements[$i].getElementsByTagName('input')[0].checked = true;
            };

            target.checked = true;
        } else {
            for ($i = 0; $i < elements.length; $i++) {
                // Перебор всех выбранных элементов

                elements[$i].getElementsByTagName('input')[0].checked = false;
            };

            target.checked = false;
        };

        return false;
    };
};

/**
 * Удалить из корзины
 */
function cart_list_delete(target, amount = 0) {
    // Инициализация
    let targets = {};

    if (target !== undefined) {
        // Обработка входных параметров

        targets[target] = amount;
    } else {
        // Обработка выбранных элементов в списке

        // Инициализация
        let elements = document.getElementsByClassName('cart_list_target');
        let reg = /^\w+_([^_]*)$/;

        for ($i = 0; $i < elements.length; $i++) {
            // Перебор всех выбранных элементов

            // Инициализация
            let checkbox = elements[$i].getElementsByTagName('input')[0];

            if (checkbox.checked === true) {
                targets[reg.exec(checkbox.id)[1]] = 0;
            };
        };
    };

    $.ajax({
        url: '/order/delete',
        type: 'post',
        dataType: 'json',
        data: {
            '_csrf': yii.getCsrfToken(),
            'targets': targets
        },
        success: cart_response_success,
        error: cart_response_error
    });

    // Реинициализация
    document.getElementById('cart_list_action').value = 'none';

    // Пересчет количества товаров в корзине для кнопки в меню
    setTimeout(cart_count, 500);

    // Пересчитывание стоимости
    cart_cost_calculate();

    return false;
};

/**
 * Изменить количество товара в корзине
 */
function cart_list_amount_update(target, type, input) {
    if (target !== undefined && target !== null && type !== undefined && type !== null && input !== undefined && input !== null) {
        // Обработка входных параметров

        // Инициализация
        let targets = {};
        targets[target] = {};
        targets[target][type] = input.value;

        $.ajax({
            url: '/order/amount-update',
            type: 'post',
            dataType: 'json',
            data: {
                '_csrf': yii.getCsrfToken(),
                'targets': targets
            },
            success: cart_response_success,
            error: cart_response_error
        });

        // Пересчет количества товаров в корзине для кнопки в меню
        setTimeout(cart_count, 500);

        // Пересчитывание стоимости
        cart_cost_calculate();
    };

    return false;
};

/**
 * Подсчёт стоимости
 */
function cart_cost_calculate() {
    const elements = document.getElementsByClassName('cart_list_target');
    const reg = /^([0-9]*)\s*\w*/;
    let costs = 0;

    for ($i = 0; $i < elements.length; $i++) {
        // Перебор товаров в корзине

        const cost = elements[$i].getElementsByTagName('div')[8].innerText;
        const amount = elements[$i].getElementsByTagName('div')[6].children[0].value;

        costs += +reg.exec(cost)[1] * amount;
    };

    document.getElementById('cart_cost').innerHTML = costs;
};

/**
 * Изменить количество товара в корзине
 */
function cart_list_comment_edit(catn, type, element) {
    if (catn !== undefined && catn !== null && type !== undefined && type !== null && element !== undefined && element !== null) {
        // Инициализация textarea
        element.innerHTML = '<textarea id="' + element.id + '-textarea" class="mb-1 form-control" cols="50" rows="5" maxlength="300" onchange="return cart_list_comment_save(\'' + catn + '\', \'' + type + '\', this.parentElement)">' + element.innerText + '</textarea>';

        element.removeAttribute('onclick');

        // Инициализация счетчика
        let counter = document.createElement('p');

        counter.setAttribute('id', element.id + '-textarea-counter');
        counter.setAttribute('class', "text-right");

        // Инициализация значения текущего количества символов
        let counter_current = document.createElement('span');

        counter_current.setAttribute('id', element.id + '-textarea-counter-current');
        counter_current.innerText = document.getElementById(element.id + '-textarea').value.length;

        // Инициализация разделителя между текущим и максимальным значениями
        let counter_delimiter = document.createElement('span');

        counter_delimiter.innerText = ' / ';

        // Инициализация значения максиального количества символов
        let counter_maximum = document.createElement('span');

        counter_maximum.setAttribute('id', element.id + '-textarea-counter-maximum');
        counter_maximum.innerText = 300;

        // Формирование счетчика
        counter.append(counter_current);
        counter.append(counter_delimiter);
        counter.append(counter_maximum);

        // Запись счетчика после textarea
        element.after(counter);

        // Инициализация счетчика
        initTextarea(
            '#' + element.id + '-textarea',
            '#' + counter_current.id,
            '#' + counter_maximum.id,
            function () {
                let textarea = document.getElementById(element.id + '-textarea');

                textarea.removeAttribute('onchange');
            },
            function () {
                let textarea = document.getElementById(element.id + '-textarea');

                textarea.setAttribute('onchange', 'return cart_list_comment_save(\'' + catn + '\', \'' + type + '\', this.parentElement)');
            });

        return false;
    };

    return true;
};

function cart_list_comment_save(catn, type, element) {
    if (catn !== null && catn !== undefined && type !== null && type !== undefined && element !== null && element !== undefined) {
        // Инициализация
        let text = element.children[0].value;

        // Обновление заголовка (предзагрузка)
        if (text.trim() == '') {
            element.innerHTML = 'Комментарий к заказу';
        } else {
            element.innerHTML = text;
        };

        // Деинициализация счетчика
        document.getElementById(element.id + '-textarea-counter').remove();

        // Запись аттрибута (предзагрузка)
        element.setAttribute('onclick', 'return cart_list_comment_edit(\'' + catn + '\', this);');

        $.ajax({
            url: '/cart/' + catn + '/edit/comm',
            type: 'post',
            dataType: 'json',
            data: {
                '_csrf': yii.getCsrfToken(),
                'type': type,
                'text': text
            },
            success: function (data, status, xhr) {
                // Заголовок
                if (data.comm !== undefined) {
                    // Обновление заголовка
                    element.innerHTML = data.comm;

                    // Запись аттрибута
                    element.setAttribute('onclick', 'return cart_list_comment_edit(\'' + catn + '\', this);');
                };

                cart_response_success(data, status, xhr);
            },
            error: cart_response_error
        });

        return false;
    };

    return true;
};

/**
 * Редактирование параметра
 *
 * @param {*} _key
 * @param {*} target
 * @param {*} value
 *
 * @returns
 */
function cart_registration_block_edit(_key, target, value) {
    $.ajax({
        url: `/${_key}/${target}/edit`,
        type: 'post',
        dataType: 'json',
        data: {
            '_csrf': yii.getCsrfToken(),
            'value': value
        },
        success: page_profile_response_success,
        error: page_profile_response_error
    });

    return false;
}


function cart_registration_entity_init(_key, wrap = 'cart_registration_entity_body') {
    // Инициализация содержимого блока "Заявки на регистрацию поставщиков"

    // Инициализация оболочки
    wrap = document.getElementById(wrap);

    $.ajax({
        url: '/' + _key + '/data',
        type: 'post',
        dataType: 'json',
        data: {
            '_csrf': yii.getCsrfToken(),
            _key
        },
        success: (data, status, xhr) => {
            // Обработка ответа

            if (data !== undefined) {
                // Получены данные с сервера

                if (data.data !== undefined && data.data !== null) {
                    // Найдены данные поставщиков

                    // Удаление данных в оболочке
                    wrap.innerHTML = null;

                    for (let html of cart_registration_entity_generate(data.data)) {
                        // Перебор сгенерированных HTML-элементов

                        // Запись в документ
                        wrap.appendChild(html);
                    }
                }
            }

            // Переход к остальным обработчикам
            cart_response_success(data, status, xhr);
        },
        error: cart_response_error
    });
}

function cart_registration_entity_generate(account) {
    // Инициализация буфера вывода
    let html = new Set;

    if (account !== undefined) {
        // Инициализация контейнера
        let container = document.createElement('div');
        container.setAttribute('class', 'row');

        // Инициализация первой строки
        let row_1 = document.createElement('div');
        row_1.setAttribute('class', 'row px-0');

        // Инициализация оболочки идентификатора аккаунта
        let wrap_id = document.createElement('p');
        wrap_id.setAttribute('class', 'mt-0 mb-2 px-3 row');

        // Инициализация ярлыка идентификатора аккаунта
        let label_id = document.createElement('b');
        label_id.setAttribute('class', '');
        label_id.innerText = 'Договор:';

        // Инициализация значения идентификатора аккаунта
        let value_id = document.createElement('span');
        value_id.setAttribute('class', 'ml-auto');

        // Инициализация колонки с основными данными аккаунта
        let block_info = document.createElement('div');
        block_info.setAttribute('class', 'col-6 pl-0 d-flex flex-column');

        // Инициализация ярлыка "NAME"
        let label_name = document.createElement('label');
        label_name.setAttribute('class', 'control-label');
        label_name.innerText = 'Контактное лицо';

        // Инициализация поля "NAME"
        let input_name = document.createElement('input');
        input_name.setAttribute('class', 'form-control button_clean mb-3');
        input_name.setAttribute('type', 'text');
        input_name.setAttribute('placeholder', 'Иванов Иван Иванович');
        input_name.setAttribute('onchange', 'return cart_registration_block_edit(' + account._key + ', "name", this.value);');
        input_name.value = account.name ?? '';

        // Инициализация ярлыка "BOSS"
        let label_boss = document.createElement('label');
        label_boss.setAttribute('class', 'control-label');
        label_boss.innerText = 'Директор';

        // Инициализация поля "BOSS"
        let input_boss = document.createElement('input');
        input_boss.setAttribute('id', 'boss');
        input_boss.setAttribute('class', 'form-control button_clean mb-3');
        input_boss.setAttribute('type', 'text');
        input_boss.setAttribute('placeholder', 'Иванов Иван Иванович');
        input_boss.setAttribute('onchange', 'return cart_registration_block_edit(' + account._key + ', "boss", this.value);');
        input_boss.value = account.boss ?? '';

        // Инициализация ярлыка "SIMC" (телефон)
        let label_simc = document.createElement('label');
        label_simc.setAttribute('class', 'control-label');
        label_simc.innerText = 'Телефон';

        // Инициализация поля "SIMC" (телефон)
        let input_simc = document.createElement('input');
        input_simc.setAttribute('id', 'simc');
        input_simc.setAttribute('class', 'form-control button_clean mb-3');
        input_simc.setAttribute('type', 'number');
        input_simc.setAttribute('onchange', 'return cart_registration_block_edit(' + account._key + ', "simc", this.value);');
        input_simc.value = account.simc ?? '';

        // Инициализация ярлыка "MAIL"
        let label_mail = document.createElement('label');
        label_mail.setAttribute('class', 'control-label');
        label_mail.innerText = 'Почта';

        // Инициализация поля "MAIL"
        let input_mail = document.createElement('input');
        input_mail.setAttribute('id', 'mail');
        input_mail.setAttribute('class', 'form-control button_clean mb-3');
        input_mail.setAttribute('type', 'mail');
        input_mail.setAttribute('onchange', 'return cart_registration_block_edit(' + account._key + ', "mail", this.value);');
        input_mail.value = account.mail ?? '';

        // Инициализация колонки с вторичными данными аккаунта
        let block_details = document.createElement('div');
        block_details.setAttribute('id', 'details');
        block_details.setAttribute('class', 'pr-0 col-6 d-flex flex-column');

        // Инициализация ярлыка "TAXN"
        let label_taxn = document.createElement('label');
        label_taxn.setAttribute('class', 'control-label');
        label_taxn.innerText = 'ИНН';

        // Инициализация поля "TAXN"
        let input_taxn = document.createElement('input');
        input_taxn.setAttribute('id', 'taxn');
        input_taxn.setAttribute('class', 'form-control button_clean mb-3');
        input_taxn.setAttribute('type', 'text');
        input_taxn.setAttribute('onchange', 'return cart_registration_block_edit(' + account._key + ', "taxn", this.value);');
        input_taxn.value = account.taxn ?? '';

        // Инициализация ярлыка "CNTG"
        let label_cntg = document.createElement('label');
        label_cntg.setAttribute('class', 'control-label');
        label_cntg.innerText = 'КПП';

        // Инициализация поля "CNTG"
        let input_cntg = document.createElement('input');
        input_cntg.setAttribute('id', 'cntg');
        input_cntg.setAttribute('class', 'form-control button_clean mb-3');
        input_cntg.setAttribute('type', 'text');
        input_cntg.setAttribute('onchange', 'return cart_registration_block_edit(' + account._key + ', "cntg", this.value);');
        input_cntg.value = account.cntg ?? '';

        // Инициализация ярлыка "FADD"
        let label_fadd = document.createElement('label');
        label_fadd.setAttribute('class', 'control-label');
        label_fadd.innerText = 'Фактический адрес';

        // Инициализация поля "FADD"
        let input_fadd = document.createElement('input');
        input_fadd.setAttribute('id', 'fadd');
        input_fadd.setAttribute('class', 'form-control button_clean mb-3');
        input_fadd.setAttribute('type', 'text');
        input_fadd.setAttribute('onchange', 'return cart_registration_block_edit(' + account._key + ', "fadd", this.value);');
        input_fadd.value = account.fadd ?? '';

        // Инициализация ярлыка "LADD"
        let label_ladd = document.createElement('label');
        label_ladd.setAttribute('class', 'control-label');
        label_ladd.innerText = 'Юридический адрес';

        // Инициализация поля "LADD"
        let input_ladd = document.createElement('input');
        input_ladd.setAttribute('id', 'ladd');
        input_ladd.setAttribute('class', 'form-control button_clean');
        input_ladd.setAttribute('type', 'text');
        input_ladd.setAttribute('onchange', 'return cart_registration_block_edit(' + account._key + ', "ladd", this.value);');
        input_ladd.value = account.ladd ?? '';

        // Инициализация ярлыка "COMP"
        let label_comp = document.createElement('label');
        label_comp.setAttribute('class', 'control-label');
        label_comp.innerText = 'Компания';

        // Инициализация поля "COMP"
        let input_comp = document.createElement('input');
        input_comp.setAttribute('id', 'comp');
        input_comp.setAttribute('class', 'form-control button_clean mb-3');
        input_comp.setAttribute('type', 'text');
        input_comp.setAttribute('onchange', 'return cart_registration_block_edit(' + account._key + ', "comp", this.value);');
        input_comp.value = account.comp ?? '';

        // Инициализация ярлыка "CNTC"
        let label_cntc = document.createElement('label');
        label_cntc.setAttribute('class', 'control-label');
        label_cntc.innerText = 'Дополнительная информация';

        // Инициализация поля "CNTC"
        let input_cntc = document.createElement('textarea');
        input_cntc.setAttribute('id', 'cntc');
        input_cntc.setAttribute('class', 'form-control button_clean h-100');
        input_cntc.setAttribute('style', 'resize: none;');
        input_cntc.setAttribute('type', 'text');
        input_cntc.setAttribute('onchange', 'return cart_registration_block_edit(' + account._key + ', "cntc", this.value);');
        input_cntc.value = account.cntc ?? '';

        // Инициализация оболочки найденного по геолокации города
        let wrap_city = document.createElement('p');
        wrap_city.setAttribute('class', 'mt-1 mb-2 px-3 row');

        // Инициализация ярлыка найденного по геолокации города
        let label_city = document.createElement('b');
        label_city.setAttribute('class', '');
        label_city.innerText = 'Город:';

        // Инициализация значения найденного по геолокации города
        let value_city = document.createElement('span');
        value_city.setAttribute('class', 'ml-auto');
        value_city.innerText = account.city ?? 'Неизвестно';

        // Компоновка элементов блока с основной информацией
        block_info.appendChild(label_name);
        block_info.appendChild(input_name);

        block_info.appendChild(label_simc);
        block_info.appendChild(input_simc);

        block_info.appendChild(label_mail);
        block_info.appendChild(input_mail);

        block_info.appendChild(label_cntc);
        block_info.appendChild(input_cntc);

        // Компоновка элементов блока с вторичными данными
        block_details.appendChild(label_boss);
        block_details.appendChild(input_boss);

        block_details.appendChild(label_comp);
        block_details.appendChild(input_comp);

        block_details.appendChild(label_taxn);
        block_details.appendChild(input_taxn);

        block_details.appendChild(label_cntg);
        block_details.appendChild(input_cntg);

        block_details.appendChild(label_fadd);
        block_details.appendChild(input_fadd);

        block_details.appendChild(label_ladd);
        block_details.appendChild(input_ladd);

        // Компоновка всех колонок
        container.appendChild(block_info);
        container.appendChild(block_details);

        html.add(container);
    }

    return html;
};

function cart_registration_choose(button = 'cart_registration_entity', account) {
    // Инициализация элементов
    let entity = document.getElementById('cart_registration_entity');
    let entity_button = document.getElementById('cart_registration_entity_button');
    let individual = document.getElementById('cart_registration_individual');
    let individual_button = document.getElementById('cart_registration_individual_button');

    // Деинициализация всех вкладок
    entity.checked = false;
    individual.checked = false;

    // Запись скриптов
    entity_button.setAttribute('onclick', 'cart_registration_choose(\'cart_registration_entity\', ' + account + '); cart_registration_entity_init(' + account + ')');
    individual_button.setAttribute('onclick', 'cart_registration_choose(\'cart_registration_individual\', ' + account + ')');

    // Удаление активного статуса
    document.querySelector('[for="cart_registration_entity"]').classList.remove('active');
    document.querySelector('[for="cart_registration_individual"]').classList.remove('active');

    // Инициализация запрошенной вкладки
    document.getElementById(button).checked = true;
    document.getElementById(button + '_button').removeAttribute('onclick');
    document.querySelector('[for="' + button + '"]').classList.add('active');
}

function cart_response(data, status, xhr) {
    // Обработка ответов

    main_response(data, status, xhr);
};

function cart_response_success(data, status, xhr) {
    // Обработка ответов от удавшихся запросов

    cart_response(data, status, xhr);
};

function cart_response_error(data, status, xhr) {
    // Обработка ответов от неудавшихся запросов

    // Инициализвация
    data = data.responseJSON;

    cart_response(data, status, xhr);
};

document.dispatchEvent(new CustomEvent("cart.loaded"));
