"use client";

// /listem üretim gövdesi: sihirbazın kaydettiği bekleyen seçimlerle Yapay
// Zeka listesi burada kurulur (sonuç sayfası yalnızca buraya yönlendirir).
// Başarıda profil tüketilir ve sayfa yenilenir; kredi-yetersiz ve hata
// durumları da bu bileşende karşılanır.

import { useEffect, useRef, useState, type ReactNode } from "react";
import Link from "next/link";
import { useRouter } from "next/navigation";
import { ArrowRight, Lock, RefreshCcw } from "lucide-react";
import { Button } from "@/components/ui/button";
import { Skeleton } from "@/components/ui/skeleton";
import { listeOlustur } from "@/features/rapor/rapor-actions";
import { olay, siraKovasi } from "@/lib/analitik";
import { sonucHref, type TercihProfili } from "@/features/sihirbaz/sihirbaz-sabitler";
import { tercihProfiliOku, tercihProfiliSil } from "@/features/sihirbaz/sihirbaz-profil";

const URETIM_MESAJLARI = [
  "Sıralamana uygun programlar taranıyor…",
  "Gerçek YÖK Atlas verisiyle dengeli liste kuruluyor…",
  "Her tercih için risk ve trend analizi yazılıyor…",
  "Son rötuşlar yapılıyor, neredeyse hazır…",
];

type Durum =
  | { ad: "uretiliyor" }
  | { ad: "kredi-yetersiz" }
  | { ad: "hata"; mesaj: string }
  | { ad: "profil-yok" };

