// YÖK Atlas veri tipleri ve puan türü sabiti — client ve server ortak tüketir.
// Sorgu fonksiyonları @/lib/db'de (server-only) yaşar; buraya runtime bağımlılığı
// olan hiçbir şey eklenmez.

export type Program = {
  id: string;
  isim: string;
  universite: string;
  unitur: string | null;
  il: string | null;
  fakulte: string | null;
  tur: string;
  sure: number | null;
  sira2025: number | null;
  sira2024: number | null;
  sira2023: number | null;
  sira2022: number | null;
  sira2021: number | null;
  puan2025: number | null;
  kontenjan2025: number | null;
  yerlesen2025: number | null;
};

export const PUAN_TURLERI = {
  say: "SAYISAL",
  ea: "EŞİT AĞIRLIK",
  soz: "SÖZEL",
  dil: "DİL",
  tyt: "TYT",
} as const;

export type PuanTuruKey = keyof typeof PUAN_TURLERI;

export type DilimKey = "hayal" | "dengeli" | "garanti";

export type RankResults = {
  hayal: Program[];
  dengeli: Program[];
  garanti: Program[];
  /** Dilim başına pencereye düşen TOPLAM program sayısı (limit'ten bağımsız) */
  toplam: Record<DilimKey, number>;
};

/**
 * /sonuc ham tablosunun satırı: tablo `fakulte` ve `puan2025`'i hiç
 * kullanmadığı için bu alanlar client'a serileştirilmez (satır başına en
 * uzun string alanlardan biri fakulte). Katalog sayfaları tam Program kullanır.
 */
export type ProgramListeSatiri = Omit<Program, "fakulte" | "puan2025">;

export type RankResultsListe = {
  hayal: ProgramListeSatiri[];
  dengeli: ProgramListeSatiri[];
  garanti: ProgramListeSatiri[];
  toplam: Record<DilimKey, number>;
};

// Vakıf sayılan unitur değerleri (bkz. DISTINCT unitur: VAKIF, VAKIF MYO,
// YURTDISI VAKIF). Devlet dışı her şey "vakıf" grubuna girer.
export type UniturGrubu = "devlet" | "vakif";

/** netler tablosunun bir yılı: yerleşen son kişinin ders bazlı netleri. */
export type ProgramNetSatiri = {
  yil: number;
  puanTuru: string | null;
  tabanPuan: number | null;
  obp: number | null;
  tytTrkNet: number | null;
  tytSosNet: number | null;
  tytMatNet: number | null;
  tytFenNet: number | null;
  aytMatNet: number | null;
  aytFizNet: number | null;
  aytKimNet: number | null;
  aytBioNet: number | null;
  aytTdeNet: number | null;
  aytTrh1Net: number | null;
  aytCog1Net: number | null;
  aytTrh2Net: number | null;
  aytCog2Net: number | null;
  aytDinNet: number | null;
  aytFelNet: number | null;
  ydtYdilNet: number | null;
};

export type SihirbazFacetleri = {
  kategoriler: { ad: string; adet: number }[];
  iller: { il: string; adet: number }[];
  uniturler: { grup: UniturGrubu; adet: number }[];
  /** Penceredeki (filtre uygulanmamış) toplam program sayısı */
  toplam: number;
};
