// Program adını (isim) insan-dostu ilgi kategorilerine eşler.
// Sihirbazdaki bubble'lar ve aday havuzu filtresi buradan beslenir.
// Kural: bir program birden fazla kategoriye girebilir; hiçbirine girmezse
// "Diğer" sayılır (bubble olarak gösterilmez ama havuzdan asla dışlanmaz).

export const KATEGORILER = [
  "Mühendislik & Teknoloji",
  "Sağlık & Tıp",
  "Hukuk & Siyasal",
  "İktisat & İşletme",
  "Eğitim & Öğretmenlik",
  "Mimarlık & Tasarım",
  "Fen & Temel Bilimler",
  "Sosyal & Beşeri Bilimler",
  "Sanat, Medya & İletişim",
  "Psikoloji & Danışmanlık",
  "Turizm & Gastronomi",
  "Tarım & Doğa",
] as const;

export type Kategori = (typeof KATEGORILER)[number];

// Sıra önemli değil; her kural bağımsız test edilir. Regexler Türkçe küçük harfe
// çevrilmiş isim üzerinde çalışır (bkz. kategoriBul).
const KATEGORI_KURALLARI: { kategori: Kategori; kural: RegExp }[] = [
  {
    kategori: "Mühendislik & Teknoloji",
    kural:
      /mühendis|yazılım|bilgisayar|bilişim|elektrik|elektronik|mekatronik|makine|makina|otomotiv|inşaat|endüstri|metalurji|malzeme|maden|jeoloji|jeofizik|petrol|enerji|robot|yapay zeka|yapay zekâ|siber|ağ teknolojileri|kontrol|otomasyon|uçak|havacılık|uzay|gemi|deniz ulaştırma|teknoloji|teknolojisi|bilgisayar programcı|elektrik-elektronik|nükleer|tekstil müh/,
  },
  {
    kategori: "Sağlık & Tıp",
    kural:
      /\btıp\b|diş|hemşire|eczacı|fizyoterapi|beslenme|diyetetik|anestezi|görüntüleme|laboratuvar|dokümantasyon|acil|paramedik|optisyen|ameliyathane|sağlık|odyoloji|dil ve konuşma|ebelik|veteriner|biyomedikal|ortez|protez|diyaliz|patoloji|radyoterapi|perfüzyon|çocuk gelişimi|yaşlı bakım|podoloji|ağız ve diş|tıbbi/,
  },
  {
    kategori: "Hukuk & Siyasal",
    // "güvenlik" bilinçli olarak dar: jenerik hali Siber/Sosyal/Bilgi
    // Güvenliği'ni yanlışlıkla bu kategoriye alıyordu.
    kural:
      /hukuk|adalet|siyaset|kamu yönetim|uluslararası ilişki|siyasal|özel güvenlik|ceza infaz|milletlerarası|diplomasi/,
  },
  {
    kategori: "İktisat & İşletme",
    kural:
      /işletme|iktisat|iktisadi|ekonomi|maliye|muhasebe|finans|bankacılık|sigortacılık|sosyal güvenlik|dış ticaret|elektronik ticaret|lojistik|pazarlama|yönetim bilişim|havacılık yönetimi|enerji yönetimi|bilgi yönetimi|insan kaynak|çalışma ekonomisi|uluslararası ticaret|bankacılık ve sigortacılık|halkla ilişkiler|reklamcılık|emlak|menkul|gümrük|büro yönetim|yönetici asistan/,
  },
  {
    kategori: "Eğitim & Öğretmenlik",
    kural:
      /öğretmen|öğretmenliği|eğitim|okul öncesi|rehberlik ve psikolojik|çocuk gelişimi|pedagoji|özel eğitim/,
  },
  {
    kategori: "Mimarlık & Tasarım",
    kural:
      /mimar|iç mimar|peyzaj|şehir ve bölge|tasarım|endüstriyel tasarım|moda|iç mekan/,
  },
  {
    kategori: "Fen & Temel Bilimler",
    // Jenerik "bilim" yok: "Siyaset Bilimi" / "İletişim Bilimleri" /
    // "Dilbilimi" gibi programları yanlışlıkla Fen yapıyordu.
    kural:
      /matematik|fizik|kimya|biyoloji|istatistik|moleküler|genetik|biyoteknoloji|\bastronomi|aktüerya|fen bilim|veri bilim|adli bilim/,
  },
  {
    kategori: "Sosyal & Beşeri Bilimler",
    kural:
      /sosyoloji|tarih|coğrafya|felsefe|edebiyat|dil ve edebiyat|filoloji|arkeoloji|antropoloji|ilahiyat|din kültürü|dilbilim|sosyal hizmet|sosyal bilim|islam|mütercim|çeviribilim|tercümanlık|türk dili|dünya dilleri|sanat tarihi|halkbilim|dinî/,
  },
  {
    kategori: "Sanat, Medya & İletişim",
    kural:
      /gazetecilik|iletişim|radyo|televizyon|sinema|görsel|grafik|müzik|resim|heykel|sahne|tiyatro|oyunculuk|fotoğraf|animasyon|seramik|güzel sanatlar|medya|yeni medya|halkla ilişkiler ve tanıtım|reklam|film|sanat ve tasarım/,
  },
  {
    kategori: "Psikoloji & Danışmanlık",
    kural: /psikoloji|psikolojik danışma|rehberlik ve psikolojik|davranış/,
  },
  {
    kategori: "Turizm & Gastronomi",
    kural:
      /turizm|gastronomi|mutfak|aşçılık|otel|seyahat|rekreasyon|konaklama|ikram|sivil havacılık kabin/,
  },
  {
    kategori: "Tarım & Doğa",
    // "çevre" bağlamlı: jenerik hali "İç Mimarlık ve Çevre Tasarımı"nı
    // yanlışlıkla Tarım'a alıyordu.
    kural:
      /ziraat|tarım|tarla|bahçe|bitki|hayvan|su ürünleri|gıda|orman|çevre müh|çevre sağlığı|çevre koruma|çevre temizli|çevresel|balıkçılık|peyzaj|tohum|toprak|zootekni/,
  },
];

