frappe.ui.form.on('Asan Login', {
    refresh: function(frm) {
        // Остановить любые существующие интервалы
        if (window.authStatusInterval) {
            clearInterval(window.authStatusInterval);
            window.authStatusInterval = null;
        }
        
        // Кнопка для получения токена
        frm.add_custom_button(__('Login with Asan Imza'), function() {
            // Проверяем, что поля phone и user_id заполнены
            if (!frm.doc.phone || !frm.doc.user_id) {
                frappe.msgprint(__('Please fill in Phone and User ID fields'));
                return;
            }
            
            // Показываем сообщение о том, что запрос отправлен
            frappe.show_alert({
                message: __('Authentication request sent. Please confirm on your phone.'),
                indicator: 'blue'
            }, 5);
            
            // Отправляем запрос для начала процесса аутентификации
            frappe.call({
                method: 'invoice_az.auth.handle_authentication',
                args: {
                    'asan_login_name': frm.doc.name
                },
                callback: function(r) {
                    if (r.message && r.message.success) {
                        // Сохраняем токен в документе и запускаем опрос статуса
                        if (r.message.bearer_token) {
                            frm.set_value('bearer_token', r.message.bearer_token);
                        }
                        
                        // Запускаем опрос статуса
                        startPollingWithTimeout(frm);
                        
                        // Задержка, чтобы дать диалогу полностью создаться
                        setTimeout(function() {
                            // Если есть код верификации, отображаем его
                            if (r.message.verification_code) {
                                // Явно указываем текст кода
                                $('#verification_code').text(r.message.verification_code);
                                
                                // Отображаем контейнер кода верификации
                                $('#verification_code_container').show();
                                
                                // Принудительно устанавливаем стиль отображения
                                $('#verification_code_container').attr('style', 'display: block !important; margin-top: 15px;');
                            }
                        }, 500); // Задержка 500 мс для полной инициализации DOM
                    } else {
                        // Показываем сообщение об ошибке
                        frappe.msgprint({
                            title: __('Error'),
                            indicator: 'red',
                            message: r.message ? r.message.message : __('Authentication request failed.')
                        });
                    }
                }
            });
        }, __('Login'));
        
        // Кнопка для получения сертификатов (доступна только если авторизация успешна)
        if (frm.doc.auth_status === 'Authenticated' || frm.doc.auth_status === 'Fully Authenticated') {
            frm.add_custom_button(__('Get Certificates'), function() {
                frappe.call({
                    method: 'invoice_az.auth.get_auth_certificates',
                    args: {
                        'asan_login_name': frm.doc.name
                    },
                    callback: function(r) {
                        if (r.message && r.message.success) {
                            // Обновляем форму после успешного получения сертификатов
                            frm.reload_doc();
                            
                            // Показываем сообщение об успешном получении сертификатов
                            frappe.msgprint({
                                title: __('Success'),
                                indicator: 'green',
                                message: __('Certificates retrieved successfully')
                            });
                            
                            // Отображаем список сертификатов в диалоговом окне
                            if (r.message.certificates) {
                                showCertificatesDialog(r.message.certificates, frm);
                            }
                        } else if (r.message && r.message.unauthorized) {
                            // Если ошибка авторизации, предлагаем авторизоваться заново
                            showAuthDialog(frm);
                        } else {
                            // Другие ошибки
                            frappe.msgprint({
                                title: __('Error'),
                                indicator: 'red',
                                message: r.message ? r.message.message : __('Failed to get certificates')
                            });
                        }
                    }
                });
            }, __('Actions'));
        }
        
        // Кнопка для выбора налогоплательщика (доступна если авторизация успешна и сертификат выбран)
        if ((frm.doc.auth_status === 'Authenticated' || frm.doc.auth_status === 'Fully Authenticated') && 
            frm.doc.selected_certificate) {
            frm.add_custom_button(__('Choose Taxpayer'), function() {
                frappe.call({
                    method: 'invoice_az.auth.select_taxpayer',
                    args: {
                        'asan_login_name': frm.doc.name
                    },
                    callback: function(r) {
                        if (r.message && r.message.success) {
                            // Обновляем форму после успешного выбора налогоплательщика
                            frm.reload_doc();
                            
                            // Показываем сообщение об успешном выборе
                            frappe.msgprint({
                                title: __('Success'),
                                indicator: 'green',
                                message: __('Taxpayer selected successfully')
                            });
                        } else if (r.message && r.message.unauthorized) {
                            // Если ошибка авторизации, предлагаем авторизоваться заново
                            showAuthDialog(frm);
                        } else {
                            // Другие ошибки
                            frappe.msgprint({
                                title: __('Error'),
                                indicator: 'red',
                                message: r.message ? r.message.message : __('Failed to select taxpayer')
                            });
                        }
                    }
                });
            }, __('Actions'));
        }
        
        // Обработчик изменения выбранного сертификата
        if (frm.doc.certificates_json) {
            try {
                const certificates = JSON.parse(frm.doc.certificates_json);
                
                frm.add_custom_button(__('Select Certificate'), function() {
                    showCertificatesDialog(certificates, frm);
                }, __('Actions'));
            } catch (e) {
                console.error('Error parsing certificates JSON:', e);
            }
        }
    },
    
    // Обработчик изменения выбранного сертификата (введенного вручную)
    selected_certificate: function(frm) {
        // Только если поле не пустое и сертификаты доступны
        if (frm.doc.selected_certificate && frm.doc.certificates_json) {
            try {
                // Получаем данные сертификатов
                const certificates = JSON.parse(frm.doc.certificates_json);
                if (!Array.isArray(certificates) || certificates.length === 0) return;
                
                // Ищем сертификат по имени или его части
                const searchStr = frm.doc.selected_certificate.toLowerCase();
                
                // Сначала пытаемся найти точное совпадение по имени и идентификатору
                let foundCert = null;
                let foundIndex = -1;
                
                for (let i = 0; i < certificates.length; i++) {
                    const cert = certificates[i];
                    let certName = '';
                    let certId = '';
                    
                    if (cert.taxpayerType === 'individual' && cert.individualInfo) {
                        certName = cert.individualInfo.name || '';
                        certId = cert.individualInfo.fin || '';
                    } else if (cert.legalInfo) {
                        certName = cert.legalInfo.name || '';
                        certId = cert.legalInfo.voen || cert.legalInfo.tin || '';
                    }
                    
                    const fullName = `${certName} (${certId})`.toLowerCase();
                    
                    // Проверяем точное совпадение или содержание строки поиска
                    if (fullName === searchStr || fullName.includes(searchStr)) {
                        foundCert = cert;
                        foundIndex = i;
                        break;
                    }
                }
                
                // Если нашли совпадение, устанавливаем данные сертификата
                if (foundCert) {
                    frm.set_value('selected_certificate_index', foundIndex);
                    frm.set_value('selected_certificate_json', JSON.stringify(foundCert, null, 2));
                    
                    frappe.show_alert({
                        message: __('Certificate found and selected'),
                        indicator: 'green'
                    }, 3);
                }
            } catch (e) {
                console.error('Error processing certificate selection:', e);
            }
        }
    }
});

