(() => { const FIREBASE_ENDPOINT = "https://bcrapi-default-rtdb.firebaseio.com"; const lastResults = {}; const updateLogs = []; // log hiện tại trên UI const allLogs = []; // lưu tất cả lịch sử kể cả khi clear // === Firebase helper === async function getFromFirebase(tableName) { try { const url = `${FIREBASE_ENDPOINT}/bcr/${tableName}.json`; const res = await fetch(url); return res.ok ? await res.json() : null; } catch { return null; } } async function saveToFirebase(table) { try { const payload = { table_name: table.table_name || "", cau: table.goodRoad || "", results: table.result || "" }; const curr = payload.results; if (!curr) return; const prevCache = lastResults[table.table_name] || ""; const prevFbData = await getFromFirebase(table.table_name); const prevFirebase = prevFbData?.results || ""; if (curr === prevCache || curr === prevFirebase) { safeLog(`⏩ Bỏ qua (trùng dữ liệu) ${table.table_name}`); return; } lastResults[table.table_name] = curr; const url = `${FIREBASE_ENDPOINT}/bcr/${table.table_name}.json`; const res = await fetch(url, { method: "PUT", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload) }); if (!res.ok) throw new Error(res.statusText); const log = { time: new Date().toLocaleTimeString(), table: table.table_name, old: prevFirebase || "(trống)", new: curr }; updateLogs.unshift(log); allLogs.unshift(log); if (updateLogs.length > 50) updateLogs.splice(50); renderMenu(); safeLog(`✅ Firebase (${table.table_name}): ${curr}`); } catch (err) { safeLog(`${table.table_name} lỗi Firebase: ${err.message}`); } } // === Menu === function renderMenu(showAll = false) { let menu = document.getElementById("firebase-update-menu"); if (!menu) { menu = document.createElement("div"); menu.id = "firebase-update-menu"; menu.style = ` position:fixed;top:10px;right:10px; background:rgba(0,0,0,0.85);color:#fff; padding:15px;border-radius:10px; z-index:999999;font-size:13px;font-family:monospace; max-height:90vh;overflow-y:auto;min-width:280px;`; document.body.appendChild(menu); } const logs = showAll ? allLogs : updateLogs; let html = `