import Image from "next/image"; import { redirect } from "next/navigation"; import { verifySession, getCurrentUser } from "@/lib/session"; import { kullanicininRaporu } from "../rapor-queries"; import { PUAN_TURLERI, type DilimKey } from "@/types/yokatlas"; import { DILIM_ETIKET, RISK_ETIKET, dilimdenRisk } from "@/lib/risk"; import type { RaporParams, RaporSonuc } from "../types/rapor"; import { Skeleton } from "@/components/ui/skeleton"; import { YazdirButonu } from "./yazdir-butonu"; import { ILK_YIL, VERI_ARALIGI } from "@/lib/veri-yillari"; // Dilim sütunu: dilim adı + varsayılan riski. Üçüncü dilimde ikisi aynı // kelime ("Güvenli") olduğu için parantez düşer — "Güvenli (Güvenli)" yazmaz. function dilimLabel(dilim: DilimKey): string { const ad = DILIM_ETIKET[dilim] ?? dilim; const risk = RISK_ETIKET[dilimdenRisk(dilim)]; return ad === risk ? ad : `${ad} (${risk})`; } export async function RaporYazdir() { const session = await verifySession("/rapor/yazdir"); // Kullanıcı satırı ile rapor sorgusu bağımsız — paralel çöz const [user, satir] = await Promise.all([ getCurrentUser(), kullanicininRaporu(session.user.id), ]); if (!user) redirect("/giris"); if (!user.hasPaket) redirect("/paket"); if (!satir?.result) redirect("/sonuc"); const rapor = satir.result as RaporSonuc; const params = satir.params as RaporParams; // Dipnottaki yıl aralığı raporun ÜRETİLDİĞİ veri penceresidir: eski kayıtlı // rapor (5 yıllık geçmiş) güncel "2021–2026"yı iddia etmesin. const gecmisler = Object.values(rapor.programlar).filter( (p) => p.siraGecmisi && p.siraGecmisi.length > 0, ); const veriAraligi = gecmisler.length > 0 ? (() => { const ilk = Math.min(...gecmisler.map((p) => p.ilkYil ?? ILK_YIL)); const son = Math.max( ...gecmisler.map( (p) => (p.ilkYil ?? ILK_YIL) + p.siraGecmisi!.length - 1, ), ); return `${ilk}–${son}`; })() : VERI_ARALIGI; const tarih = new Date(satir.updatedAt).toLocaleDateString("tr-TR", { day: "numeric", month: "long", year: "numeric", }); return (

{rapor.tercihler.length} Tercihlik Kişisel Liste ve Risk Raporu

Başarı sıralaması: {params.sira.toLocaleString("tr-TR")} · Puan türü: {PUAN_TURLERI[params.tur]} {params.il ? ` · İl: ${params.il}` : ""} · {tarih}

{rapor.kapsam?.uyarlandi ? (

Not: Tercihlerine göre {rapor.kapsam.toplam} uygun program bulundu; liste {rapor.kapsam.dagilim.hayal} hayal ·{" "} {rapor.kapsam.dagilim.dengeli} dengeli ·{" "} {rapor.kapsam.dagilim.garanti} güvenli olarak kuruldu.

) : null}

Genel değerlendirme

{rapor.genelDegerlendirme}

{rapor.tercihler.map((t) => { const p = rapor.programlar[t.programId]; return ( ); })}
# Program / Üniversite Dilim Gerekçe Risk notu Trend
{t.sira} {p?.isim}
{p?.universite} · {p?.il ?? "—"}
{dilimLabel(t.dilim)} {t.gerekce} {t.riskNotu} {t.trendOzeti}
); } // Rapor sorgusu beklenirken belge düzeninde iskelet. export function RaporYazdirSkeleton() { return (
{Array.from({ length: 8 }).map((_, i) => ( ))}
); }