// Функция для запуска опроса через setTimeout вместо setInterval
function startPollingWithTimeout(frm, successCallback) {
    console.log('startPollingWithTimeout function has been called');
    
    // Отображаем индикатор загрузки
    frm.page.set_indicator(__('Waiting for confirmation'), 'orange');
    
    // Создаем всплывающее окно с информацией
    const status_dialog = new frappe.ui.Dialog({
        title: __('Authentication Status'),
        fields: [
            {
                fieldname: 'status_html',
                fieldtype: 'HTML',
                options: `
                    <div class="text-center">
                        <div class="lds-dual-ring" style="display: inline-block; width: 64px; height: 64px;">
                            <div style="width: 64px; height: 64px; border: 6px solid #4e73df; border-radius: 50%; border-color: #4e73df transparent #4e73df transparent; animation: lds-dual-ring 1.2s linear infinite;"></div>
                        </div>
                        <style>
                            @keyframes lds-dual-ring {
                                0% { transform: rotate(0deg); }
                                100% { transform: rotate(360deg); }
                            }
                        </style>
                        <div class="mt-3" id="status_message">
                            <h4>Waiting for confirmation on your phone</h4>
                            <p>Please check your phone and confirm the authentication request.</p>
                        </div>
                        <!-- Блок для отображения кода верификации -->
                        <div id="verification_code_container" style="display:none; margin-top: 15px;">
                            <div style="background: #f8f9fa; padding: 10px; display: inline-block; border-radius: 5px; font-size: 24px; font-weight: bold; letter-spacing: 2px; color: #333; border: 1px solid #ddd;">
                                <span id="verification_code">----</span>
                            </div>
                            <p style="margin-top: 5px; font-size: 12px; color: #666;">Verification Code</p>
                        </div>
                    </div>
                `
            }
        ],
        primary_action_label: __('Cancel'),
        primary_action: function() {
            // Остановить опрос
            window.stopPolling = true;
            status_dialog.hide();
            frm.page.clear_indicator();
            frm.reload_doc();
        }
    });
    
    status_dialog.show();
    
    // Счетчик попыток и флаг для остановки опроса
    let attempts = 0;
    const maxAttempts = 20; // 2 минут (20 попыток с интервалом 5 секунд)
    window.stopPolling = false;
    
    // Функция опроса
    function pollAuthStatus() {
        // Если достигнуто максимальное количество попыток или установлен флаг остановки
        if (attempts >= maxAttempts || window.stopPolling) {
            console.log('Polling stopped: ' + (attempts >= maxAttempts ? 'max attempts reached' : 'manually cancelled'));
            
            if (attempts >= maxAttempts) {
                // Обновляем информацию в диалоговом окне по таймауту
                $('#status_message').html(`
                    <h4 style="color: red;">Authentication Timeout</h4>
                    <p>The authentication request has timed out. Please try again.</p>
                `);
                $('.lds-dual-ring').css('display', 'none');
                
                // Скрываем код верификации при таймауте
                $('#verification_code_container').hide();
                
                // Обновляем поле auth_status и сохраняем
                frm.set_value('auth_status', 'Failed');
                
                // Меняем кнопку на "Close"
                status_dialog.set_primary_action(__('Close'), function() {
                    status_dialog.hide();
                    
                    // Сохраняем документ и затем обновляем его с сервера
                    frm.save().then(() => frm.reload_doc());
                });
            }
            
            return;
        }
        
        attempts++;
        
        // Проверяем статус авторизации
        frappe.call({
            method: 'invoice_az.auth.poll_auth_status',
            args: {
                'asan_login_name': frm.doc.name,
                'bearer_token': frm.doc.bearer_token
            },
            callback: function(r) {
                if (r.message && r.message.success) {
                    if (r.message.authenticated) {
                        // Авторизация успешна
                        window.stopPolling = true;
                        
                        // Обновляем информацию в диалоговом окне
                        $('#status_message').html(`
                            <h4 style="color: green;">Authentication Successful!</h4>
                            <p>You are now authenticated. The page will reload shortly.</p>
                        `);
                        $('.lds-dual-ring').css('display', 'none');
                        $('.lds-dual-ring').html(`
                            <div style="width: 64px; height: 64px; display: flex; align-items: center; justify-content: center;">
                                <i class="fa fa-check" style="font-size: 48px; color: #5cb85c;"></i>
                            </div>
                        `);
                        
                        // НЕ скрываем код верификации при успешной аутентификации
                        
                        // Обновляем кнопку
                        status_dialog.set_primary_action(__('Continue'), function() {
                            status_dialog.hide();
                            
                            // Вызываем callback после успешной аутентификации, если он предоставлен
                            if (typeof successCallback === 'function') {
                                successCallback();
                            } else {
                                frm.reload_doc();
                            }
                        });
                        
                        // Автоматически закрываем диалог через 2 секунды
                        setTimeout(function() {
                            status_dialog.hide();
                            
                            // Вызываем callback после успешной аутентификации, если он предоставлен
                            if (typeof successCallback === 'function') {
                                successCallback();
                            } else {
                                frm.reload_doc();
                            }
                        }, 2000);
                    } else {
                        // Продолжаем опрос
                        setTimeout(pollAuthStatus, 5000);
                    }
                } else {
                    // Если ошибка, останавливаем опрос и показываем сообщение
                    window.stopPolling = true;
                    
                    // Обновляем информацию в диалоговом окне
                    $('#status_message').html(`
                        <h4 style="color: red;">Authentication Error</h4>
                        <p>${r.message ? r.message.message : 'An unknown error occurred.'}</p>
                    `);
                    $('.lds-dual-ring').css('display', 'none');
                    $('.lds-dual-ring').html(`
                        <div style="width: 64px; height: 64px; display: flex; align-items: center; justify-content: center;">
                            <i class="fa fa-times" style="font-size: 48px; color: #d9534f;"></i>
                        </div>
                    `);
                    
                    // Скрываем код верификации при ошибке
                    $('#verification_code_container').hide();
                    
                    // Обновляем поле auth_status
                    frm.set_value('auth_status', 'Failed');
                    
                    // Меняем кнопку на "Close"
                    status_dialog.set_primary_action(__('Close'), function() {
                        status_dialog.hide();
                        
                        // Сохраняем документ и затем обновляем его с сервера
                        frm.save().then(() => frm.reload_doc());
                    });
                }
            },
            error: function(err) {
                // В случае ошибки продолжаем опрос
                console.error('Error during status check:', err);
                setTimeout(pollAuthStatus, 5000);
            }
        });
    }
    
    // Начинаем опрос
    console.log('Starting first polling attempt');
    pollAuthStatus();
}

