import { kategoriEslesir } from "./kategoriler";
import { riskHesapla, type RiskSeviyesi } from "./risk";
import type { TercihProfili } from "@/features/sihirbaz/sihirbaz-sabitler";

export type DegerlendirilecekProgram = {
  isim: string;
  il: string | null;
  unitur?: string | null;
  efektifSira: number | null;
};

export type TercihDegerlendirmesi = {
  risk: RiskSeviyesi | null;
  riskEtiketi: "Hayal" | "Dengeli" | "Daha güvenli" | "Veri yetersiz";
  riskMetni: string;
  olumlu: string[];
  celiskiler: string[];
};

function normalize(deger: string): string {
  return deger.trim().toLocaleUpperCase("tr-TR");
}

export function tercihDegerlendir(
  program: DegerlendirilecekProgram,
  profil: TercihProfili,
): TercihDegerlendirmesi {
  const risk = riskHesapla(program.efektifSira, profil.sira);
  const olumlu: string[] = [];
  const celiskiler: string[] = [];

  if (kategoriEslesir(program.isim, profil.secimler.kategoriler)) {
    olumlu.push("İlgi alanlarınla uyumlu");
  } else {
    celiskiler.push("Seçtiğin ilgi alanlarının dışında görünüyor");
  }

  if (profil.secimler.iller.length > 0) {
    const seciliIller = new Set(profil.secimler.iller.map(normalize));
    if (program.il && seciliIller.has(normalize(program.il))) {
      olumlu.push("Tercih ettiğin şehirlerden birinde");
    } else {
      celiskiler.push("Tercih ettiğin şehirlerin dışında");
    }
  }

  if (profil.secimler.universiteTipi !== "farketmez" && program.unitur) {
    const devlet = normalize(program.unitur) === "DEVLET";
    const uyuyor =
      (profil.secimler.universiteTipi === "devlet" && devlet) ||
      (profil.secimler.universiteTipi === "vakif" && !devlet);
    if (uyuyor) olumlu.push("Üniversite türü tercihine uyuyor");
    else celiskiler.push("Üniversite türü tercihinle uyuşmuyor");
  }

  if (profil.secimler.oncelikler.includes("Kolay yerleşme")) {
    if (risk === "guvenli") {
      olumlu.push("Daha güvenli seçenek önceliğini destekliyor");
    } else if (risk === "riskli") {
      celiskiler.push("Kolay yerleşme önceliğine göre iddialı bir seçim");
    }
  }

  const riskEtiketi =
    risk === "riskli"
      ? "Hayal"
      : risk === "az-riskli"
        ? "Dengeli"
        : risk === "guvenli"
          ? "Daha güvenli"
          : "Veri yetersiz";
  const riskMetni =
    risk === "riskli"
      ? "Geçen yılın taban sıralaması senin sıralamandan daha yukarıda."
      : risk === "az-riskli"
        ? "Geçmiş taban sıralamasına göre dengeli aralıkta."
        : risk === "guvenli"
          ? "Geçmiş taban sıralamasına göre daha güvenli aralıkta."
          : "Yerleşme riskini hesaplamak için yeterli taban sıra verisi yok.";

  return {
    risk,
    riskEtiketi,
    riskMetni,
    olumlu: olumlu.slice(0, 3),
    celiskiler: celiskiler.slice(0, 2),
  };
}

export function tercihListesiOzeti(
  programlar: DegerlendirilecekProgram[],
  profil: TercihProfili,
) {
  const degerlendirmeler = programlar.map((p) => tercihDegerlendir(p, profil));
  const hayal = degerlendirmeler.filter((d) => d.risk === "riskli").length;
  const dengeli = degerlendirmeler.filter(
    (d) => d.risk === "az-riskli",
  ).length;
  const dahaGuvenli = degerlendirmeler.filter(
    (d) => d.risk === "guvenli",
  ).length;
  const dikkat = degerlendirmeler.filter(
    (d) => d.celiskiler.length > 0,
  ).length;
  const gucluUyum = degerlendirmeler.filter(
    (d) => d.olumlu.length >= 2 && d.celiskiler.length === 0,
  ).length;

  let oneri = "Yeni seçimler ekledikçe listenin dengesi burada görünecek.";
  if (programlar.length > 0 && dahaGuvenli === 0) {
    oneri =
      "Listen iddialı seçeneklerde yoğunlaşıyor. Birkaç daha güvenli program eklemek riski dağıtabilir.";
  } else if (programlar.length > 2 && dengeli === 0) {
    oneri =
      "Listen için dengeli aralıkta birkaç program eklemek seçeneklerini güçlendirebilir.";
  } else if (dikkat > Math.max(1, programlar.length / 2)) {
    oneri =
      "Seçtiklerinin çoğu profilinle ayrışıyor. Dikkat notlarını birlikte gözden geçir.";
  } else if (programlar.length >= 24) {
    oneri =
      "24 tercihe ulaştın. Şimdi risk dağılımını ve dikkat notlarını gözden geçir.";
  } else if (programlar.length > 0) {
    oneri = "Listen dengeleniyor; uyum ve risk dağılımını koruyarak ilerle.";
  }

  return { hayal, dengeli, dahaGuvenli, dikkat, gucluUyum, oneri };
}
