// Sorgu yolundaki ifade indexi + WAL bakımı. Bir kez çalıştırılır
// (pnpm tsx scripts/db-index.ts); ingest/refresh sonrası da güvenle
// tekrar çalıştırılabilir (IF NOT EXISTS).
//
// src/lib/db.ts tüm aralık sorgularını COALESCE(sira2025, sira2024)
// üzerinden yapar; SQLite ifade indexleri METİNSEL eşleştiği için buradaki
// ifade oradaki EFEKTIF_SIRA sabitiyle birebir aynı olmalıdır. Bu index
// olmadan her sorgu tur-partisyonunu tarayıp temp B-tree ile sıralıyordu.

import path from "node:path";
import Database from "better-sqlite3";

const db = new Database(path.join(process.cwd(), "data", "yokatlas.db"));

db.exec(`
  CREATE INDEX IF NOT EXISTS idx_programs_tur_onlisans_efektif
    ON programs (tur, onlisans, COALESCE(sira2025, sira2024));
`);

// Programatik SEO sayfaları (src/lib/katalog.ts) bölüm/üniversite detaylarını
// ham ada birebir IN (...) eşleşmesiyle çeker; bu iki index olmadan her
// sayfa tam tablo taraması yapar.
db.exec(`
  CREATE INDEX IF NOT EXISTS idx_programs_isim ON programs (isim);
  CREATE INDEX IF NOT EXISTS idx_programs_universite ON programs (universite);
`);

// Uygulama DB'yi readonly açtığı için checkpoint yapamaz; şişen WAL'i
// (okuma başına ekstra maliyet) burada dosyaya geri yaz ve sıfırla.
db.pragma("wal_checkpoint(TRUNCATE)");

const plan = db
  .prepare(
    `EXPLAIN QUERY PLAN
     SELECT id FROM programs
     WHERE tur = ? AND onlisans = ?
       AND COALESCE(sira2025, sira2024) IS NOT NULL
       AND COALESCE(sira2025, sira2024) BETWEEN ? AND ?
     ORDER BY COALESCE(sira2025, sira2024) ASC LIMIT 10`,
  )
  .all("SAYISAL", 0, 1000, 50000);

console.log("Sorgu planı:", JSON.stringify(plan, null, 2));
db.close();
