$(document).ready(function() {
let admA=$("#admA").val();
let kodA=$("#kodA").val();
    const canvas1 = $("#window1 canvas")[0];
    const canvas2 = $("#window2 canvas")[0];
    const canvas3 = $("#window3 canvas")[0];
    const canvas4 = $("#window4 canvas")[0];
    const canvas5 = $("#window5 canvas")[0];
    const canvas6 = $("#window6 canvas")[0];
    const ctx1 = canvas1.getContext('2d');
    const ctx2 = canvas2.getContext('2d');
    const ctx3 = canvas3.getContext('2d');
    const ctx4 = canvas4.getContext('2d');
    const ctx5 = canvas5.getContext('2d');
    const ctx6 = canvas6.getContext('2d');
    canvas1.width = window.innerWidth;
    canvas2.width = window.innerWidth;
    canvas3.width = window.innerWidth;
    canvas4.width = window.innerWidth;
    canvas5.width = window.innerWidth;
    canvas6.width = window.innerWidth;
    canvas1.height = window.innerHeight;
    canvas2.height = window.innerHeight;
    canvas3.height = window.innerHeight;
    canvas4.height = window.innerHeight;
    canvas5.height = window.innerHeight;
    canvas6.height = window.innerHeight;
function StartInstr(windowIndex)
{
let code = $("#window" + windowIndex + " textarea").val();
//alert('КОД---'+code);
if(code!=false)
{
$("#window"+windowIndex+" canvas").show();
code=code.replace(/```javascript|```/g, '').trim();
const cleanedCode = parseAICode(code,windowIndex);
const instructions = cleanedCode.split('\n').map(instruction => instruction.replace(/^ctx\./, '')).filter(instruction => instruction.trim() !== ''); // Убираем пустые строки
animateDrawing(instructions, 25,windowIndex); // Задержка 25 мс между действиями  
}     
}
function ClearHolst(windowIndex)
{
const canvasx = $("#window" + windowIndex + " canvas")[0];
const ctxx = canvasx.getContext('2d');
ctxx.clearRect(0, 0, canvasx.width, canvasx.height);
}
// Функция для парсинга и выполнения кода ИИ
    function parseAICode(code,windowIndex) {
        const ctxMethods = [
            'beginPath', 'moveTo', 'lineTo', 'arc', 'ellipse', 'stroke', 'fill', 'closePath',
            'fillRect', 'strokeRect', 'clearRect', 'fillText', 'strokeText', 'drawImage',
            'createLinearGradient', 'createRadialGradient', 'createPattern', 'save', 'restore',
            'scale', 'rotate', 'translate', 'transform', 'setTransform', 'resetTransform',
            'clip', 'isPointInPath', 'isPointInStroke', 'lineDashOffset', 'setLineDash',
            'getLineDash', 'bezierCurveTo', 'quadraticCurveTo'
        ];

        // Удаляем комментарии и пустые строки
        let cleanedCode = code.split('\n').map(line => line.trim()).filter(line => line && !line.startsWith('//')).join('\n');
        const parsedCode = cleanedCode.split('\n').map(line => {
            if (ctxMethods.some(method => line.startsWith(method))) {return `ctx.${line}`;}
            return line;
        }).join('\n');

        return parsedCode;
    }

  // Функция для анимации рисования
    function animateDrawing(instructions, delay = 100, windowIndex) 
    {
    //alert("ИНСТРУКЦИИ - "+instructions);
        let index = 0;
        function drawNext() {
            if (index < instructions.length) {
                try {
                    let currentInstruction = instructions[index];
// Заменяем 'canvas.width' на 'canvas1.width' и 'canvas.height' на 'canvas1.height'
currentInstruction = currentInstruction.replace(/\bcanvas\./g, 'canvas'+windowIndex+'.');
                    if(currentInstruction.includes('for')) 
                    {
                    // Выполняем цикл отдельно, чтобы избежать синтаксических ошибок
                    eval(currentInstruction);
                    } 
                    else 
                    {
              
if(windowIndex==1)
{
ctx1.shadowColor = 'rgba(0, 0, 0, 0.4)'; // Устанавливаем тень перед каждым действием
eval(`ctx1.${currentInstruction}`);
}
else if(windowIndex==2)
{
ctx2.shadowColor = 'rgba(0, 0, 0, 0.4)'; // Устанавливаем тень перед каждым действием
eval(`ctx2.${currentInstruction}`);
}
else if(windowIndex==3)
{
ctx3.shadowColor = 'rgba(0, 0, 0, 0.4)'; // Устанавливаем тень перед каждым действием
eval(`ctx3.${currentInstruction}`);
}
else if(windowIndex==4)
{
ctx4.shadowColor = 'rgba(0, 0, 0, 0.4)'; // Устанавливаем тень перед каждым действием
eval(`ctx4.${currentInstruction}`);
}
else if(windowIndex==5)
{
ctx5.shadowColor = 'rgba(0, 0, 0, 0.4)'; // Устанавливаем тень перед каждым действием
eval(`ctx5.${currentInstruction}`);
}
else if(windowIndex==6)
{
ctx6.shadowColor = 'rgba(0, 0, 0, 0.4)'; // Устанавливаем тень перед каждым действием
eval(`ctx6.${currentInstruction}`);
}

                    }

                    index++;
                    setTimeout(drawNext, delay);
                } catch (error) {
                    console.error("Ошибка при выполнении команды:", error, "Команда:", instructions[index]);
                }
            } 
        }
        drawNext();
    }


/*
let aiGeneratedCode = `
        // Ствол дерева
        fillStyle = '#8B4513'; // Цвет ствола дерева
        fillRect(500, 400, 50, 100); // Рисуем ствол

        // Листва дерева (основной корпус)
        beginPath();
        arc(525, 350, 75, 0, Math.PI * 2, true); // Основной круг для листвы
        fillStyle = '#228B22'; // Цвет листвы
        fill();
        closePath();

        // Верхний круг для листвы
        beginPath();
        arc(525, 300, 60, 0, Math.PI * 2, true); // Верхний круг для листвы
        fillStyle = '#2E8B57'; // Цвет листвы
        fill();
        closePath();

        // Рисуем дом
        fillStyle = '#D2691E'; // Цвет дома
        fillRect(650, 350, 100, 100); // Дом
        fillStyle = '#8B0000'; // Крыша
        beginPath();
        moveTo(650, 350);
        lineTo(700, 300);
        lineTo(750, 350);
        closePath();
        fill();

        // Рисуем горы
        fillStyle = '#A9A9A9'; // Цвет гор
        beginPath();
        moveTo(100, 500);
        lineTo(300, 300);
        lineTo(500, 500);
        closePath();
        fill();
    `;
$("#window1 textarea").val(aiGeneratedCode);
//$("#window" + windowIndex + " .vco canvas").html(data.response);
ClearHolst(1);
StartInstr(1);
*/
/*

$.ajax({
    url: 'file_arena/' + admA + '_1.txt',
    dataType: 'text',
    success: function(data) 
    {
    let aiGeneratedCode = data;
//alert(aiGeneratedCode);
//$("#window" + windowIndex + " .vco").html(aiGeneratedCode);
$("#window1 textarea").val(aiGeneratedCode);
ClearHolst(1);
StartInstr(1);
    }
});

*/















































    function updateGrid(columns) {
        let gridTemplateColumns;
        let gridTemplateRows;
        $(".toggle-button").removeClass("tgbtnhvr");
        switch (columns) {
            case 2:
                gridTemplateColumns = '1fr 1fr';
                gridTemplateRows = 'auto';
                $(".toggle-button").eq(0).addClass("tgbtnhvr");
                break;
            case 3:
                gridTemplateColumns = '1fr 1fr 1fr';
                gridTemplateRows = 'auto';
                $(".toggle-button").eq(1).addClass("tgbtnhvr");
                break;
            case 4:
                gridTemplateColumns = '1fr 1fr';
                gridTemplateRows = 'auto auto';
                $(".toggle-button").eq(2).addClass("tgbtnhvr");
                break;
            case 6:
                gridTemplateColumns = '1fr 1fr 1fr';
                gridTemplateRows = 'auto auto';
                $(".toggle-button").eq(3).addClass("tgbtnhvr");
                break;
          }
        $('.window-container').css({
            'grid-template-columns': gridTemplateColumns,
            'grid-template-rows': gridTemplateRows
        });
        $('.window').hide().slice(0, columns).show();


 
    // Добавляем новый option в начало списка
    $('.dvijok').each(function() {
        // Проверяем, есть ли в списке опция с value="0"
        if ($(this).find('option[value="0"]').length === 0) {
            // Если нет, добавляем новую опцию в начало списка
            $(this).attr("selected",false).prepend('<option value="0" selected="selected">Выберите нейросеть</option>');
        }
    });


    }

    $('.toggle-button').click(function() {
        const columns = $(this).data('windows');
        updateGrid(columns);
    });

    // По умолчанию отображаем 2 окна
    updateGrid(4);




$(document).on('input','#kreativ input[type=range]', function(){let kreativ=$(this).val();$('#kreativ input[type=text]').val(kreativ+'%');});
$(document).on("click","#sendfrm .cthth_nero",function()
{
let isTariv = confirm("В сутки Вам доступно несколько запросов полностью бесплатно. Эти запросы являются сгораемыми, количество их зависит от Вашего тарифа в Системе. Чем выше Ваш тариф, тем больше сгораемых бесплатных запросов Вам доступно. После траты бесплатных запросов, новые начисляются через 24 часа с момента сгорания последнего запроса. После сжигания бесплатных запросов остальные запросы снимают средства с Вашего личного виртуального счета. Счет этот Вы можете пополнить в любое время и тратить по своему усмотрению. Ваш личный виртуальный счет представляет собой Dewiar токены, один такой токен приравнивается к 1$. Средства на Ваш счет можно либо перевести с банковской карты, либо заработать, привлекая новых пользователей в Систему. Хотите пополнить счет или поучаствовать в партнерской программе для бесплатного пополнения счета?"); if(isTariv==true){window.location.href = "/replenish_balance";}
});
$(document).on("click",'#dwrlg',function(){$("#mlnk").toggle();});
$(document).on("click",'#mlnk .close',function(){$("#mlnk").hide();});

$(document).on('keypress', '.editor', function(event) {if (event.keyCode == 13 && !event.shiftKey) {$("#mikrBtn").click();return false;}});

let completedWindows = 0; // Счетчик завершенных блоков
let totalWindows = 0; // Общее количество блоков, которые будут обрабатываться
let activeTimers = 0;
let timers = {};

function startTimer(w) {
    if (!timers[w]) {
        activeTimers++; // Увеличиваем счетчик активных таймеров
        timers[w] = Date.now(); // Сохраняем время начала для каждого таймера
        timers[w + '_id'] = setInterval(updateTimer.bind(null, w), 100); // Сохраняем идентификатор таймера для каждого окна
    }
}

function updateTimer(w) {
    let elapsedTime = (Date.now() - timers[w]) / 1000;
    $("#" + w + " .tmbx span").html(elapsedTime);
    if (elapsedTime > 120) {
        stopTimer(w);
        $("#" + w + " .tmbx span").html('∞');
        // время для данного блока вышло
    }
}

function stopTimer(w) {
    if (timers[w]) {
        clearInterval(timers[w + '_id']); // Останавливаем таймер только для конкретного окна
        $("#" + w + " .ldr").hide();
        delete timers[w]; // Удаляем таймер из объекта
        delete timers[w + '_id']; // Удаляем идентификатор таймера из объекта
        activeTimers--; // Уменьшаем счетчик активных таймеров
        // Проверяем, завершились ли все таймеры
        if (activeTimers === 0 && completedWindows === totalWindows) {
            alert('все завершено');
        }
    }
}





































































$(document).on('click', '#sendfrm submit', function() 
{
$(".window canvas").hide();
    let textr = $("#sendfrm .editor").html().replace(/<div>/g, "\n").replace(/<\/div>/g, "");
    $("#sendfrm .editor").html(textr);
    textr = $("#sendfrm .editor").text();
    if(textr!=false)
    {
    let selectedAlgorithme = $("input[name='algorithm']:checked").val(); // если 1 - стандартный, 2 - с суммаризацией и двойным проходом
    $("#mikrBtn").addClass("textXLoad");
    
    // Сброс значений перед новым запуском
    totalWindows = 0;
    completedWindows = 0;
    activeTimers = 0;
    timers = {};

    // Считываем значения "движков" и запускаем таймеры
    //let dvijokArray = [];
    for (let i = 1; i <= 6; i++) 
    {
        let w = $("#window" + i + " .dvijok").val();
        if(w != 0 && w != undefined) // Проверяем, чтобы значение не было равно 0 или undefined
        {
        totalWindows++; // Увеличиваем общее количество блоков для обработки
        startTimer('window' + i);
        $("#window" + i + " .ldr").show();
        $("#window" + i + " .smbx span").html('0$');
        $("#window" + i + " .vco").html('');
        $("#window" + i + " textarea").val('');
        $("#window" + i + " .btnbx").html('');
         }
    }

    // Отправляем запросы для каждого окна
    if(totalWindows==0){alert('Не выбрана ни одна нейросеть!');}
    else {for (let i = 1; i <= 6; i++) { sendRequestForWindow(i); }}
    
    function sendRequestForWindow(windowIndex) 
    {
        ClearHolst(windowIndex);
        //let dvijokValue = dvijokArray[windowIndex - 1];
        let dvijokValue = $("#window" + windowIndex + " .dvijok").val();
        if(dvijokValue != 0 && dvijokValue!=undefined) 
        {
            $.ajax({
                type: 'POST',
                url: 'nero_arena_graphics.php',
                data: {
                    'admA': admA,
                    'kodA': kodA,
                    'nerov': textr,
                    'dvijok': dvijokValue,
                    'windowIndex':windowIndex,
                    'arena':1
                },
                dataType: "json",
                success: function(data) 
                {
                    if(data.count_request) {$("#sendfrm .cthth_nero div").text(data.count_request);}
                    if(data.reaction == 0 || data.reaction == 2) 
                    {
                        if (data.reaction == 2) 
                        {
                            let ErrTarif = $("#ErrTarif").val(); // защита от нескольких одновременных сообщений
                            if (ErrTarif == 0) 
                            {
                                $("#ErrTarif").val(1);
                                let isTarif = confirm(data.response + "\r\n\r\nПОПОЛНИТЬ СЧЕТ");
                                if (isTarif) 
                                {
                                location.href = '/replenish_balance';
                                }
                            }
                        }
                        $("#window" + windowIndex + " .ldr").hide();
                        $("#window" + windowIndex + " .vco").html(data.response);
                        $("#window" + windowIndex + " .btnbx").html('');
                    }
                   else 
                    {
                            let prompt_input = data.prompt_input;
                            let prompt_output = data.prompt_output;
                            let sumOtpr = data.sumOtpr;
                            let sumPol = data.sumPol;
                            let sumAll=data.sumAll;
                            $("#window" + windowIndex + " .ldr").hide();
                            let modelresp = data.modelresp;
                            //$("#window" + windowIndex + " .vco").html(modelresp);
// преобразовали в маркдаун
//modelresp=marked.parse(modelresp);
$("#window" + windowIndex + " .vco").html(modelresp);
let random=Math.floor(1000 + Math.random() * 9000);
$.ajax({
    url: 'file_arena/' + admA + '_' + windowIndex + '.txt?x='+random,
    dataType: 'text',
    success: function(data) 
    {
    let aiGeneratedCode = data;
    //alert('ПОЛУЧИЛИ ИЗ ФАЙЛА - '+aiGeneratedCode);
//
$("#window" + windowIndex + " textarea").val(aiGeneratedCode);
ClearHolst(windowIndex);
StartInstr(windowIndex);


    }
});






                            $("#window" + windowIndex + " .btnbx").html("Токенов оправлено: " + prompt_input + " (стоимость " + sumOtpr + "$) | Токенов получено: " + prompt_output + " (стоимость " + sumPol + "$)");
                            $("#window" + windowIndex + " .smbx span").html(sumAll+'$');
                            let timex=$("#window" + windowIndex + " .tmbx span").text().trim();
                            let timeValue = parseFloat(timex);
                            if (!isNaN(timeValue) && timeValue > 0) 
                                {
                                let speed=timeValue/prompt_output;
                                timeValue=parseFloat(timeValue.toFixed(5));
                                speed=parseFloat(speed.toFixed(5));
                                $("#window" + windowIndex + " .tmbx span").html(timeValue+' [<b title="Скорость генерации одного токена в секундах - чем МЕНЬШЕ, тем быстрее ИИ!">'+speed+'</b>]')
                                }

                    }



stopTimer('window' + windowIndex);
completedWindows++; // Увеличиваем счетчик завершенных блоков
//checkCompletion();



                },
                error: function(jqXHR, textStatus, errorThrown) 
                {
                    $("#window" + windowIndex + " .ldr").hide();
                    $("#window" + windowIndex + " .vco").html("@Ошибка: " + textStatus + ", " + errorThrown);
                    $("#window" + windowIndex + " .btnbx").html('');



stopTimer('window' + windowIndex); 
completedWindows++; // Увеличиваем счетчик завершенных блоков
//checkCompletion();



                }
            });
        }
        else 
        {
$("#window" + windowIndex + " .ldr").hide();
$("#window" + windowIndex + " .vco").html('');
$("#window" + windowIndex + " textarea").val('');
$("#window" + windowIndex + " .btnbx").html('');
stopTimer('window' + windowIndex); 
// Проверяем, завершились ли все блоки
//checkCompletion(); // Проверяем завершение
        }
    }
}
else{alert('Пустой запрос');} 
});







$(document).on('change', '.dvijok', function() 
{
//let dv=$(this).val();
//if(dv==0)
//{
    ClearBox();
//}
});

$(document).on("click",'#bdc .tpbx',function(){
let parentID = $(this).parent().attr('id');
let dv=$("#"+parentID+" .dvijok").val();
if(dv!=0)
{
    let idval = $("[id='x_"+dv+"']").val();
    if(idval!=undefined)
    {
    $(".window-container,#mnarena").hide();
    $(".window-containerx").show();
    $(".window-containerx .cmnt").html(idval);  
    }
}
else{alert('Выберите нейросеть из списка!');}
});
$(document).on("click",'.window-containerx .close',function(){
$(".window-container,#mnarena").show();
$(".window-containerx").hide();
$(".window-containerx .cmnt").html('');
});

function ClearBox()
{
    for (let i = 1; i <= 6; i++) 
    {
        let w = $("#window" + i + " .dvijok").val();
        if(w == 0 || w == undefined) // Проверяем, чтобы значение не было равно 0 или undefined
        {
        $("#window" + i + " .ldr").hide();
        $("#window" + i + " .vco").html('');
        $("#window" + i + " textarea").val('');
        $("#window" + i + " .btnbx").html(''); 
        $("#window" + i + " .smbx span").html('');
        $("#window" + i + " .tmbx span").html(''); 
ClearHolst(i);
        }
    }
}
$(document).on('click', '#clear', function() 
{
$(".window .ldr").hide();
$(".window .vco").html('');
$(".window textarea").val('');
$(".window .btnbx").html(''); 
$(".window .smbx span").html(''); 
$(".window .tmbx span").html(''); 
});


















});
