"use client";

// Global "+" kapısı: profil yokken bekleyen programı tutar, modalı açar.
// Layout'ta bir kez monte edilen TercihProfiliKapisi bu store'a abone olur.

import { useSyncExternalStore } from "react";
import type { Program } from "@/types/yokatlas";
import { PROFIL_DEGISTI_EVENT, sonucHref, type TercihProfili } from "@/features/sihirbaz/sihirbaz-sabitler";
import { tercihProfiliOku, tercihProfiliTamamlandiMi } from "@/features/sihirbaz/sihirbaz-profil";
import {
  ekle,
  listedeMi,
  MANUEL_LISTE_MAX,
  programdanManuelTercih,
  riskleriYenile,
  useManuelListe,
  type ManuelKaynak,
} from "../liste-store";

export type BekleyenProgram = {
  program: Pick<
    Program,
    | "id"
    | "isim"
    | "universite"
    | "il"
    | "unitur"
    | "tur"
    | "sira2025"
    | "sira2024"
  >;
  kaynak: ManuelKaynak;
  adaySira?: number;
  adayTur?: string;
};

/** Kapı tamamlanınca nereye gideceği (sıra yazıldıktan sonra href üretilir).
 *  "sonuc": ücretsiz tabloya götürür. "sihirbaz": Yapay Zeka niyetli CTA'lardan
 *  gelindi — /sonuc'ta üretim akışı devam etsin (girişliyse otomatik üretim,
 *  girişsizse giriş CTA paneli; hero-form ile aynı desen). */
export type BekleyenHedef = "sonuc" | "sihirbaz";

type KapıDurumu = {
  acik: boolean;
  duzenle: boolean;
  /** Tanıtım (giriş) adımını atla, doğrudan sıralama adımıyla aç. */
  dogrudanSira: boolean;
  bekleyen: BekleyenProgram | null;
  bekleyenHedef: BekleyenHedef | null;
  profil: TercihProfili | null;
  profilYuklendi: boolean;
};

let durum: KapıDurumu = {
  acik: false,
  duzenle: false,
  dogrudanSira: false,
  bekleyen: null,
  bekleyenHedef: null,
  profil: null,
  profilYuklendi: false,
};

const dinleyiciler = new Set<() => void>();

function yayinla() {
  for (const cb of dinleyiciler) cb();
}

function profiliTazele() {
  durum = {
    ...durum,
    profil: tercihProfiliOku(),
    profilYuklendi: true,
  };
}

function yukle() {
  if (durum.profilYuklendi || typeof window === "undefined") return;
  profiliTazele();
  window.addEventListener("storage", (e) => {
    if (e.key !== "kolaytercih.sihirbaz") return;
    profiliTazele();
    yayinla();
  });
  // Aynı sekmedeki yazmalar (hero formu, Yapay Zeka sihirbazı) storage olayı
  // tetiklemez; tercihProfiliYaz/Sil bu olayı yayınlar.
  window.addEventListener(PROFIL_DEGISTI_EVENT, () => {
    profiliTazele();
    yayinla();
  });
}

function abone(cb: () => void) {
  dinleyiciler.add(cb);
  if (!durum.profilYuklendi && typeof window !== "undefined") {
    yukle();
    queueMicrotask(yayinla);
  }
  return () => {
    dinleyiciler.delete(cb);
  };
}

const SSR_DURUM: KapıDurumu = {
  acik: false,
  duzenle: false,
  dogrudanSira: false,
  bekleyen: null,
  bekleyenHedef: null,
  profil: null,
  profilYuklendi: false,
};

export function useProfilKapisi(): KapıDurumu {
  return useSyncExternalStore(abone, () => durum, () => SSR_DURUM);
}

export function useTercihProfili(): TercihProfili | null {
  return useSyncExternalStore(
    abone,
    () => {
      if (!durum.profilYuklendi) yukle();
      return durum.profil;
    },
    () => null,
  );
}

export function profilKapisiniKapat() {
  durum = {
    ...durum,
    acik: false,
    duzenle: false,
    dogrudanSira: false,
    bekleyen: null,
    bekleyenHedef: null,
  };
  yayinla();
}

export function profilDuzenlemeyiAc() {
  if (!durum.profilYuklendi) yukle();
  durum = {
    ...durum,
    acik: true,
    duzenle: true,
    dogrudanSira: false,
    bekleyen: null,
    bekleyenHedef: null,
  };
  yayinla();
}

/**
 * Profil yokken kapıyı açar; tamamlanınca `hedef`'e yönlendirilir.
 * Navbar, çekmece +, /sonuc boş hali ve listem gibi yerler bunu kullanır.
 * `dogrudanSira` tanıtım adımını atlar — kapı sıralama adımıyla açılır.
 */
