import type { Metadata } from "next";
import { asc, eq } from "drizzle-orm";
import { redirect } from "next/navigation";
import { MessageCircleQuestion, Sparkles } from "lucide-react";
import { verifySession, getCurrentUser } from "@/lib/session";
import { appDb, schema } from "@/lib/appdb";
import { URUNLER, MAX_REVIZYON } from "@/lib/credits";
import type { RaporSonuc } from "@/lib/ai/rapor";
import type { RaporParams } from "@/lib/rapor-havuzu";
import { ViewportPortal } from "@/components/viewport-portal";
import { SiteFooter } from "@/components/site-footer";
import { raporMaskele, ACIK_SATIR, type MaskeliRapor } from "@/lib/rapor-maske";
import type { Mesaj } from "./sohbet-client";
import { ListemGovde } from "./listem-govde";
import { ListemBosCta } from "./listem-bos-cta";
import { ListeUretici } from "./liste-uretici";

// listeRevize aksiyonu 2 AI denemesi yapabiliyor (deneme başına 60 sn abort
// sınırı, bkz. lib/ai/cagri.ts) → en kötü ~120 sn. Platform limiti bundan
// SONRA dolmalı ki kredi iadesi her zaman çalışabilsin. Self-hosted docker'da
// bu değer etkisiz ama invaryant belgeli kalsın; öndeki reverse proxy'nin
// istek süresi limiti de >= 200 sn olmalı.
export const maxDuration = 300;

export const metadata: Metadata = {
  title: "Listem",
  robots: { index: false, follow: false },
};

const PAKET_FIYATI = (URUNLER.paket.amountKurus / 100).toLocaleString("tr-TR", {
  maximumFractionDigits: 0,
});

export default async function ListemPage({
  searchParams,
}: {
  searchParams: Promise<{ acildi?: string; uret?: string }>;
}) {
  // Girişsiz gelene callback'i ?uret=1 ile ver: girişten dönüşte bekleyen
  // seçimlerle üretim kaldığı yerden başlasın.
  const ilkParams = await searchParams;
  const geriYol = ilkParams.uret === "1" ? "/listem?uret=1" : "/listem";
  const session = await verifySession(geriYol);
  const [user, params, satir, sohbetGecmisi] = await Promise.all([
    getCurrentUser(),
    searchParams,
    appDb.query.reports.findFirst({
      where: eq(schema.reports.userId, session.user.id),
    }),
    appDb
      .select({
        id: schema.chatMessages.id,
        role: schema.chatMessages.role,
        content: schema.chatMessages.content,
      })
      .from(schema.chatMessages)
      .where(eq(schema.chatMessages.userId, session.user.id))
      .orderBy(asc(schema.chatMessages.createdAt))
      .limit(100),
  ]);
  if (!user) redirect(`/giris?callback=${encodeURIComponent(geriYol)}`);

  const { acildi } = params;
  const kilitAcilisi = Boolean(user.hasPaket && acildi === "1");
  const raporVar = Boolean(satir?.result);

  if (!raporVar) {
    const bosDurum = (
      <section className="mx-auto flex max-w-2xl flex-col items-center px-4 py-16 text-center">
        <Sparkles className="size-10 text-primary" aria-hidden />
        <h1 className="mt-4 font-heading text-2xl font-bold">
          Henüz Yapay Zeka listen yok
        </h1>
        <ListemBosCta />
      </section>
    );
    return (
      <>
        <main className="mx-auto w-full max-w-4xl px-4 py-12">
          {/* ?uret=1: sihirbazdan yönlendirildi — bekleyen seçimlerle üretim
              burada koşar, animasyon ve hata/kredi durumları burada yaşar. */}
          {params.uret === "1" ? (
            <ListeUretici
              hasPaket={Boolean(user.hasPaket)}
              bosDurum={bosDurum}
            />
          ) : (
            bosDurum
          )}
        </main>
        <SiteFooter />
      </>
    );
  }

  const rapor: MaskeliRapor = user.hasPaket
    ? (satir!.result as RaporSonuc)
    : raporMaskele(satir!.result as RaporSonuc);
  const raporParams = satir!.params as RaporParams;
  // Danışman özeti sohbetin açılış mesajı olarak gösterilir; sohbet
  // /api/soru üzerinden zaten liste + seçim bağlamıyla çalışıyor.
  // Paketsizde rapor zaten maskeli: 1 uyarı açık, kalanının yalnızca sayısı var.
  const danismanOzeti = rapor.genelDegerlendirme
    ? {
        metin: rapor.genelDegerlendirme,
        uyarilar: rapor.uyarilar,
        kilitli: !user.hasPaket,
        kilitliUyariSayisi: user.hasPaket ? undefined : rapor.kilitliUyariSayisi,
      }
    : undefined;

  return (
    <>
    <main className="mx-auto w-full max-w-7xl px-4 py-12">
      {kilitAcilisi ? (
        <div
          role="status"
          className="mb-6 flex items-center gap-3 rounded-2xl border border-emerald-200 bg-emerald-50 px-4 py-3 text-sm font-medium text-emerald-800"
        >
          <Sparkles className="size-4 shrink-0" aria-hidden />
          Paketin aktif — listendeki tercihlerin tamamı, gerekçeler, riskler ve
          PDF artık açık.
        </div>
      ) : null}
      {/* Başlık ve revizyon/PDF aksiyonları listenin kendi başlık satırında
          (bkz. listem-govde.tsx) — sayfa üstünde ayrı bir header yok. */}
      <ListemGovde
        rapor={rapor}
        adaySira={raporParams.sira}
        hasPaket={Boolean(user.hasPaket)}
        kilitAcilisi={kilitAcilisi}
        kilitliBaslangic={user.hasPaket ? undefined : ACIK_SATIR}
        kredi={user.creditBalance}
        sohbetGecmisi={sohbetGecmisi as Mesaj[]}
        ozet={danismanOzeti}
        kalanHak={Math.max(0, MAX_REVIZYON - (satir!.revisionCount ?? 0))}
        paketFiyati={PAKET_FIYATI}
        paketKredi={URUNLER.paket.credits}
      />

      <ViewportPortal>
        <a
          href="#sohbet"
          className="fixed bottom-5 right-4 z-40 inline-flex h-11 items-center gap-2 rounded-full bg-primary px-4 text-sm font-semibold text-white shadow-lg transition-transform duration-200 active:scale-[0.97] lg:hidden print:hidden"
        >
          <MessageCircleQuestion className="size-4" aria-hidden />
          Danışmana sor
        </a>
      </ViewportPortal>
    </main>
    <SiteFooter />
    </>
  );
}
