import type { Metadata } from "next"; import Link from "next/link"; import { notFound } from "next/navigation"; import { ChevronRight } from "lucide-react"; import { getAllBolumler, getAllBolumSlugs, getBolumBySlug, uniSlugFromAd, } from "../katalog-queries"; import { JsonLd, breadcrumbJsonLd, sayfaMetadata, ustSegmentOgGorseli, } from "@/lib/seo"; import { SAYFA_BOYU } from "./sayfalama"; import { BolumProgramListesi } from "./bolum-program-listesi"; import { VeriKaynagi } from "./veri-kaynagi"; import { SiteFooter } from "@/components/site-footer"; import { Skeleton } from "@/components/ui/skeleton"; const sayi = (n: number) => n.toLocaleString("tr-TR"); export function bolumToplamSayfa(programSayisi: number): number { return Math.max(1, Math.ceil(programSayisi / SAYFA_BOYU)); } // Sayfaların generateStaticParams'ı için — sayfalar *-queries import etmez. export function bolumStaticSlugs(): string[] { return getAllBolumSlugs(); } // 2..N sayfaları; 1. sayfa taban rota (/bolum/[slug]) olduğundan üretilmez. export function bolumSayfaStaticParams(): { slug: string; no: string }[] { return getAllBolumler().flatMap((b) => { const toplam = bolumToplamSayfa(b.programSayisi); return Array.from({ length: Math.max(0, toplam - 1) }, (_, i) => ({ slug: b.slug, no: String(i + 2), })); }); } export function bolumSayfaMetadata(slug: string, sayfa: number): Metadata { const bolum = getBolumBySlug(slug); if (!bolum) return {}; const { stats } = bolum; if (sayfa > 1) { return sayfaMetadata({ title: `${bolum.ad} Taban Puanları 2026 (Sayfa ${sayfa})`, description: `${bolum.ad} taban puanları ve başarı sıralamaları tablosunun ${sayfa}. sayfası — toplam ${stats.toplam} programın 2025 yerleştirme verileri.`, path: `/bolum/${slug}/sayfa/${sayfa}`, openGraph: { images: ustSegmentOgGorseli( `/bolum/${slug}`, "Bölüm taban puanları ve sıralamaları — KolayTercih", ), }, }); } const enIyi = stats.minSira != null ? ` En iyi taban sıralaması ${sayi(stats.minSira)}.` : ""; return sayfaMetadata({ title: `${bolum.ad} Taban Puanları ve Başarı Sıralamaları 2026`, description: `${bolum.ad} 2025 yerleştirme verileri: ${stats.toplam} programın taban puanı ve sıralaması, ${stats.devlet} devlet / ${stats.vakif} vakıf.${enIyi} 2026 tercih rehberi.`, path: `/bolum/${slug}`, }); } export function BolumIcerik({ slug, sayfa }: { slug: string; sayfa: number }) { const bolum = getBolumBySlug(slug); if (!bolum) notFound(); const tumProgramlar = [ ...bolum.lisansProgramlari, ...bolum.onlisansProgramlari, ]; const toplamSayfa = bolumToplamSayfa(tumProgramlar.length); if (sayfa < 1 || sayfa > toplamSayfa) notFound(); const ilkSayfa = sayfa === 1; const buYol = ilkSayfa ? `/bolum/${slug}` : `/bolum/${slug}/sayfa/${sayfa}`; return ( <>

{bolum.ad}

{sayi(tumProgramlar.length)} üniversite programının 2025 taban puanlarını, başarı sıralamalarını ve kontenjanlarını incele {!ilkSayfa ? ` — sayfa ${sayfa}` : ""}.

Üniversite programları

{sayi(tumProgramlar.length)} program
({ ...program, universiteSlug: uniSlugFromAd(program.universite), }))} bazAd={bolum.ad} tabanYol={`/bolum/${slug}`} sayfa={sayfa} />
); } export function BolumIcerikSkeleton() { return (
{Array.from({ length: 5 }, (_, i) => ( ))}
); }