// Rapor domain'inin ortak tipleri — client bileşenleri ve server katmanı
// birlikte tüketir. Üretim mantığı @/lib/ai/rapor.ts'te (server-only) yaşar
// ve bu tiplere karşı derlenir; alan ekleme/çıkarma burada yapılır.

import type { DilimKey, PuanTuruKey, UniturGrubu } from "@/types/yokatlas";

export type RaporTercih = {
  programId: string;
  sira: number;
  dilim: DilimKey;
  gerekce: string;
  riskNotu: string;
  trendOzeti: string;
};

/**
 * Listenin havuza uyarlanma bilgisi. uyarlandi=true ise dağılım ideal
 * 5/13/6'dan sapmıştır (havuz yetersizdi) ve UI dürüst bir not gösterir.
 * Eski kayıtlı raporlarda yok → opsiyonel.
 */
export type RaporKapsam = {
  toplam: number;
  dagilim: Record<DilimKey, number>;
  uyarlandi: boolean;
};

// uyarilar şemada zorunlu ama eski kayıtlı raporlarda yok → tipte opsiyonel
export type RaporSonuc = {
  tercihler: RaporTercih[];
  genelDegerlendirme: string;
  uyarilar?: string[];
  kapsam?: RaporKapsam;
  // Dev mock üretimi işareti: gerçek AI aktifken bayat mock kayıtları
  // ayıklamak için (bkz. features/rapor/rapor-queries.ts)
  devMock?: boolean;
  // Render için havuzdan zenginleştirilmiş program bilgisi
  // efektifSira: COALESCE(sira2025, sira2024) — eski kayıtlı raporlarda yok
  // siraGecmisi: [2021..2025] taban sıralamaları — deterministik trend oku
  programlar: Record<
    string,
    {
      isim: string;
      universite: string;
      il: string | null;
      unitur: string | null;
      efektifSira?: number | null;
      siraGecmisi?: (number | null)[];
    }
  >;
};

/**
 * Maske çıktısı: kilitli uyarıların yalnızca SAYISI iner, metinleri inmez.
 * RaporSchema'ya (LLM çıktısı) eklenmez — bu alan yalnızca maskede doğar.
 */
export type MaskeliRapor = RaporSonuc & { kilitliUyariSayisi?: number };

export interface RaporParams {
  sira: number;
  tur: PuanTuruKey;
  // Sihirbaz seçimleri (yeni akış)
  kategoriler?: string[];
  iller?: string[];
  universiteTipi?: UniturGrubu | "farketmez";
  oncelikler?: string[];
  // Eski akış alanları (geriye uyum — eski kayıtlı raporlar)
  il?: string;
  notlar?: string;
}
