/**
 * Cache Helper - Utilities để xử lý cache trình duyệt
 */

/**
 * Lấy version từ package.json hoặc build timestamp
 */
export const getAppVersion = () => {
  // Ưu tiên sử dụng version từ package.json nếu có
  if (typeof __APP_VERSION__ !== "undefined") {
    return __APP_VERSION__;
  }
  // Fallback về build timestamp
  return typeof __BUILD_TIMESTAMP__ !== "undefined"
    ? __BUILD_TIMESTAMP__
    : Date.now().toString();
};

/**
 * Lấy timestamp build từ Vite define (deprecated, sử dụng getAppVersion)
 */
export const getBuildTimestamp = () => {
  return getAppVersion();
};

/**
 * Thêm cache busting parameter vào URL
 * @param {string} url - URL gốc
 * @returns {string} URL với cache busting parameter
 */
export const addCacheBuster = (url) => {
  const separator = url.includes("?") ? "&" : "?";
  const timestamp = getBuildTimestamp();
  return `${url}${separator}v=${timestamp}`;
};

/**
 * Force reload trang với cache busting
 */
export const forceReload = () => {
  const timestamp = Date.now();
  const url = new URL(window.location);
  url.searchParams.set("v", timestamp);
  window.location.href = url.toString();
};

/**
 * Clear tất cả cache của trình duyệt
 */
export const clearAllCache = async () => {
  try {
    // Clear localStorage
    localStorage.clear();

    // Clear sessionStorage
    sessionStorage.clear();

    // Clear service worker cache nếu có
    if ("serviceWorker" in navigator) {
      const registrations = await navigator.serviceWorker.getRegistrations();
      for (let registration of registrations) {
        await registration.unregister();
      }
    }

    // Clear cache storage nếu có
    if ("caches" in window) {
      const cacheNames = await caches.keys();
      await Promise.all(
        cacheNames.map((cacheName) => caches.delete(cacheName))
      );
    }

    console.log("All cache cleared successfully");
    return true;
  } catch (error) {
    console.error("Error clearing cache:", error);
    return false;
  }
};

/**
 * Kiểm tra version và force reload nếu cần
 * @param {string} currentVersion - Version hiện tại
 * @param {string} newVersion - Version mới
 */
export const checkVersionAndReload = (currentVersion, newVersion) => {
  if (currentVersion !== newVersion) {
    console.log(
      `Version changed from ${currentVersion} to ${newVersion}. Reloading...`
    );
    localStorage.setItem("app_version", newVersion);
    forceReload();
  }
};

/**
 * Lấy version từ localStorage
 */
export const getStoredVersion = () => {
  return localStorage.getItem("app_version") || "0";
};

/**
 * Set version vào localStorage
 */
export const setStoredVersion = (version) => {
  localStorage.setItem("app_version", version);
};

/**
 * Cấu hình version thủ công (override)
 * @param {string} version - Version muốn set
 */
export const setManualVersion = (version) => {
  localStorage.setItem("manual_app_version", version);
  console.log(`Manual version set to: ${version}`);
};

/**
 * Lấy version thủ công nếu có
 */
export const getManualVersion = () => {
  return localStorage.getItem("manual_app_version");
};

/**
 * Xóa version thủ công
 */
export const clearManualVersion = () => {
  localStorage.removeItem("manual_app_version");
  console.log("Manual version cleared");
};

/**
 * Lấy version hiệu quả (ưu tiên manual version)
 */
export const getEffectiveVersion = () => {
  const manualVersion = getManualVersion();
  if (manualVersion) {
    return manualVersion;
  }
  return getAppVersion();
};

/**
 * Thêm cache busting headers cho axios requests
 */
export const getCacheBustingHeaders = () => {
  const timestamp = Date.now();
  return {
    "Cache-Control": "no-cache, no-store, must-revalidate",
    Pragma: "no-cache",
    Expires: "0",
    "X-Timestamp": timestamp.toString(),
  };
};

/**
 * Reload CSS files với cache busting
 */
export const reloadCSS = () => {
  const links = document.querySelectorAll('link[rel="stylesheet"]');
  links.forEach((link) => {
    const href = link.href;
    const url = new URL(href);
    url.searchParams.set("v", Date.now());
    link.href = url.toString();
  });
};

/**
 * Preload critical resources với cache busting
 */
export const preloadCriticalResources = () => {
  const timestamp = getBuildTimestamp();

  // Preload main CSS
  const cssLink = document.createElement("link");
  cssLink.rel = "preload";
  cssLink.as = "style";
  cssLink.href = addCacheBuster("/src/style.css");
  document.head.appendChild(cssLink);

  // Preload main JS
  const jsLink = document.createElement("link");
  jsLink.rel = "preload";
  jsLink.as = "script";
  jsLink.href = addCacheBuster("/src/main.js");
  document.head.appendChild(jsLink);
};
