"use client";

// Manuel liste + sihirbaz profilinin sunucu senkronu (İP-C). UserNav'dan
// (sunucu bileşeni) userId prop'uyla monte edilir — RybbitIdentify ile aynı
// kanonik desen. Hiçbir şey render etmez.
//
// - Mount: oturum sinyali yayılır (çekmece/banner girişsizliği buradan öğrenir).
// - Girişte: oturum başına 1 kez merge (çakışmada lokal kazanır); dönen
//   kanonik liste lokale birleşir, profil lokalde yoksa tercihProfiliYaz ile
//   iner (PROFIL_DEGISTI_EVENT otomatik yayılır, profil kapısı tazelenir).
// - Sonrasında: liste/profil değişimleri ~2 sn debounce ile sunucuya yazılır.

import { useEffect, useRef } from "react";
import { PROFIL_DEGISTI_EVENT } from "@/features/sihirbaz/sihirbaz-sabitler";
import { tercihProfiliOku, tercihProfiliYaz } from "@/features/sihirbaz/sihirbaz-profil";
import { listeOku, sunucuylaBirlestir, useManuelListe } from "../liste-store";
import { oturumDurumuBildir } from "../liste-oturum-sinyali";
import { listeSenkronla, listeyiKaydet } from "../liste-actions";

const DEBOUNCE_MS = 2000;

export function ListeSenkron({ userId }: { userId: string | null }) {
  const liste = useManuelListe();
  const mergeTamam = useRef(false);
  const sonGonderilen = useRef<string | null>(null);
  const zamanlayici = useRef<number | null>(null);

  useEffect(() => {
    oturumDurumuBildir(Boolean(userId));
  }, [userId]);

  // Giriş anı merge'i — sekme oturumu başına bir kez (idempotent olsa da
  // her gezinmede sunucuya gitmesin diye sessionStorage ile tekilleştirilir).
  useEffect(() => {
    if (!userId) return;
    const anahtar = `kolaytercih.liste-senkron.${userId}`;
    try {
      if (sessionStorage.getItem(anahtar)) {
        mergeTamam.current = true;
        return;
      }
    } catch {}
    let iptal = false;
    void (async () => {
      const sonuc = await listeSenkronla({
        items: listeOku(),
        profil: tercihProfiliOku(),
      });
      if (iptal || !sonuc.ok) return;
      sunucuylaBirlestir(sonuc.items);
      if (sonuc.profil && !tercihProfiliOku()) {
        tercihProfiliYaz(sonuc.profil);
      }
      // Merge sonrası anlık durumu "gönderildi" say — debounce aynı veriyi
      // hemen geri yazmasın.
      sonGonderilen.current = JSON.stringify({
        items: listeOku(),
        profil: tercihProfiliOku(),
      });
      mergeTamam.current = true;
      try {
        sessionStorage.setItem(anahtar, "1");
      } catch {}
    })();
    return () => {
      iptal = true;
    };
  }, [userId]);

  // Girişliyken süregelen senkron: liste (store aboneliği) ve profil
  // (PROFIL_DEGISTI_EVENT) değişimlerini debounce ile sunucuya it.
  useEffect(() => {
    if (!userId) return;

    const planla = () => {
      if (zamanlayici.current != null) window.clearTimeout(zamanlayici.current);
      zamanlayici.current = window.setTimeout(() => {
        if (!mergeTamam.current) return;
        const items = listeOku();
        const profil = tercihProfiliOku();
        const imza = JSON.stringify({ items, profil });
        if (imza === sonGonderilen.current) return;
        sonGonderilen.current = imza;
        void listeyiKaydet({ items, profil });
      }, DEBOUNCE_MS);
    };

    planla();
    window.addEventListener(PROFIL_DEGISTI_EVENT, planla);
    return () => {
      window.removeEventListener(PROFIL_DEGISTI_EVENT, planla);
      if (zamanlayici.current != null) window.clearTimeout(zamanlayici.current);
    };
  }, [userId, liste]);

  return null;
}
