// Rapordan Türkiye haritası pinleri türetir — /sonuc ve /listem ortak kullanır. import type { RaporSonuc } from "@/features/rapor/types/rapor"; import type { HaritaPin } from "@/features/liste/components/tercih-haritasi"; import { ilKonum, uniAdiNormalize, uniKonum } from "@/lib/harita"; import { dilimdenRisk, riskHesapla, type RiskSeviyesi } from "@/lib/risk"; const RISK_AGIRLIK: Record = { guvenli: 0, "az-riskli": 1, riskli: 2, }; /** * Rapordan harita pinleri türetir. Açık satırlar üniversite bazında gruplanır * (kampüs konumunda, adıyla); kilitli satırlar il başına tek adsız "?" pinine * toplanır — maskeli veride üniversite adı zaten client'a inmediği için * harita paywall'ı delemez. Haritada karşılığı olmayan tercihler sayılır. */ export function pinleriTuret( rapor: RaporSonuc, adaySira: number, kilitliBaslangic: number, ): { pinler: HaritaPin[]; haritaDisi: number } { const gruplar = new Map(); let haritaDisi = 0; rapor.tercihler.forEach((t, i) => { const p = rapor.programlar[t.programId]; if (!p) return; const risk = riskHesapla(p.efektifSira, adaySira) ?? dilimdenRisk(t.dilim); const kilitli = i >= kilitliBaslangic; if (kilitli) { const konum = ilKonum(p.il); if (!konum) { haritaDisi += 1; return; } const key = `kilit|${p.il}`; const mevcut = gruplar.get(key); if (mevcut) { mevcut.tercihSiralari.push(t.sira); if (RISK_AGIRLIK[risk] > RISK_AGIRLIK[mevcut.risk]) mevcut.risk = risk; } else { // Açık pinlerle üst üste binmesin diye il merkezinin hafif altına gruplar.set(key, { id: key, universite: "", il: p.il, x: konum.x, y: konum.y + 9, tercihSiralari: [t.sira], risk, kilitli: true, }); } return; } const konum = uniKonum(p.universite, p.il); if (!konum) { haritaDisi += 1; return; } const key = `${uniAdiNormalize(p.universite)}|${p.il ?? ""}`; const mevcut = gruplar.get(key); if (mevcut) { mevcut.tercihSiralari.push(t.sira); if (RISK_AGIRLIK[risk] > RISK_AGIRLIK[mevcut.risk]) mevcut.risk = risk; } else { gruplar.set(key, { id: key, universite: p.universite, il: p.il, x: konum.x, y: konum.y, tercihSiralari: [t.sira], risk, }); } }); return { pinler: [...gruplar.values()], haritaDisi }; }