/**
 * RAJ365 — Player App Visual Enhancement Layer
 * ═══════════════════════════════════════════════════════════
 * শুধুমাত্র VISUAL enhancement (ripple click-effect, fade-in
 * animation)। এই ফাইল কোনো click preventDefault/stopPropagation
 * করে না, কোনো API call করে না, কোনো route/state বদলায় না —
 * তাই existing app-এর কোনো logic-এ প্রভাব পড়ে না। যেকোনো ত্রুটি
 * silently ignore হয় (try/catch), যাতে ভুল করেও কখনো মূল app
 * ভেঙে না যায়।
 * ═══════════════════════════════════════════════════════════
 */
(function () {
  "use strict";

  function safe(fn) {
    try { fn(); } catch (e) { /* silently ignore — কখনো main app-কে প্রভাবিত করবে না */ }
  }

  /* ── ১. Ripple click-effect — button/card-এ ── */
  function attachRipple() {
    document.addEventListener("click", function (e) {
      safe(function () {
        const target = e.target.closest(
          ".van-button, .gameItem1, .aloneGame, .all_item, .tab_active, .fun-tab-item"
        );
        if (!target) return;

        const rect = target.getBoundingClientRect();
        const span = document.createElement("span");
        const size = Math.max(rect.width, rect.height);

        span.className = "rg-ripple-span";
        span.style.width = span.style.height = size + "px";
        span.style.left = (e.clientX - rect.left - size / 2) + "px";
        span.style.top = (e.clientY - rect.top - size / 2) + "px";

        const prevPosition = getComputedStyle(target).position;
        if (prevPosition === "static") target.style.position = "relative";
        target.style.overflow = target.style.overflow || "hidden";

        target.appendChild(span);
        setTimeout(function () {
          safe(function () { span.remove(); });
        }, 500);
      });
    }, { passive: true }); // passive: true => কখনো normal click behavior আটকাবে না
  }

  /* ── ২. Scroll-এ Fade-in (game card, banner ইত্যাদি) ── */
  function attachFadeIn() {
    if (!("IntersectionObserver" in window)) return; // পুরনো browser হলে চুপচাপ skip

    const observer = new IntersectionObserver(function (entries) {
      entries.forEach(function (entry) {
        if (entry.isIntersecting) {
          safe(function () {
            entry.target.classList.add("rg-fade-in");
          });
          observer.unobserve(entry.target);
        }
      });
    }, { threshold: 0.1 });

    function observeNewCards() {
      safe(function () {
        document
          .querySelectorAll(
            ".gameItem1:not(.rg-observed), .aloneGame:not(.rg-observed), .my-swipe:not(.rg-observed)"
          )
          .forEach(function (el) {
            el.classList.add("rg-observed");
            observer.observe(el);
          });
      });
    }

    // App SPA হওয়ায় নতুন card পরে যোগ হতে পারে — তাই periodically নতুন card খুঁজি
    // (এটা কোনো app-state পড়ে/বদলায় না, শুধু DOM-এ নতুন element এসেছে কিনা দেখে)
    observeNewCards();
    setInterval(observeNewCards, 1500);
  }

  /* ── শুরু করো, DOM প্রস্তুত হওয়ার পর ── */
  if (document.readyState === "loading") {
    document.addEventListener("DOMContentLoaded", function () {
      safe(attachRipple);
      safe(attachFadeIn);
    });
  } else {
    safe(attachRipple);
    safe(attachFadeIn);
  }
})();
