(function ($) {
    'use strict';

    // ─── Backup helpers ───────────────────────────────────────────────────
    var backupRunning = false, restoreRunning = false;
    var restoreToken = '';
    var backupFailCount = 0;
    var restoreFailCount = 0;

    function addLog(containerId, msg) {
        var el = document.getElementById(containerId);
        if (!el) return;
        el.innerHTML += msg + '<br>';
        el.scrollTop = el.scrollHeight;
    }

    function setBackupProgress(pct, label) {
        $('#foxblock-backup-bar').css('width', pct + '%');
        $('#foxblock-backup-pct').text(pct + '%');
        if (label) $('#foxblock-backup-step-label').text(label);
    }

    function setRestoreProgress(pct, label) {
        $('#foxblock-restore-bar').css('width', pct + '%');
        $('#foxblock-restore-pct').text(pct + '%');
        if (label) $('#foxblock-restore-step-label').text(label);
    }

    var stepLabels = {
        'scan_files': 'Đang quét danh sách file...',
        'export_db': 'Đang xuất Database...',
        'pack_files': 'Đang đóng gói file...',
        'finalize': 'Đang hoàn tất backup...',
        'done': 'Backup hoàn tất!',
        'init': 'Đang đọc file backup...',
        'import_db': 'Đang import Database...',
        'replace_domain': 'Đang thay thế domain...',
        'restore_files': 'Đang phục hồi file...',
        'cleanup': 'Đang dọn dẹp hệ thống...'
    };

    // ─── Start Backup ─────────────────────────────────────────────────────
    function runBackupStep(isNew) {
        if (!backupRunning) return;
        $.post(foxblock_ajax.ajax_url, {
            action: 'foxblock_backup_step',
            nonce: foxblock_ajax.nonce,
            new: isNew ? 1 : 0
        }, function (res) {
            backupFailCount = 0; // reset on success
            if (!res.success) {
                backupRunning = false;
                addLog('foxblock-backup-log', '❌ Lỗi: ' + (res.data ? res.data.message : 'Unknown error'));
                $('#foxblock-backup-start').prop('disabled', false).text('Tạo Backup Ngay');
                $('#foxblock-backup-cancel').hide();
                return;
            }
            var d = res.data;
            setBackupProgress(d.progress || 0, stepLabels[d.step] || d.step);
            if (d.message) addLog('foxblock-backup-log', d.message);

            if (d.done) {
                backupRunning = false;
                $('#foxblock-backup-done-msg').text('✅ ' + d.message + (d.size ? ' (' + d.size + ')' : ''));
                $('#foxblock-backup-done').show();
                $('#foxblock-backup-start').prop('disabled', false).text('Tạo Backup Ngay');
                $('#foxblock-backup-cancel').hide();
                loadBackupList();
            } else {
                setTimeout(function () { runBackupStep(false); }, 300);
            }
        }).fail(function () {
            if (!backupRunning) return;
            backupFailCount++;
            if (backupFailCount >= 3) {
                backupRunning = false;
                addLog('foxblock-backup-log', '❌ Lỗi kết nối hoặc timeout liên tục. Quá trình backup đã dừng lại.');
                $('#foxblock-backup-start').prop('disabled', false).text('Tạo Backup Ngay');
                $('#foxblock-backup-cancel').hide();
                return;
            }
            setTimeout(function () { runBackupStep(false); }, 2000);
        });
    }

    $('#foxblock-backup-start').on('click', function () {
        if (backupRunning) return;
        backupRunning = true;
        $('#foxblock-backup-done').hide();
        $('#foxblock-backup-progress-wrap').show();
        $('#foxblock-backup-log').html('');
        setBackupProgress(0, 'Đang khởi động...');
        $(this).prop('disabled', true).text('Đang backup...');
        $('#foxblock-backup-cancel').show();
        runBackupStep(true);
    });

    $('#foxblock-backup-cancel').on('click', function () {
        backupRunning = false;
        $.post(foxblock_ajax.ajax_url, { action: 'foxblock_backup_cancel', nonce: foxblock_ajax.nonce });
        $(this).hide();
        $('#foxblock-backup-start').prop('disabled', false).text('Tạo Backup Ngay');
        addLog('foxblock-backup-log', '⚠ Backup đã bị hủy.');
    });

    // ─── Backup list ──────────────────────────────────────────────────────
    function loadBackupList() {
        $('#foxblock-backup-list-body').html('<tr><td colspan="4" style="text-align:center;padding:20px;"><span class="dashicons dashicons-update-alt foxblock-spin" style="font-size:22px;width:22px;height:22px;color:#ff6c00;"></span></td></tr>');
        $.post(foxblock_ajax.ajax_url, {
            action: 'foxblock_backup_list',
            nonce: foxblock_ajax.nonce
        }, function (res) {
            if (!res.success) return;
            var backups = res.data.backups;
            if (!backups || !backups.length) {
                $('#foxblock-backup-list-body').html('<tr><td colspan="5" style="text-align:center;padding:30px;color:#666;">Chưa có backup nào. Nhấn "Tạo Backup Ngay" để tạo bản đầu tiên.</td></tr>');
                return;
            }
            var html = '';
            $.each(backups, function (i, b) {
                var locLabel = '';
                if (b.location === 'Local') locLabel = '<span style="background:#e5e7eb;padding:3px 6px;border-radius:4px;font-size:11px;">Local</span>';
                else if (b.location === 'Google Drive') locLabel = '<span style="background:#dbeafe;color:#1e40af;padding:3px 6px;border-radius:4px;font-size:11px;">Google Drive</span>';
                else locLabel = '<span style="background:#dcfce7;color:#166534;padding:3px 6px;border-radius:4px;font-size:11px;">Local & GDrive</span>';

                html += '<tr>';
                html += '<td style="font-family:monospace;font-size:12px;">' + b.filename + '</td>';
                html += '<td>' + locLabel + '</td>';
                html += '<td>' + b.date + '</td>';
                html += '<td>' + b.size_fmt + '</td>';
                html += '<td style="text-align:center;"><div class="foxblock-button-group" style="display:flex;gap:4px;justify-content:center;">';
                if (b.location.indexOf('Local') !== -1) {
                    html += '<button class="button button-small foxblock-restore-from-list" data-file="' + b.filename + '" style="margin-right:5px;">Khôi phục</button>';
                    html += '<button class="button button-small foxblock-backup-download" data-file="' + b.filename + '" style="margin-right:5px;">Tải local</button>';
                } else {
                    html += '<button class="button button-small" disabled title="Tải từ Drive về Host trước khi khôi phục" style="margin-right:5px;">Khôi phục</button>';
                    html += '<button class="button button-small foxblock-backup-download-gdrive" data-file="' + b.filename + '" data-gdrive="' + (b.gdrive_id || '') + '" style="margin-right:5px;">Tải Local</button>';
                }
                html += '<button class="button button-small foxblock-backup-delete" data-file="' + b.filename + '" data-loc="' + b.location + '" data-gdrive="' + (b.gdrive_id || '') + '" style="color:#dc2626;">Xóa</button>';
                html += '</div></td></tr>';
            });
            $('#foxblock-backup-list-body').html(html);
        });
    }

    $('#foxblock-backup-refresh-list').on('click', loadBackupList);

    // Download
    $(document).on('click', '.foxblock-backup-download', function () {
        var filename = $(this).data('file');
        $.post(foxblock_ajax.ajax_url, {
            action: 'foxblock_backup_download_token',
            nonce: foxblock_ajax.nonce,
            file: filename
        }, function (res) {
            if (res.success && res.data.url) {
                window.location.href = res.data.url;
            }
        });
    });
    // Download GDrive to Local
    $(document).on('click', '.foxblock-backup-download-gdrive', function () {
        var filename = $(this).data('file');
        var gdrive_id = $(this).data('gdrive');
        var btn = $(this).prop('disabled', true).text('Đang tải...');
        $.post(foxblock_ajax.ajax_url, {
            action: 'foxblock_backup_download_gdrive',
            nonce: foxblock_ajax.nonce,
            filename: filename,
            gdrive_id: gdrive_id
        }, function (res) {
            if (res.success) {
                addLog('foxblock-backup-log', '✅ Đã tải file từ Google Drive về Local: ' + filename);
                loadBackupList();
            } else {
                alert('Lỗi tải file: ' + (res.data ? res.data.message : 'Unknown Error'));
                btn.prop('disabled', false).text('Tải về Local');
            }
        }).fail(function() {
            alert('Lỗi mạng hoặc máy chủ. Vui lòng check file error_log.');
            btn.prop('disabled', false).text('Tải về Local');
        });
    });

    // Delete
    $(document).on('click', '.foxblock-backup-delete', function () {
        var filename = $(this).data('file');
        var gdrive = $(this).data('gdrive') || '';
        if (!confirm('Bạn có chắc muốn xóa backup "' + filename + '"? Nếu nằm trên Google Drive nó cũng sẽ bị xóa. Thao tác không thể hoàn tác.')) return;
        var btn = $(this).prop('disabled', true).text('Đang xóa...');
        $.post(foxblock_ajax.ajax_url, {
            action: 'foxblock_backup_delete',
            nonce: foxblock_ajax.nonce,
            filename: filename,
            gdrive_id: gdrive
        }, function (res) {
            loadBackupList();
        });
    });

    // Restore from list
    $(document).on('click', '.foxblock-restore-from-list', function () {
        var filename = $(this).data('file');
        if (!confirm('Khôi phục từ "' + filename + '"?\n\n⚠ Database và file hiện tại sẽ bị ghi đè!')) return;
        startRestoreFromServer(filename);
    });

    // ─── Schedule form ────────────────────────────────────────────────────
    $('#foxblock-backup-schedule-form').on('submit', function (e) {
        e.preventDefault();
        var btn = $(this).find('[type=submit]').prop('disabled', true).text('Đang lưu...');
        $.post(foxblock_ajax.ajax_url, {
            action: 'foxblock_backup_save_schedule',
            nonce: foxblock_ajax.nonce,
            schedule: $('#foxblock-backup-schedule').val(),
            retention: $('#foxblock-backup-retention').val(),
            time: $('#foxblock-backup-time').val(),
            storage: $('#foxblock-backup-storage').val(),
            gdrive_folder: $('input[name="gdrive_folder"]').val()
        }, function (res) {
            btn.prop('disabled', false).text('Lưu lịch backup');
            var s = $('#foxblock-schedule-status');
            if (res.success) {
                s.text('✓ ' + (res.data.message || 'Đã lưu')).css('color', '#16a34a');
            } else {
                s.text('✗ Lỗi lưu cài đặt').css('color', '#dc2626');
            }
            setTimeout(function () { s.text(''); }, 4000);
        });
    });

    // Toggle GDrive config
    $('#foxblock-backup-storage').on('change', function() {
        if ($(this).val() === 'gdrive') {
            $('#foxblock-gdrive-config').slideDown('fast');
        } else {
            $('#foxblock-gdrive-config').slideUp('fast');
        }
    });

    // ─── Google Drive OAuth & Actions ─────────────────────────────────────
    $('#foxblock-gdrive-connect').on('click', function() {
        var btn = $(this).prop('disabled', true).text('Đang tạo liên kết...');
        
        var client_id = $('#foxblock-gdrive-client-id').val();
        var client_secret = $('#foxblock-gdrive-client-secret').val();

        if (!client_id || !client_secret) {
            alert('Vui lòng nhập Google Client ID và Google Client Secret.');
            btn.prop('disabled', false).text('Gắn kết Google Drive');
            return;
        }

        $.post(foxblock_ajax.ajax_url, {
            action: 'foxblock_gdrive_auth_url',
            client_id: client_id,
            client_secret: client_secret,
            nonce: foxblock_ajax.nonce
        }, function(res) {
            if (res.success && res.data.url) {
                window.location.href = res.data.url;
            } else {
                btn.prop('disabled', false).text('Kết nối Google Drive');
                alert(res.data ? res.data.message : 'Lỗi tạo liên kết xác thực Google.');
            }
        }).fail(function(xhr, textStatus, errorThrown) {
            btn.prop('disabled', false).text('Kết nối Google Drive');
            alert('Lỗi mạng hoặc Server Crash: ' + xhr.responseText);
            console.error(xhr.responseText);
        });
    });

    $('#foxblock-gdrive-disconnect').on('click', function() {
        if (!confirm('Bạn có chắc muốn ngắt kết nối Google Drive không? Các bản backup sẽ được lưu nội bộ (Local) thay thế.')) return;
        var btn = $(this).prop('disabled', true).text('Đang ngắt...');
        $.post(foxblock_ajax.ajax_url, {
            action: 'foxblock_gdrive_disconnect',
            nonce: foxblock_ajax.nonce
        }, function(res) {
            window.location.reload();
        }).fail(function(xhr) {
            btn.prop('disabled', false).text('Ngắt kết nối');
            alert('Lỗi: ' + xhr.responseText);
        });
    });

    $('#foxblock-gdrive-test').on('click', function() {
        var btn = $(this).prop('disabled', true).text('Đang kiểm tra...');
        var status = $('#foxblock-gdrive-test-status').show().text('');
        
        // Cần lưu settings trước khi try test upload để dùng đúng thư mục
        $.post(foxblock_ajax.ajax_url, {
            action: 'foxblock_backup_save_schedule',
            nonce: foxblock_ajax.nonce,
            schedule: $('#foxblock-backup-schedule').val(),
            retention: $('#foxblock-backup-retention').val(),
            time: $('#foxblock-backup-time').val(),
            storage: $('#foxblock-backup-storage').val(),
            gdrive_folder: $('input[name="gdrive_folder"]').val()
        }, function() {
            $.post(foxblock_ajax.ajax_url, {
                action: 'foxblock_gdrive_test_upload',
                nonce: foxblock_ajax.nonce
            }, function(res) {
                btn.prop('disabled', false).text('Kiểm tra tải lên');
                if (res.success) {
                    status.html('<span style="color:#16a34a;">' + res.data.message + '</span>');
                } else {
                    status.html('<span style="color:#dc2626;">' + (res.data ? res.data.message : 'Lỗi test upload') + '</span>');
                }
                setTimeout(function() { status.fadeOut(); }, 7000);
            }).fail(function() {
                btn.prop('disabled', false).text('Kiểm tra tải lên');
                status.html('<span style="color:#dc2626;">Lỗi mạng hoặc server timeout.</span>');
            });
        });
    });

    // ─── Restore from file upload ─────────────────────────────────────────
    function handleFileSelect(file) {
        if (!file) return;
        if (!file.name.endsWith('.foxblock')) {
            alert('Chỉ chấp nhận file có định dạng .foxblock'); return;
        }
        $('#foxblock-restore-file-name').text(file.name);
        $('#foxblock-restore-file-size').text('(' + (file.size / 1024 / 1024).toFixed(1) + ' MB)');
        $('#foxblock-restore-file-info').show();
        $('#foxblock-restore-upload-area').data('pending-file', file);
    }

    $('#foxblock-restore-file').on('change', function () {
        handleFileSelect(this.files[0]);
    });

    var dropZone = document.getElementById('foxblock-restore-drop-zone');
    if (dropZone) {
        dropZone.addEventListener('dragover', function (e) { e.preventDefault(); this.style.borderColor = '#ff6c00'; });
        dropZone.addEventListener('dragleave', function (e) { this.style.borderColor = '#ff6c0073'; });
        dropZone.addEventListener('drop', function (e) {
            e.preventDefault(); this.style.borderColor = '#ff6c0073';
            handleFileSelect(e.dataTransfer.files[0]);
        });
    }

    $('#foxblock-restore-start').on('click', function () {
        var file = $('#foxblock-restore-upload-area').data('pending-file');
        if (!file) return;
        if (!confirm('Bắt đầu khôi phục?\n\n⚠ Toàn bộ database và file hiện tại sẽ bị ghi đè!')) return;

        $('#foxblock-restore-upload-area').hide();
        $('#foxblock-restore-progress-wrap').show();
        $('#foxblock-restore-log').html('');
        setRestoreProgress(2, 'Đang chuẩn bị upload...');
        addLog('foxblock-restore-log', '📤 Đang chuẩn bị upload ' + file.name + '...');

        var maxUpload = (foxblock_ajax.max_upload_size) ? parseInt(foxblock_ajax.max_upload_size, 10) : 2 * 1024 * 1024;
        var safeMax = Math.max(1024 * 1024, maxUpload - (1024 * 1024)); // Chừa 1MB cho headers, nếu bé quá thì lấy 1MB
        var chunkSize = Math.min(safeMax, 50 * 1024 * 1024); // Tối đa 50MB mỗi lượt nếu server cho phép
        var totalChunks = Math.ceil(file.size / chunkSize);
        var currentChunk = 0;
        var uploadId = 'up_' + Date.now() + '_' + Math.floor(Math.random() * 1000);

        function uploadNextChunk() {
            var start = currentChunk * chunkSize;
            var end = Math.min(start + chunkSize, file.size);
            var chunk = file.slice(start, end);
            var isLast = (currentChunk === totalChunks - 1);

            var formData = new FormData();
            formData.append('action', 'foxblock_restore_upload_chunk');
            formData.append('nonce', foxblock_ajax.nonce);
            formData.append('foxblock_file', chunk, file.name);
            formData.append('upload_id', uploadId);
            formData.append('chunk_index', currentChunk);
            formData.append('total_chunks', totalChunks);
            formData.append('is_last', isLast ? 1 : 0);
            formData.append('filename', file.name);

            $.ajax({
                url: foxblock_ajax.ajax_url,
                type: 'POST',
                data: formData,
                processData: false,
                contentType: false,
                success: function (res) {
                    if (!res.success) {
                        addLog('foxblock-restore-log', '❌ Upload thất bại ở phần ' + (currentChunk + 1) + ': ' + (res.data ? res.data.message : 'Unknown error'));
                        return;
                    }

                    currentChunk++;
                    var pct = Math.max(2, Math.round((currentChunk / totalChunks) * 100));
                    setRestoreProgress(pct, 'Đang upload: ' + pct + '%');

                    if (isLast) {
                        if (res.data && res.data.restore_token) {
                            restoreToken = res.data.restore_token;
                        }
                        addLog('foxblock-restore-log', '✓ Upload hoàn tất. Đang bắt đầu phục hồi...');
                        restoreRunning = true;
                        runRestoreStep();
                    } else {
                        uploadNextChunk();
                    }
                },
                error: function () {
                    addLog('foxblock-restore-log', '❌ Lỗi kết nối khi upload phần ' + (currentChunk + 1) + '. Vui lòng thử lại.');
                }
            });
        }
        
        addLog('foxblock-restore-log', '📤 Bắt đầu upload (chia nhỏ ' + totalChunks + ' phần)...');
        uploadNextChunk();
    });

    function startRestoreFromServer(filename) {
        restoreRunning = true;
        $('#foxblock-restore-upload-area').hide();
        $('#foxblock-restore-progress-wrap').show();
        $('#foxblock-restore-log').html('');
        setRestoreProgress(2, 'Đang khởi động khôi phục...');
        addLog('foxblock-restore-log', '🔄 Đang khôi phục từ: ' + filename);

        $.post(foxblock_ajax.ajax_url, {
            action: 'foxblock_restore_init_from_server',
            nonce: foxblock_ajax.nonce,
            filename: filename
        }, function (res) {
            if (!res.success) {
                addLog('foxblock-restore-log', '❌ Lỗi: ' + (res.data ? res.data.message : ''));
                restoreRunning = false;
                return;
            }

            if (res.data && res.data.restore_token) {
                restoreToken = res.data.restore_token;
            }

            addLog('foxblock-restore-log', res.data.message);
            runRestoreStep();
        });
    }

    function runRestoreStep() {
        if (!restoreRunning) return;
        $.post(foxblock_ajax.plugin_url + 'restore.php', {
            action: 'foxblock_restore_step',
            nonce: foxblock_ajax.nonce,
            restore_token: restoreToken
        }, function (res) {
            restoreFailCount = 0; // reset on success
            if (!res.success) {
                restoreRunning = false;
                addLog('foxblock-restore-log', '❌ Lỗi: ' + (res.data ? res.data.message : ''));
                return;
            }
            var d = res.data;
            setRestoreProgress(d.progress || 0, stepLabels[d.step] || d.step);
            if (d.message) addLog('foxblock-restore-log', d.message);

            if (d.done) {
                restoreRunning = false;
                $('#foxblock-restore-cancel').hide();
                $('#foxblock-restore-done').show();
                $('#foxblock-restore-done-msg').text(d.message || 'Phục hồi hoàn tất!');
            } else {
                setTimeout(runRestoreStep, 300);
            }
        }).fail(function (jqXHR, textStatus, errorThrown) {
            if (!restoreRunning) return;
            restoreFailCount++;
            if (restoreFailCount >= 3) {
                restoreRunning = false;
                addLog('foxblock-restore-log', '❌ Lỗi Crash Server/Timeout: ' + (jqXHR.responseText ? jqXHR.responseText : errorThrown));
                $('#foxblock-restore-cancel').hide();
                return;
            }
            setTimeout(runRestoreStep, 2000);
        });
    }

    $('#foxblock-restore-cancel').on('click', function () {
        restoreRunning = false;
        $.post(foxblock_ajax.ajax_url, {
            action: 'foxblock_restore_cancel',
            nonce: foxblock_ajax.nonce,
            restore_token: restoreToken
        });
        addLog('foxblock-restore-log', '⚠ Đã hủy khôi phục.');
        $(this).hide();
    });

    // ─── Load backup list when tab is first opened ─────────────────────
    $(document).on('click', '.foxblock-tab-link[data-tab="backup"]', function () {
        loadBackupList();
    });

    // Load immediately if backup tab is active on page load
    if ($('#foxblock-tab-backup').hasClass('active')) {
        loadBackupList();
    }

})(jQuery);