export function ListeUretici({
  hasPaket,
  bosDurum,
}: {
  hasPaket: boolean;
  /** Storage'da bekleyen seçim yoksa gösterilecek boş-liste durumu */
  bosDurum: ReactNode;
}) {
  const router = useRouter();
  const [durum, setDurum] = useState<Durum>({ ad: "uretiliyor" });
  const [profil, setProfil] = useState<TercihProfili | null>(null);
  // Aynı deneme için sabit requestId: cevap kaybolan network hatasında retry
  // çifte harcamaz. Sunucudan cevap gelince sıfırlanır (harcama ya tamamlandı
  // ya iade edildi; sonraki deneme taze id ile başlamalı — bkz. sonuc/actions.ts).
  const requestIdRef = useRef<string | null>(null);
  const basladi = useRef(false);

  async function uret(profil: TercihProfili) {
    if (!requestIdRef.current) requestIdRef.current = crypto.randomUUID();
    setDurum({ ad: "uretiliyor" });

    try {
      const sonuc = await listeOlustur({
        sira: profil.sira,
        tur: profil.tur,
        secimler: profil.secimler,
        requestId: requestIdRef.current,
      });
      if (sonuc.ok) {
        requestIdRef.current = null;
        olay("liste_olusturuldu", {
          tur: profil.tur,
          sira_kovasi: siraKovasi(profil.sira),
        });
        tercihProfiliSil();
        // ?uret=1 URL'de kalmasın: yenileme/geri dönüş üretimi tekrar
        // tetiklemesin. refresh sunucudaki raporu (ve header'daki kredi
        // pill'ini) ekrana getirir.
        window.history.replaceState(null, "", "/listem");
        router.refresh();
        return;
      }
      requestIdRef.current = null;
      if (sonuc.code === "KREDI" || sonuc.code === "PAKET") {
        olay("kredi_bitti");
        setDurum({ ad: "kredi-yetersiz" });
      } else if (sonuc.code === "AUTH") {
        router.push(`/giris?callback=${encodeURIComponent("/listem?uret=1")}`);
      } else {
        setDurum({ ad: "hata", mesaj: sonuc.error });
      }
    } catch {
      setDurum({
        ad: "hata",
        mesaj: "Beklenmeyen bir hata oluştu, tekrar dener misin?",
      });
    }
  }

  useEffect(() => {
    if (basladi.current) return;
    basladi.current = true;
    // Bekleyen seçimler yalnızca client storage'da; mount sonrası okunur.
    const kayitli = tercihProfiliOku();
    if (!kayitli) {
      // eslint-disable-next-line react-hooks/set-state-in-effect
      setDurum({ ad: "profil-yok" });
      return;
    }
    setProfil(kayitli);
    void uret(kayitli);
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, []);

  if (durum.ad === "profil-yok") return <>{bosDurum}</>;

  if (durum.ad === "kredi-yetersiz") {
    // Paketli kullanıcıya paket satma: onun ürünü top-up. Liste ve sohbet
    // geçmişi kalıcı; kredi yükleyince kaldığı yerden devam eder.
    return (
      <section className="rounded-2xl border border-slate-200 bg-white p-8 text-center sm:p-12">
        <Lock className="mx-auto size-8 text-slate-400" aria-hidden />
        <h1 className="mt-4 font-heading text-xl font-bold">
          Kredin bu liste için yetmiyor
        </h1>
        <p className="mx-auto mt-2 max-w-md text-sm text-slate-600">
          {hasPaket
            ? "Liste üretimi 3 kredi. +30 kredi yüklediğinde listen ve sohbet geçmişin duruyor, kaldığın yerden devam edersin."
            : "Liste üretimi 3 kredi. Tercih Dönemi Paketi'yle 60 kredi, tam liste, PDF ve revizyon hakları birlikte gelir."}
        </p>
        <Button
          asChild
          size="lg"
          className="mt-6 cursor-pointer bg-orange-500 text-white transition-colors duration-200 hover:bg-orange-600"
        >
          <Link href="/paket">
            {hasPaket ? "+30 kredi yükle — 129 TL" : "Paketi aktive et — 299 TL"}
            <ArrowRight className="size-4" aria-hidden />
          </Link>
        </Button>
      </section>
    );
  }

  if (durum.ad === "hata") {
    return (
      <section className="rounded-2xl border border-slate-200 bg-white p-8 text-center sm:p-12">
        <h1 className="font-heading text-xl font-bold">Liste kurulamadı</h1>
        <p className="mx-auto mt-2 max-w-md text-sm text-slate-600">
          {durum.mesaj}
        </p>
        <Button
          size="lg"
          onClick={() => profil && void uret(profil)}
          className="mt-6 cursor-pointer bg-orange-500 text-white transition-colors duration-200 hover:bg-orange-600"
        >
          <RefreshCcw className="size-4" aria-hidden />
          Tekrar dene
        </Button>
        {profil ? (
          <p className="mt-4 text-xs text-slate-500">
            Seçimlerin kayıtlı —{" "}
            <Link href={sonucHref(profil)} className="underline">
              sonuç sayfasına dönebilirsin
            </Link>
            .
          </p>
        ) : null}
      </section>
    );
  }

  return <UretimGovdesi />;
}

function UretimGovdesi() {
  const [mesajIdx, setMesajIdx] = useState(0);

  useEffect(() => {
    const interval = setInterval(() => {
      setMesajIdx((i) => Math.min(i + 1, URETIM_MESAJLARI.length - 1));
    }, 7000);
    return () => clearInterval(interval);
  }, []);

  return (
    <section
      aria-live="polite"
      className="rounded-2xl border border-slate-200 bg-white p-6 sm:p-8"
    >
      <div className="flex flex-col items-center gap-1.5 text-center">
        <h1 className="font-heading text-lg font-bold">Listen hazırlanıyor</h1>
        <p className="max-w-sm text-sm text-slate-500">
          {URETIM_MESAJLARI[mesajIdx]}
        </p>
        <p className="text-xs text-slate-400">
          Bu işlem yarım dakika kadar sürebilir, sayfayı kapatma.
        </p>
      </div>

      {/* Gelmekte olan tercih listesinin iskeleti */}
      <div className="mt-8 flex flex-col gap-2">
        <div className="flex items-center justify-between">
          <Skeleton className="h-6 w-44" />
          <Skeleton className="h-6 w-24 rounded-full" />
        </div>
        {Array.from({ length: 6 }).map((_, i) => (
          <Skeleton key={i} className="h-14 w-full rounded-xl" />
        ))}
      </div>
    </section>
  );
}
