"use client";

// Manuel 24'lük listenin coğrafyası: tablodan "+" ile eklenen her programın
// üniversitesi gerçek kampüs konumunda risk renkli pinlenir. Liste store'una
// abonedir; ekleme/çıkarma/sürükleme anında haritaya yansır.

import { useMemo, useState } from "react";
import { TercihHaritasiLazy } from "@/features/liste/components/tercih-haritasi-lazy";
import { YurtdisiHaritalarLazy } from "@/features/liste/components/yurtdisi-haritalar-lazy";
import type { HaritaPin } from "@/features/liste/components/tercih-haritasi";
import { ilKonum, uniAdiNormalize, uniKonum } from "@/lib/harita";
import { yurtdisiPinKaydet, type YurtdisiPin } from "@/lib/harita-pinler";
import type { RiskSeviyesi } from "@/lib/risk";
import { useManuelListe } from "../liste-store";

// Aynı üniversitede birden çok tercih varsa pinde kötü risk baskın olsun
const RISK_AGIRLIK: Record<RiskSeviyesi, number> = {
  guvenli: 0,
  "az-riskli": 1,
  riskli: 2,
};

export function ManuelHarita() {
  const liste = useManuelListe();
  const [seciliIl, setSeciliIl] = useState<string | null>(null);

  const { pinler, yurtdisiPinler, haritaDisi } = useMemo(() => {
    const gruplar = new Map<string, HaritaPin>();
    const yurtdisi = new Map<string, YurtdisiPin>();
    let haritaDisi = 0;

    liste.forEach((t, i) => {
      const risk = t.risk ?? "az-riskli";
      const konum = uniKonum(t.universite, t.il) ?? ilKonum(t.il);
      if (!konum) {
        if (!yurtdisiPinKaydet(yurtdisi, t.universite, t.il, i + 1, risk))
          haritaDisi += 1;
        return;
      }
      const key = `${uniAdiNormalize(t.universite)}|${t.il ?? ""}`;
      const mevcut = gruplar.get(key);
      if (mevcut) {
        mevcut.tercihSiralari.push(i + 1);
        mevcut.bolumler.push(t.isim);
        if (RISK_AGIRLIK[risk] > RISK_AGIRLIK[mevcut.risk]) mevcut.risk = risk;
      } else {
        gruplar.set(key, {
          id: key,
          universite: t.universite,
          il: t.il,
          x: konum.x,
          y: konum.y,
          tercihSiralari: [i + 1],
          bolumler: [t.isim],
          risk,
        });
      }
    });

    return {
      pinler: [...gruplar.values()],
      yurtdisiPinler: [...yurtdisi.values()],
      haritaDisi,
    };
  }, [liste]);

  // Liste boşken 197 KB'lık il geometrisi hiç inmesin: aynı oranlı
  // placeholder alanı rezerve eder, ilk eklemede lazy harita yerine oturur.
  if (liste.length === 0) {
    return (
      <div>
        <div className="flex aspect-[1050/447] w-full items-center justify-center rounded-xl bg-slate-100/60">
          <p className="max-w-xs px-4 text-center text-xs text-slate-500">
            Tablodan <span aria-hidden>＋</span> ile ekledikçe üniversiteler
            haritada belirir.
          </p>
        </div>
      </div>
    );
  }

  return (
    <div>
      <TercihHaritasiLazy
        pinler={pinler}
        seciliIl={seciliIl}
        onSeciliIlDegisti={setSeciliIl}
      />
      {yurtdisiPinler.length > 0 ? (
        <YurtdisiHaritalarLazy pinler={yurtdisiPinler} />
      ) : null}
      {haritaDisi > 0 ? (
        <p className="mt-1 px-1 text-xs text-slate-500">
          {haritaDisi} tercih haritada gösterilemiyor
        </p>
      ) : null}
    </div>
  );
}