// YÖK Atlas'ın kendi alan sinyali: programın bağlı olduğu fakülte adı.
// Lisansta güçlü ("Mühendislik Fakültesi", "Hukuk Fakültesi"); önlisansta
// jenerik ("... Meslek Yüksekokulu") olduğundan hiçbir kurala eşleşmez ve
// isim kuralları tek başına devrede kalır. Bir fakülte birden çok kategoriye
// eşlenebilir (ör. Fen-Edebiyat → Fen + Sosyal); program bazında ayrım
// isim∩fakülte kesişimiyle yapılır (bkz. kategoriBul).
const FAKULTE_KURALLARI: { kategori: Kategori; kural: RegExp }[] = [
  {
    kategori: "Mühendislik & Teknoloji",
    kural: /mühendis|teknoloji|bilişim|havacılık ve uzay|denizcilik|uygulamalı bilimler/,
  },
  {
    kategori: "Sağlık & Tıp",
    kural: /tıp|sağlık|diş|eczacılık|hemşirelik|veteriner|spor bilim/,
  },
  {
    kategori: "Hukuk & Siyasal",
    kural: /hukuk|siyasal|iktisadi|idari|güvenlik/,
  },
  {
    kategori: "İktisat & İşletme",
    kural: /iktisadi|işletme|yönetim|ticaret|bankacılık|uygulamalı bilimler|finans/,
  },
  { kategori: "Eğitim & Öğretmenlik", kural: /eğitim/ },
  {
    kategori: "Mimarlık & Tasarım",
    kural: /mimarlık|tasarım|güzel sanatlar/,
  },
  {
    kategori: "Fen & Temel Bilimler",
    kural: /\bfen\b|fen-edebiyat|doğa bilimleri|temel bilimler/,
  },
  {
    kategori: "Sosyal & Beşeri Bilimler",
    kural:
      /edebiyat|fen-edebiyat|insan ve toplum|sosyal bilim|ilahiyat|islami|beşeri/,
  },
  {
    kategori: "Sanat, Medya & İletişim",
    kural: /iletişim|güzel sanatlar|sanat|konservatuvar|müzik/,
  },
  {
    kategori: "Psikoloji & Danışmanlık",
    kural: /insan ve toplum|edebiyat|fen-edebiyat|sosyal bilim|eğitim/,
  },
  { kategori: "Turizm & Gastronomi", kural: /turizm|gastronomi/ },
  {
    kategori: "Tarım & Doğa",
    kural: /ziraat|orman|su ürünleri|tarım|doğa bilimleri|veteriner/,
  },
];

function eslesenKategoriler(
  kurallar: { kategori: Kategori; kural: RegExp }[],
  metin: string,
): Kategori[] {
  const lower = metin.toLocaleLowerCase("tr-TR");
  const sonuc: Kategori[] = [];
  for (const { kategori, kural } of kurallar) {
    if (kural.test(lower)) sonuc.push(kategori);
  }
  return sonuc;
}

/**
 * Verilen programın girdiği tüm kategorileri döner (0..n).
 *
 * Fakülte verilirse isim∩fakülte kesişimi alınır: "Siber Güvenlik
 * Mühendisliği" isimden {Mühendislik, Hukuk} çıkarken Mühendislik
 * Fakültesi'nde olduğu için Hukuk elenir. Kesişim boşsa ya da fakülte
 * hiçbir kurala eşleşmiyorsa (jenerik MYO adları) isim kuralları geçerlidir;
 * fakültesiz çağrı bugüne kadarki davranışla birebir aynıdır.
 */
export function kategoriBul(
  isim: string,
  fakulte?: string | null,
): Kategori[] {
  const isimKats = eslesenKategoriler(KATEGORI_KURALLARI, isim);
  if (fakulte && isimKats.length > 0) {
    const fakulteKats = eslesenKategoriler(FAKULTE_KURALLARI, fakulte);
    if (fakulteKats.length > 0) {
      const kesisim = isimKats.filter((k) => fakulteKats.includes(k));
      if (kesisim.length > 0) return kesisim;
    }
  }
  return isimKats;
}

/** Bir programın seçili kategorilerden en az biriyle eşleşip eşleşmediği. */
export function kategoriEslesir(
  isim: string,
  secililer: string[],
  fakulte?: string | null,
): boolean {
  if (secililer.length === 0) return true;
  const kats = kategoriBul(isim, fakulte);
  return kats.some((k) => secililer.includes(k));
}
