"use client";

import { useEffect, useRef, type RefObject } from "react";
import { olay, type OlayAdi, type Ozellikler } from "@/lib/analitik";

/**
 * Bir elemanın viewport'a ilk girişinde analitik olayı atan ref hook'u.
 * Gösterim olayları (hazir_panel_goruntulendi, kilit_goruntulendi vb.)
 * oturum başına en fazla 1 kez sayılmalı; tekilleştirme sessionStorage
 * anahtarıyla yapılır. IntersectionObserver yoksa olay hiç atılmaz —
 * "görüntülendi" ölçümünde görünürlüğü doğrulayamadığımız cihazı saymak
 * veriyi şişirir.
 */
export function useGorunumOlayi<T extends HTMLElement = HTMLElement>(
  ad: OlayAdi,
  ozellikler?: Ozellikler,
  /** Aynı olayın farklı yüzeyleri için tekilleştirme eki ("satir", "kart"). */
  anahtarEki?: string,
): RefObject<T | null> {
  const ref = useRef<T>(null);
  // Özellikler her render sonrası tazelenir; observer effect'i yalnızca
  // ad/anahtar değişiminde kurulur (deps'e obje koymamak için ref).
  const ozelliklerRef = useRef(ozellikler);
  useEffect(() => {
    ozelliklerRef.current = ozellikler;
  });

  useEffect(() => {
    const el = ref.current;
    if (!el || typeof IntersectionObserver === "undefined") return;

    const anahtar = `kolaytercih.olay.${ad}${anahtarEki ? `.${anahtarEki}` : ""}`;
    try {
      if (window.sessionStorage.getItem(anahtar)) return;
    } catch {
      // Storage engelliyse tekilleştirmeden vazgeç, olay yine atılabilir
    }

    const io = new IntersectionObserver((entries) => {
      if (!entries.some((e) => e.isIntersecting)) return;
      io.disconnect();
      try {
        window.sessionStorage.setItem(anahtar, "1");
      } catch {
        // yut
      }
      olay(ad, ozelliklerRef.current);
    });
    io.observe(el);
    return () => io.disconnect();
  }, [ad, anahtarEki]);

  return ref;
}