// Функция для отображения сертификатов в диалоговом окне
function showCertificatesDialog(certificates, frm) {
    if (!certificates || !certificates.length) {
        frappe.msgprint(__('No certificates data to display'));
        return;
    }
    
    // Создаем таблицу с сертификатами
    var cert_table = '<div style="max-height: 500px; overflow-y: auto;"><table class="table table-bordered">';
    cert_table += '<thead><tr>' +
                '<th>Type</th>' +
                '<th>Name</th>' +
                '<th>ID</th>' +
                '<th>Position</th>' +
                '<th>Status</th>' +
                '<th>Action</th>' +
                '</tr></thead><tbody>';
    
    certificates.forEach(function(cert, index) {
        var name = '';
        var id = '';
        
        if (cert.taxpayerType === 'individual' && cert.individualInfo) {
            name = cert.individualInfo.name || '';
            id = cert.individualInfo.fin || '';
        } else if (cert.legalInfo) {
            name = cert.legalInfo.name || '';
            id = cert.legalInfo.tin || cert.legalInfo.voen || '';
        }        
        
        cert_table += '<tr>' +
                    '<td>' + (cert.taxpayerType || '') + '</td>' +
                    '<td>' + name + '</td>' +
                    '<td>' + id + '</td>' +
                    '<td>' + (cert.position || '') + '</td>' +
                    '<td>' + (cert.hasAccess ? 'Active' : 'Inactive') + 
                      (cert.liquidated ? ' (Liquidated)' : '') + '</td>' +
                    '<td><button class="btn btn-xs btn-primary select-cert" data-index="' + index + '">Select</button></td>' +
                    '</tr>';
    });
    
    cert_table += '</tbody></table></div>';
    
    // Отображаем диалоговое окно с таблицей
    var d = new frappe.ui.Dialog({
        title: __('Certificates List'),
        fields: [{
            fieldtype: 'HTML',
            fieldname: 'certificate_list',
            options: cert_table
        }],
        primary_action_label: __('Close'),
        primary_action: function() {
            d.hide();
        }
    });
    
    d.show();
    
    // Добавляем обработчик для кнопки выбора сертификата
    d.$wrapper.find('.select-cert').on('click', function() {
        var index = $(this).data('index');
        var cert = certificates[index];
        
        // Получаем имя для отображения
        let certName = '';
        if (cert.taxpayerType === 'individual' && cert.individualInfo) {
            certName = `${cert.individualInfo.name} (${cert.individualInfo.fin})`;
        } else if (cert.legalInfo) {
            certName = `${cert.legalInfo.name} (${cert.legalInfo.voen || cert.legalInfo.tin})`;
        } else {
            certName = `Certificate ${index + 1}`;
        }
        
                        // Отправляем запрос на выбор сертификата
        frappe.call({
            method: 'invoice_az.auth.select_certificate',
            args: {
                'asan_login_name': frm.doc.name,
                'certificate_data': cert,
                'certificate_name': certName
            },
            callback: function(r) {
                if (r.message && r.message.success) {
                    frappe.show_alert({
                        message: __('Certificate selected. Choosing taxpayer automatically...'),
                        indicator: 'blue'
                    }, 3);
                    
                    d.hide();
                    
                    // После успешного выбора сертификата автоматически вызываем выбор налогоплательщика
                    frappe.call({
                        method: 'invoice_az.auth.select_taxpayer',
                        args: {
                            'asan_login_name': frm.doc.name
                        },
                        callback: function(r2) {
                            if (r2.message && r2.message.success) {
                                frappe.show_alert({
                                    message: __('Taxpayer selected automatically'),
                                    indicator: 'green'
                                }, 5);
                                
                                // Перезагружаем страницу для обновления данных
                                frm.reload_doc();
                            } else if (r2.message && r2.message.unauthorized) {
                                // Если ошибка авторизации, предлагаем авторизоваться заново
                                showAuthDialog(frm);
                            } else {
                                frappe.msgprint({
                                    title: __('Error'),
                                    indicator: 'red',
                                    message: r2.message ? r2.message.message : __('Failed to select taxpayer automatically')
                                });
                                
                                // Все равно перезагружаем страницу, чтобы отобразить выбранный сертификат
                                frm.reload_doc();
                            }
                        }
                    });
                } else if (r.message && r.message.unauthorized) {
                    d.hide();
                    
                    // Если ошибка авторизации, предлагаем авторизоваться заново
                    showAuthDialog(frm);
                } else {
                    frappe.msgprint({
                        title: __('Error'),
                        indicator: 'red',
                        message: r.message ? r.message.message : __('Failed to select certificate')
                    });
                }
            }
        });
    });
}

