XOÁ MAIL

(async () => { 
    // ============================= 
    // HÀM HỖ TRỢ 
    // ============================= 
    function sleep(ms) { return new Promise(r => setTimeout(r, ms)); }

    // Lấy token từ HTML
    let html = document.documentElement.innerHTML;
    let fb_dtsg = (html.match(/"token":"(.*?)"/) || [])[1];
    let lsd_token = (html.match(/"LSD",\[\],{[^}]*"token":"(.*?)"/) || [])[1];
    let jazoest = (html.match(/jazoest=(\d+)/) || [])[1];
    let c_user = (document.cookie.match(/c_user=(\d+)/) || [])[1];
    if (!fb_dtsg || !lsd_token || !jazoest || !c_user) { 
        alert("Không tìm thấy đủ token, hãy mở trang accountscenter.facebook.com/personal_info rồi chạy lại!"); 
        return; 
    }

    // ============================= 
    // LẤY DANH SÁCH EMAIL 
    // ============================= 
    let payload = new URLSearchParams({ 
        '__user': c_user, 
        'fb_dtsg': fb_dtsg, 
        'jazoest': jazoest, 
        'lsd': lsd_token, 
        'variables': JSON.stringify({"interface":"FB_WEB"}), 
        'doc_id': "9849298431773678" 
    });

    let res = await fetch("https://accountscenter.facebook.com/api/graphql/", { 
        method: "POST", 
        headers: { 
            "content-type": "application/x-www-form-urlencoded", 
            "x-fb-lsd": lsd_token 
        }, 
        body: payload 
    });

    let data = await res.json();
    let confirmed_emails = [];
    for (let cp of data.data.fxcal_settings.node.all_contact_points) {
        if (cp.contact_point_type === "EMAIL" && !cp.has_any_pending_status) {
            confirmed_emails.push(cp.normalized_contact_point);
        }
    }

    if (confirmed_emails.length === 0) { 
        alert("Không tìm thấy email nào đã xác nhận!"); 
        return; 
    }

    // ============================= 
    // TẠO FORM TRÊN WEB 
    // ============================= 
    let div = document.createElement("div");
    div.style = `
        position:fixed;
        top:10px;
        right:10px;
        z-index:999999;
        background:#2c3e50;
        color:#ecf0f1;
        padding:20px;
        border:2px solid #1abc9c;
        border-radius:12px;
        max-height:90vh;
        overflow:auto;
        font-size:14px;
        box-shadow: 0px 4px 20px rgba(0,0,0,0.2);
        font-family: 'Arial', sans-serif;
        transition: all 0.3s ease;
    `;
    div.innerHTML = `
        <h3 style="margin:0 0 15px 0; color:#1abc9c; font-size:22px; text-align:center;">Tool Xóa Email</h3>
        <div id="email-list" style="margin-bottom:15px; max-height:200px; overflow:auto; font-size:14px;"></div>
        <label style="color:#95a5a6; display:block; margin-bottom:10px;">Số luồng: <input id="threads" type="number" value="100" style="width:70px; padding:5px; border-radius:5px; border:1px solid #ecf0f1; background:#34495e; color:#ecf0f1; font-size:14px;"></label>
        <label style="color:#95a5a6; display:block; margin-bottom:10px;">Delay(ms): <input id="delay" type="number" value="0" style="width:90px; padding:5px; border-radius:5px; border:1px solid #ecf0f1; background:#34495e; color:#ecf0f1; font-size:14px;"></label>
        <label style="color:#95a5a6; display:block; margin-bottom:15px;">
            <input type="checkbox" id="autoStop"> Tự dừng khi rate-limit
        </label>
        <label style="color:#95a5a6; display:block; margin-bottom:15px;">Chế độ: 
            <select id="mode" style="padding:5px; border-radius:5px; border:1px solid #ecf0f1; background:#34495e; color:#ecf0f1; font-size:14px;">
                <option value="sequential">Lần lượt</option>
                <option value="concurrent">Đồng thời</option>
            </select>
        </label>
        <div style="text-align:center;">
            <button id="startBtn" style="
                background:#16a085;
                color:white;
                padding:12px 20px;
                border:none;
                border-radius:5px;
                font-size:16px;
                cursor:pointer;
                box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.1);
                transition: background 0.3s ease;">
                ▶️ Chạy
            </button>
            <button id="stopBtn" style="
                background:#e74c3c;
                color:white;
                padding:12px 20px;
                border:none;
                border-radius:5px;
                font-size:16px;
                cursor:pointer;
                box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.1);
                transition: background 0.3s ease;">
                ⏹ Dừng
            </button>
        </div>
        <div id="log" style="margin-top:15px; max-height:200px; overflow:auto; background:#2c3e50; padding:10px; color:#ecf0f1;"></div>
    `;
    document.body.appendChild(div);

    let emailListDiv = div.querySelector("#email-list");
    confirmed_emails.forEach(e => {
        let id = "chk_" + e.replace(/[@.]/g, "_");
        emailListDiv.innerHTML += `<label style="display:block; margin-bottom:5px; color:#ecf0f1;"><input type="checkbox" id="${id}" value="${e}"> ${e}</label>`;
    });

    let logDiv = div.querySelector("#log");
    function log(msg) { 
        logDiv.innerHTML += msg + "<br>"; 
        logDiv.scrollTop = logDiv.scrollHeight;
    }

    // ============================= 
    // HÀM GỬI REQUEST XÓA 
    // ============================= 
    async function deleteEmail(email) { 
        let payload = new URLSearchParams({ 
            '__user': c_user, 
            'fb_dtsg': fb_dtsg, 
            'jazoest': jazoest, 
            'lsd': lsd_token, 
            'variables': JSON.stringify({ 
                "normalized_contact_point": email, 
                "contact_point_type": "EMAIL", 
                "selected_accounts": [c_user], 
                "client_mutation_id": "mutation_" + Date.now() ,
                "family_device_id":"device_id_fetch_datr"
            }), 
            'doc_id': "9452525451539774" 
        });

        let r = await fetch("https://accountscenter.facebook.com/api/graphql/", { 
            method: "POST", 
            headers: {"content-type": "application/x-www-form-urlencoded", "x-fb-lsd": lsd_token}, 
            body: payload 
        }); 
        return r.json(); 
    }

    // ============================= 
    // LOGIC XÓA 
    // ============================= 
    let stopFlag = false;
    div.querySelector("#stopBtn").onclick = () => { 
        stopFlag = true; 
        log("⏹ Dừng!"); 
    };

    div.querySelector("#startBtn").onclick = async () => { 
        stopFlag = false; 
        log("▶️ Bắt đầu chạy...");

        let threads = parseInt(div.querySelector("#threads").value);
        let delay = parseInt(div.querySelector("#delay").value);
        let autoStop = div.querySelector("#autoStop").checked;
        let mode = div.querySelector("#mode").value;
        let selected = confirmed_emails.filter(e => div.querySelector(`#chk_${e.replace(/[@.]/g, "_")}`).checked);

        if (selected.length === 0) { 
            alert("Chưa chọn email!"); 
            return; 
        }

        // ============================= 
        // XỬ LÝ XÓA EMAIL VỚI HÌNH THỨC CHẠY LƯỚI
        // ============================= 
        async function runEmail(email) {
            while (!stopFlag) {
                let workers = [];
                for (let i = 0; i < threads; i++) {
                    workers.push(deleteEmail(email).then(resp => {
                        if (resp.errors) {
                            if (resp.errors[0].code === 1675004) {
                                log(`[${email}] ❌ Rate limit reached!`);
                                if (autoStop) {
                                    stopFlag = true; // Stop immediately when rate limit is hit
                                    log("⚠️ Đã dừng vì đạt rate-limit.");
                                }
                            } else {
                                log(`[${email}] ❌ Thất bại`);
                            }
                        } else if (resp.data?.xfb_delete_contact_point?.[0]?.mutation_data?.success) {
                            log(`[${email}] ✅ Thành công!`);
                            return "done";
                        } else {
                            log(`[${email}] ❌ Lỗi khác`);
                        }
                    }));
                }

                let results = await Promise.all(workers);
                if (results.includes("done")) break;

                await sleep(delay);
            }
        }

        if (mode === "concurrent") {
            await Promise.all(selected.map(e => runEmail(e)));
        } else {
            for (let e of selected) {
                if (stopFlag) break;
                await runEmail(e);
            }
        }

        log("🏁 Hoàn tất!");
    };
})();