export function profilToplamaAc(
  hedef: BekleyenHedef | null = null,
  dogrudanSira = false,
) {
  if (!durum.profilYuklendi) yukle();
  durum = {
    ...durum,
    acik: true,
    duzenle: false,
    dogrudanSira,
    bekleyen: null,
    bekleyenHedef: hedef,
  };
  yayinla();
}

/**
 * Sonuç sayfasına gitmek isteyen her yer: profil varsa href,
 * yoksa sıralama/tercih kapısını açar (tamamlanınca /sonuc'a gider).
 * `dogrudanSira`, kapı açılırsa tanıtım adımını atlatır (navbar CTA'sı).
 */
export function sonucaGitIste(secenekler?: { dogrudanSira?: boolean }): {
  href: string | null;
  kapiAcildi: boolean;
} {
  if (!durum.profilYuklendi) yukle();
  const profil = durum.profil ?? tercihProfiliOku();
  if (profil) {
    return { href: sonucHref(profil), kapiAcildi: false };
  }
  profilToplamaAc("sonuc", secenekler?.dogrudanSira ?? false);
  return { href: null, kapiAcildi: true };
}

export function programEkleIste(opts: {
  program: BekleyenProgram["program"];
  kaynak?: ManuelKaynak;
  adaySira?: number;
  adayTur?: string;
}): {
  eklendi: boolean;
  zatenVar: boolean;
  doldu: boolean;
  kapiAcildi: boolean;
} {
  const { program, kaynak = "sonuc", adaySira, adayTur } = opts;

  if (listedeMi(program.id)) {
    return { eklendi: false, zatenVar: true, doldu: false, kapiAcildi: false };
  }

  if (!tercihProfiliTamamlandiMi()) {
    durum = {
      ...durum,
      acik: true,
      duzenle: false,
      dogrudanSira: false,
      bekleyen: { program, kaynak, adaySira, adayTur },
      bekleyenHedef: null,
    };
    yayinla();
    return { eklendi: false, zatenVar: false, doldu: false, kapiAcildi: true };
  }

  if (!durum.profilYuklendi) {
    profiliTazele();
  }

  const profil = durum.profil ?? tercihProfiliOku();
  const tercih = programdanManuelTercih(
    program,
    adaySira ?? profil?.sira ?? null,
    kaynak,
  );
  const ok = ekle(tercih);
  if (!ok) {
    return { eklendi: false, zatenVar: false, doldu: true, kapiAcildi: false };
  }
  return { eklendi: true, zatenVar: false, doldu: false, kapiAcildi: false };
}

/** Profil yazıldıktan sonra; bekleyen hedef varsa yönlendirme href'i döner.
 *  `girisli`, "sihirbaz" hedefinde üretimin otomatik başlayıp başlamayacağını
 *  belirler (kapı bileşeni oturumu facet isteğiyle paralel çözer). */
export function profilTamamlandi(
  profil: TercihProfili,
  girisli = false,
): string | null {
  const onceki = durum.profil;
  const duzenle = durum.duzenle;
  riskleriYenile(profil);
  const bekleyen = durum.bekleyen;
  const hedef = durum.bekleyenHedef;
  if (bekleyen) {
    ekle(programdanManuelTercih(bekleyen.program, profil.sira, bekleyen.kaynak));
  }
  durum = {
    ...durum,
    acik: false,
    duzenle: false,
    dogrudanSira: false,
    bekleyen: null,
    bekleyenHedef: null,
    profil,
    profilYuklendi: true,
  };
  yayinla();
  if (hedef === "sihirbaz") {
    // Yapay Zeka niyetli giriş: kapıda sihirbazı zaten doldurdu, /sonuc'ta
    // akış kesilmesin — girişliyse üretim otomatik başlar (?sihirbaz=1),
    // girişsizse ücretsiz tablo + giriş CTA paneli (?hazir=1) karşılar.
    return sonucHref(profil, girisli ? { sihirbaz: "1" } : { hazir: "1" });
  }
  if (hedef === "sonuc") return sonucHref(profil);
  // Düzenlemede sıra/tür değişince /sonuc?sira= URL'si yenilenmezse sunucudaki
  // hayal/dengeli/garanti tablosu eski sıralamada kalır (profil localStorage'da
  // güncellenir ama sayfa searchParams'tan hesaplanır).
  if (
    duzenle &&
    typeof window !== "undefined" &&
    window.location.pathname.startsWith("/sonuc") &&
    (onceki?.sira !== profil.sira || onceki?.tur !== profil.tur)
  ) {
    return sonucHref(profil);
  }
  return null;
}

export function useListeDolu(): boolean {
  const liste = useManuelListe();
  return liste.length >= MANUEL_LISTE_MAX;
}
