// plugins/analytics.client.ts
// ردیابی سبک بازدید صفحه/جلسه/منبع ورودی (UTM یا ریفرر). فقط سمت کلاینت اجرا می‌شود
// (پسوند .client.ts) تا در SSR بازدید تکراری ثبت نشود. شکست این ردیابی هرگز نباید
// روی تجربهٔ کاربر یا بقیهٔ اپلیکیشن اثر بگذارد؛ به همین دلیل همه‌جا try/catch شده.
//
// تفکیک اپ از وب‌سایت لازم نیست اینجا انجام شود: هدر `platform` را همان
// plugins/axios.ts روی هر درخواست می‌گذارد (اینجا webapp) و بک‌اند از همان می‌خواند.
import { defineNuxtPlugin, useCookie, useRouter } from "#app";

const SESSION_KEY = "artjoo_session";
const SESSION_TTL = 30 * 60 * 1000; // ۳۰ دقیقه بی‌فعالیتی → جلسهٔ جدید

function makeId(length: number) {
  const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  let result = "";
  for (let i = 0; i < length; i++) {
    result += chars.charAt(Math.floor(Math.random() * chars.length));
  }
  return result;
}

// شناسهٔ ناشناسِ ماندگار؛ همان کوکی «imei»ای که plugins/axios.ts هم استفاده می‌کند
// (یک‌بار به‌ازای مرورگر ساخته و برای یک سال نگه‌داری می‌شود).
function getAnonymousId(): string {
  const imei = useCookie<string>("imei", { maxAge: 60 * 60 * 24 * 365 });
  if (!imei.value) {
    imei.value = makeId(32);
  }
  return imei.value;
}

// جلسه: در localStorage با پنجرهٔ ۳۰ دقیقه‌ای بی‌فعالیتی نگه‌داری می‌شود.
function getSession(): { id: string; isNew: boolean } {
  try {
    const raw = window.localStorage.getItem(SESSION_KEY);
    const now = Date.now();

    if (raw) {
      const parsed = JSON.parse(raw);
      if (parsed && parsed.id && now - parsed.lastActivity < SESSION_TTL) {
        parsed.lastActivity = now;
        window.localStorage.setItem(SESSION_KEY, JSON.stringify(parsed));
        return { id: parsed.id, isNew: false };
      }
    }

    const id = makeId(32);
    window.localStorage.setItem(SESSION_KEY, JSON.stringify({ id, lastActivity: now }));
    return { id, isNew: true };
  } catch (e) {
    // localStorage در دسترس نیست (مثلاً حالت خصوصی مرورگر)
    return { id: makeId(32), isNew: true };
  }
}

function readUtm(): { utm_source?: string; utm_medium?: string; utm_campaign?: string } {
  try {
    const params = new URLSearchParams(window.location.search);
    const utm: Record<string, string> = {};
    if (params.get("utm_source")) utm.utm_source = params.get("utm_source") as string;
    if (params.get("utm_medium")) utm.utm_medium = params.get("utm_medium") as string;
    if (params.get("utm_campaign")) utm.utm_campaign = params.get("utm_campaign") as string;
    return utm;
  } catch (e) {
    return {};
  }
}

export default defineNuxtPlugin((nuxtApp) => {
  const router = useRouter();

  const send = (path: string, payload: Record<string, unknown>) => {
    // بیکنِ سبک؛ شکست آن هرگز نباید اپلیکیشن اصلی را مختل کند
    // @ts-ignore
    nuxtApp.$api.post(path, payload).catch(() => {});
  };

  const trackPageView = (path: string) => {
    try {
      const anonymousId = getAnonymousId();
      const session = getSession();
      const utm = readUtm();
      const referrer = document.referrer || "";

      if (session.isNew) {
        send("/track/session-start", {
          anonymous_id: anonymousId,
          session_id: session.id,
          landing_page: window.location.href,
          referrer,
          ...utm,
        });
      }

      send("/track/page-view", {
        anonymous_id: anonymousId,
        session_id: session.id,
        path,
        referrer,
        ...utm,
      });
    } catch (e) {
      // آنالیتیکس هرگز نباید تجربهٔ کاربر را مختل کند
    }
  };

  // afterEach هم بازدید اولیهٔ صفحه (پس از هیدریشن) و هم ناوبری‌های بعدی SPA را پوشش می‌دهد
  router.afterEach((to) => {
    trackPageView(to.fullPath);
  });
});