// Функция для отображения диалога повторной аутентификации
function showAuthDialog(frm) {
    var d = new frappe.ui.Dialog({
        title: __('Authentication Required'),
        fields: [
            {
                fieldname: 'message',
                fieldtype: 'HTML',
                options: `
                    <div class="text-center">
                        <p>Your session has expired or authentication is required.</p>
                        <p>Would you like to authenticate again?</p>
                    </div>
                `
            }
        ],
        primary_action_label: __('Authenticate'),
        primary_action: function() {
            d.hide();
            
            // Показываем сообщение о начале аутентификации
            frappe.show_alert({
                message: __('Starting authentication process...'),
                indicator: 'blue'
            }, 3);
            
            // Вызываем процесс аутентификации
            frappe.call({
                method: 'invoice_az.auth.handle_authentication',
                args: {
                    'asan_login_name': frm.doc.name
                },
                freeze: true,
                freeze_message: __('Sending authentication request...'),
                callback: function(r) {
                    if (r.message && r.message.success) {
                        // Получаем bearer_token из ответа
                        const bearerToken = r.message.bearer_token;
                        
                        // Обновляем значение в документе
                        frm.set_value('bearer_token', bearerToken);
                        
                        // Запускаем опрос с передачей сертификата и налогоплательщика как callback
                        // для автоматического восстановления сессии
                        pollAuthenticationStatus(frm, function() {
                            // После успешной аутентификации проверяем, был ли ранее выбран сертификат
                            if (frm.doc.selected_certificate_json) {
                                try {
                                    var certData = JSON.parse(frm.doc.selected_certificate_json);
                                    var certName = frm.doc.selected_certificate;
                                    
                                    frappe.show_alert({
                                        message: __('Automatically restoring your session...'),
                                        indicator: 'blue'
                                    }, 3);
                                    
                                    // Сначала восстанавливаем сертификат
                                    frappe.call({
                                        method: 'invoice_az.auth.select_certificate',
                                        args: {
                                            'asan_login_name': frm.doc.name,
                                            'certificate_data': certData,
                                            'certificate_name': certName
                                        },
                                        callback: function(r) {
                                            if (r.message && r.message.success) {
                                                // Затем восстанавливаем налогоплательщика
                                                frappe.call({
                                                    method: 'invoice_az.auth.select_taxpayer',
                                                    args: {
                                                        'asan_login_name': frm.doc.name
                                                    },
                                                    callback: function(r2) {
                                                        if (r2.message && r2.message.success) {
                                                            frappe.show_alert({
                                                                message: __('Session restored successfully'),
                                                                indicator: 'green'
                                                            }, 5);
                                                        } else {
                                                            frappe.show_alert({
                                                                message: __('Partial session restore - please select certificate manually'),
                                                                indicator: 'orange'
                                                            }, 5);
                                                        }
                                                        
                                                        // Обновляем документ с сервера
                                                        frm.reload_doc();
                                                    }
                                                });
                                            } else {
                                                frappe.show_alert({
                                                    message: __('Please select your certificate manually'),
                                                    indicator: 'orange'
                                                }, 5);
                                                
                                                // Обновляем документ с сервера
                                                frm.reload_doc();
                                            }
                                        }
                                    });
                                } catch (e) {
                                    console.error('Error restoring certificate:', e);
                                    frm.reload_doc();
                                }
                            } else {
                                // Если сертификат не выбран, просто обновляем документ
                                frm.reload_doc();
                            }
                        });
                    } else {
                        // Показываем сообщение об ошибке
                        frappe.msgprint({
                            title: __('Error'),
                            indicator: 'red',
                            message: r.message ? r.message.message : __('Authentication request failed.')
                        });
                    }
                }
            });
        },
        secondary_action_label: __('Cancel'),
        secondary_action: function() {
            d.hide();
        }
    });
    
    d.show();
}

