/*!
 * STONK AI BOOKING — bộ nạp hai nhịp cho dashboard.
 * Hiển thị HTML/màn chờ trước, chỉ nạp app.js nặng sau khi trình duyệt đã có
 * ít nhất một lần vẽ. Nhờ vậy popup mở ngay và không bị báo timeout giả.
 */
(function stonkBootLoader() {
  "use strict";

  const loader = document.currentScript;
  const params = new URLSearchParams(window.location.search);
  const traceId = String(params.get("traceId") || "");
  const bootNonce = String(params.get("bootNonce") || "");
  const parentOriginRaw = String(params.get("parentOrigin") || "");
  const appSource = String(loader?.dataset?.appSrc || "./app.js");
  const collabSource = String(loader?.dataset?.collabSrc || "./collab-performance.js");
  const adSeenKey = "stonk-warmup-ad-seen-v1";
  let adSeenBefore = false;
  try { adSeenBefore = localStorage.getItem(adSeenKey) === "1"; } catch {}
  const minimumAdMs = adSeenBefore ? 0 : 2000;
  const bannerCacheKey = "stonk-warmup-banner-render-v1";
  const openedAt = Date.now();
  let started = false;
  let appReady = false;
  let adElapsed = adSeenBefore;
  let skipped = adSeenBefore;
  let readyNotified = false;

  if (!adSeenBefore) {
    // Chỉ ghi sau khi HTML quảng cáo đã có mặt. Từ lần mở sau (kể cả reload
    // ngay sau đăng nhập) App đi thẳng vào màn làm việc.
    try { localStorage.setItem(adSeenKey, "1"); } catch {}
  }

  function parentOrigin() {
    try {
      const parsed = new URL(parentOriginRaw);
      return /^https?:$/.test(parsed.protocol) ? parsed.origin : "*";
    } catch {
      return "*";
    }
  }

  function notify(type, detail = {}) {
    if (window.parent === window) return;
    try {
      window.parent.postMessage({ type, traceId, bootNonce, ...detail }, parentOrigin());
    } catch {}
  }

  function setBootText(text) {
    const label = document.getElementById("bootSplashStatus");
    if (label) label.textContent = String(text || "");
  }

  function applyAdminBannerCache(cache) {
    if (!cache || typeof cache !== "object") return false;
    const host = document.getElementById("bootSplashAdHost");
    const card = document.getElementById("bootSplashAdCard");
    const fallback = document.getElementById("bootSplashFallback");
    if (!host || !card || !fallback) return false;
    if (cache.enabled === false) {
      host.style.display = "none";
      fallback.style.display = "flex";
      fallback.innerHTML = `<div style="text-align:center"><strong style="display:block;font-size:clamp(24px,4vw,46px);letter-spacing:.08em">STONK AI BOOKING</strong></div>`;
    } else {
      const html = typeof cache.html === "string" && cache.html.length <= 120000 ? cache.html : "";
      if (!html) return false;
      const theme = String(cache.theme || "macdinh").replace(/[^a-z]/gi, "") || "macdinh";
      card.className = `wu-promo theme-${theme}`;
      card.innerHTML = html;
      fallback.style.display = "none";
      host.style.display = "flex";
    }
    requestAnimationFrame(() => notify("STONK_OVERLAY_BANNER_READY"));
    return true;
  }

  // Cache thuộc origin của extension nên có thể vẽ đúng quảng cáo Admin ngay lần mở kế tiếp,
  // không đợi app.js hơn 1 MB hoặc gọi mạng rồi mới hiện.
  try {
    applyAdminBannerCache(JSON.parse(localStorage.getItem(bannerCacheKey) || "null"));
  } catch {}
  window.__STONK_BOOT_BANNER_APPLY__ = applyAdminBannerCache;

  // Mỗi lần mở vẫn lấy cấu hình công khai mới nhất. Không chặn boot: khi app.js đã có bộ dựng
  // an toàn, cấu hình này sẽ được render, thay cache và cập nhật ngay màn đang mở.
  const bootApiBase = (typeof window !== "undefined" && window.location && window.location.protocol && window.location.protocol.startsWith("http")) ? "" : "https://bookingkoc.stonkagency.vn";
  fetch(bootApiBase + "/local/me/access", { cache: "no-store", credentials: "omit" })
    .then(response => response.ok ? response.json() : null)
    .then(payload => {
      const gate = payload?.data?.gate ?? payload?.gate;
      const remoteCss = gate?.remoteCss || payload?.data?.remoteCss || payload?.remoteCss;
      if (remoteCss) {
        let style = document.getElementById("stonkRemoteDynamicCss");
        if (!style) {
          style = document.createElement("style");
          style.id = "stonkRemoteDynamicCss";
          document.head.appendChild(style);
        }
        style.textContent = remoteCss;
      }
      const banner = gate?.banner;
      if (!banner || typeof banner !== "object") return;
      if (typeof window.__STONK_BOOT_BANNER_CONFIG__ === "function") window.__STONK_BOOT_BANNER_CONFIG__(banner);
      else window.__STONK_PENDING_BOOT_BANNER_CONFIG__ = banner;
    })
    .catch(() => {});

  function revealKocWorkspace() {
    // HTML đã parse xong nhưng giữ ảnh quảng cáo tĩnh tới khi app.js dựng xong.
    // Nhờ vậy không có khoảng nền trắng giữa BOOT_READY và APP_READY.
    document.documentElement.dataset.stonkShellReady = "1";
  }

  function finishBootIfReady() {
    if (!appReady || (!adElapsed && !skipped)) return;
    document.getElementById("bootSplash")?.remove();
    if (!readyNotified) {
      readyNotified = true;
      notify("STONK_OVERLAY_APP_READY");
    }
  }

  function updateCountdown() {
    if (appReady && (adElapsed || skipped)) return finishBootIfReady();
    const remaining = Math.max(0, minimumAdMs - (Date.now() - openedAt));
    if (!skipped) setBootText(appReady
      ? `Sẵn sàng · tự động vào sau ${Math.max(1, Math.ceil(remaining / 1000))} giây`
      : `Đang nạp ứng dụng · ${Math.max(1, Math.ceil(remaining / 1000))} giây`);
  }

  function loadScript(src) {
    return new Promise((resolve, reject) => {
      const script = document.createElement("script");
      script.src = src;
      script.async = false;
      script.onload = () => resolve(script);
      script.onerror = () => reject(new Error(`Không tải được ${src.split("?")[0]}`));
      document.body.appendChild(script);
    });
  }

  async function startHeavyApp() {
    if (started) return;
    started = true;
    setBootText("Giao diện đã mở · đang nạp tính năng…");
    notify("STONK_OVERLAY_APP_LOADING");
    try {
      await loadScript(appSource);
      notify("STONK_OVERLAY_APP_SCRIPT_READY");
      await loadScript(collabSource);
      appReady = true;
      finishBootIfReady();
    } catch (error) {
      const message = String(error?.message || error || "Không rõ lỗi");
      setBootText(`Không tải được ứng dụng: ${message}`);
      notify("STONK_OVERLAY_APP_ERROR", { message });
    }
  }

  // Tín hiệu này phát ngay khi HTML đã tới cuối trang, trước khi tải app.js hơn 1 MB.
  revealKocWorkspace();
  notify("STONK_OVERLAY_BOOT_READY");

  const skipButton = document.getElementById("bootSplashSkip");
  skipButton?.addEventListener("click", () => {
    skipped = true;
    skipButton.disabled = true;
    setBootText(appReady ? "Đang mở không gian làm việc…" : "Đang hoàn tất tải ứng dụng…");
    finishBootIfReady();
  });
  const countdownTimer = setInterval(updateCountdown, 250);
  setTimeout(() => {
    adElapsed = true;
    clearInterval(countdownTimer);
    finishBootIfReady();
  }, minimumAdMs);
  updateCountdown();

  // Hai nhịp vẽ giúp màn chờ STONK xuất hiện trước khi Chrome phân tích app.js nặng.
  requestAnimationFrame(() => requestAnimationFrame(() => {
    // Nếu máy chưa từng có cache và mạng đang yếu, template dịch vụ nhúng sẵn đã paint xong.
    // Cho lớp ngoài bàn giao để người dùng thấy template này thay vì một nền chờ trống.
    notify("STONK_OVERLAY_BOOT_TEMPLATE_READY");
    setTimeout(startHeavyApp, 0);
  }));
  // Fallback cho tab nền hoặc trình duyệt đang giảm nhịp requestAnimationFrame.
  setTimeout(startHeavyApp, 240);
})();