// Отдельная функция для опроса статуса аутентификации
function pollAuthenticationStatus(frm, successCallback) {
    // Создаем всплывающее окно с информацией
    const status_dialog = new frappe.ui.Dialog({
        title: __('Authentication Status'),
        fields: [
            {
                fieldname: 'status_html',
                fieldtype: 'HTML',
                options: `
                    <div class="text-center">
                        <div class="lds-dual-ring" style="display: inline-block; width: 64px; height: 64px;">
                            <div style="width: 64px; height: 64px; border: 6px solid #4e73df; border-radius: 50%; border-color: #4e73df transparent #4e73df transparent; animation: lds-dual-ring 1.2s linear infinite;"></div>
                        </div>
                        <style>
                            @keyframes lds-dual-ring {
                                0% { transform: rotate(0deg); }
                                100% { transform: rotate(360deg); }
                            }
                        </style>
                        <div class="mt-3" id="poll_status_message">
                            <h4>Waiting for confirmation on your phone</h4>
                            <p>Please check your phone and confirm the authentication request.</p>
                        </div>
                    </div>
                `
            }
        ],
        primary_action_label: __('Cancel'),
        primary_action: function() {
            // Останавливаем опрос и скрываем диалог
            stopPolling = true;
            status_dialog.hide();
            
            // Обновляем документ с сервера
            frm.reload_doc();
        }
    });
    
    status_dialog.show();
    
    // Счетчик попыток и флаг для остановки опроса
    let attempts = 0;
    const maxAttempts = 20; // 20 попыток с интервалом 6 секунд
    let stopPolling = false;
    
    // Функция опроса
    function pollStatus() {
        // Если достигнуто максимальное количество попыток или установлен флаг остановки
        if (attempts >= maxAttempts || stopPolling) {
            console.log('Polling stopped: ' + (attempts >= maxAttempts ? 'max attempts reached' : 'manually cancelled'));
            
            if (attempts >= maxAttempts) {
                // Обновляем информацию в диалоговом окне по таймауту
                $('#poll_status_message').html(`
                    <h4 style="color: red;">Authentication Timeout</h4>
                    <p>The authentication request has timed out. Please try again.</p>
                `);
                $('.lds-dual-ring').css('display', 'none');
                
                // Меняем кнопку на "Close"
                status_dialog.set_primary_action(__('Close'), function() {
                    status_dialog.hide();
                    
                    // Устанавливаем статус "Failed" и перезагружаем документ
                    frm.set_value('auth_status', 'Failed');
                    frm.save().then(() => frm.reload_doc());
                });
            }
            
            return;
        }
        
        attempts++;
        console.log(`Polling auth status, attempt ${attempts} of ${maxAttempts}`);
        
        // Проверяем статус авторизации
        frappe.call({
            method: 'invoice_az.auth.poll_auth_status',
            args: {
                'asan_login_name': frm.doc.name,
                'bearer_token': frm.doc.bearer_token
            },
            callback: function(r) {
                if (r.message && r.message.success) {
                    if (r.message.authenticated) {
                        // Авторизация успешна
                        stopPolling = true;
                        
                        // Обновляем информацию в диалоговом окне
                        $('#poll_status_message').html(`
                            <h4 style="color: green;">Authentication Successful!</h4>
                            <p>You are now authenticated.</p>
                        `);
                        $('.lds-dual-ring').css('display', 'none');
                        
                        // Меняем кнопку на "Continue"
                        status_dialog.set_primary_action(__('Continue'), function() {
                            status_dialog.hide();
                            
                            // Выполняем callback, если он предоставлен
                            if (typeof successCallback === 'function') {
                                successCallback();
                            } else {
                                frm.reload_doc();
                            }
                        });
                    } else {
                        // Продолжаем опрос
                        setTimeout(pollStatus, 6000);
                    }
                } else {
                    // Если ошибка, останавливаем опрос и показываем сообщение
                    stopPolling = true;
                    
                    // Обновляем информацию в диалоговом окне
                    $('#poll_status_message').html(`
                        <h4 style="color: red;">Authentication Error</h4>
                        <p>${r.message ? r.message.message : 'An unknown error occurred.'}</p>
                    `);
                    $('.lds-dual-ring').css('display', 'none');
                    
                    // Меняем кнопку на "Close"
                    status_dialog.set_primary_action(__('Close'), function() {
                        status_dialog.hide();
                        
                        // Устанавливаем статус "Failed" и перезагружаем документ
                        frm.set_value('auth_status', 'Failed');
                        frm.save().then(() => frm.reload_doc());
                    });
                }
            },
            error: function(err) {
                // В случае ошибки продолжаем опрос
                console.error('Error during status check:', err);
                setTimeout(pollStatus, 6000);
            }
        });
    }
    
    // Начинаем опрос
    pollStatus();
}
