import { getDatabase } from "./db";

export interface CalonSiswaRecord {
  id: number;
  no_pendaftaran: string;
  nisn: string;
  nama_calon_siswa: string;
  asal_sekolah: string;
  gelombang: string; // Teks manual bebas, contoh: "Gelombang 1 Tahap 1", "Gelombang 2 Tahap 3"
  tahap?: string;    // Alias untuk kompatibilitas
  status_kelulusan: "Lulus" | "Cadangan" | "Silahkan hubungi Panitia SPMB" | string;
  jadwal_registrasi_ulang: string;
  catatan: string;
  nilai_tes_pemetaan?: number;
  jalur_pendaftaran?: string;
  created_at: string;
  updated_at: string;
}

export interface SpmbSettingsRecord {
  id: number;
  tahun_ajaran: string;
  judul_pengumuman: string;
  teks_pengumuman: string;
  syarat_registrasi: string;
  lokasi_pembayaran: string;
  kontak_panitia: string;
  default_jadwal_registrasi: string;
  updated_at: string;
}

export interface CalonSiswaFilters {
  gelombang?: string;
  tahap?: string;
  status_kelulusan?: string;
  search?: string;
  limit?: number;
  offset?: number;
}

export async function initSpmbTables(): Promise<void> {
  const db = await getDatabase();

  await db.exec(`
    CREATE TABLE IF NOT EXISTS spmb_calon_siswa (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      no_pendaftaran TEXT NOT NULL UNIQUE,
      nisn TEXT NOT NULL,
      nama_calon_siswa TEXT NOT NULL,
      asal_sekolah TEXT NOT NULL,
      gelombang TEXT NOT NULL DEFAULT 'Gelombang 1 Tahap 1',
      status_kelulusan TEXT NOT NULL DEFAULT 'Lulus',
      jadwal_registrasi_ulang TEXT DEFAULT '',
      catatan TEXT DEFAULT '',
      nilai_tes_pemetaan REAL DEFAULT 0,
      jalur_pendaftaran TEXT DEFAULT 'Reguler',
      created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
      updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
    );
    CREATE INDEX IF NOT EXISTS idx_spmb_calon_siswa_gel ON spmb_calon_siswa(gelombang, status_kelulusan);

    CREATE TABLE IF NOT EXISTS spmb_settings (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      tahun_ajaran TEXT NOT NULL DEFAULT '2026/2027',
      judul_pengumuman TEXT NOT NULL,
      teks_pengumuman TEXT NOT NULL,
      syarat_registrasi TEXT NOT NULL,
      lokasi_pembayaran TEXT NOT NULL,
      kontak_panitia TEXT NOT NULL,
      default_jadwal_registrasi TEXT NOT NULL,
      updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
    );
  `);

  // Migrasikan otomatis status "Tidak Lulus" menjadi "Silahkan hubungi Panitia SPMB"
  try {
    await db.run(
      "UPDATE spmb_calon_siswa SET status_kelulusan = 'Silahkan hubungi Panitia SPMB' WHERE status_kelulusan = 'Tidak Lulus'"
    );
  } catch (e) {
    // Ignore migration error
  }

  // Seed default settings if empty (first-time database setup)
  const settingsCount = await db.get<{ cnt: number }>(
    "SELECT COUNT(*) as cnt FROM spmb_settings"
  );
  const isFirstTimeSetup = !settingsCount || settingsCount.cnt === 0;

  if (isFirstTimeSetup) {
    await db.run(
      `INSERT INTO spmb_settings (
        tahun_ajaran, judul_pengumuman, teks_pengumuman, syarat_registrasi,
        lokasi_pembayaran, kontak_panitia, default_jadwal_registrasi
      ) VALUES (?, ?, ?, ?, ?, ?, ?)`,
      [
        "2026/2027",
        "PENGUMUMAN HASIL SELEKSI & TES PEMETAAN SPMB SMA BPI 1 BANDUNG",
        "Selamat kepada calon peserta didik baru yang dinyatakan LULUS seleksi dan tes pemetaan SMA BPI 1 Bandung Tahun Ajaran 2026/2027. Seluruh calon peserta didik yang lulus diwajibkan melakukan registrasi ulang sesuai jadwal dan ketentuan yang berlaku.",
        "1. Membawa Lembar Asli / Bukti Kelulusan Seleksi SPMB ini.\n2. Fotokopi Ijazah / Surat Keterangan Lulus (SKL) SMP dilegalisir (2 lembar).\n3. Fotokopi Akta Kelahiran dan Kartu Keluarga (KK) (2 lembar).\n4. Pas foto resmi berseragam SMP ukuran 3x4 (3 lembar).\n5. Bukti setor lunas administrasi registrasi ulang dari Bagian Keuangan Yayasan BPI.",
        "Sekretariat Panitia SPMB / Loket Registrasi Kampus SMA BPI 1 Bandung, Jl. Burangrang No. 8, Bandung 40262.",
        "Sekretariat SPMB: (022) 7301739 / WhatsApp Panitia: 0812-2026-1079 (Humas & SPMB SMA BPI 1)",
        "15 Juli 2026 s.d. 22 Juli 2026 (Pukul 08.00 - 14.00 WIB)",
      ]
    );

    // Seed default mock calon siswa ONLY on initial first-time setup
    const studentCount = await db.get<{ cnt: number }>(
      "SELECT COUNT(*) as cnt FROM spmb_calon_siswa"
    );
    if (!studentCount || studentCount.cnt === 0) {
      const mockSeed = [
        {
          no_pendaftaran: "SPMB-2026-001",
          nisn: "0091827361",
          nama_calon_siswa: "Ahmad Fauzan Pratama",
        asal_sekolah: "SMP Negeri 5 Bandung",
        gelombang: "Gelombang 1 Tahap 1",
        status_kelulusan: "Lulus",
        jadwal_registrasi_ulang: "15 Juli 2026 s.d. 22 Juli 2026",
        catatan: "Lulus seleksi pemetaan MIPA; Berkas administrasi lengkap",
        jalur_pendaftaran: "Reguler",
      },
      {
        no_pendaftaran: "SPMB-2026-002",
        nisn: "0092736482",
        nama_calon_siswa: "Annisa Nabila Rahma",
        asal_sekolah: "SMP BPI Bandung",
        gelombang: "Gelombang 1 Tahap 1",
        status_kelulusan: "Lulus",
        jadwal_registrasi_ulang: "15 Juli 2026 s.d. 22 Juli 2026",
        catatan: "Jalur internal Yayasan BPI; Memenuhi kuota peminatan",
        jalur_pendaftaran: "Internal Yayasan",
      },
      {
        no_pendaftaran: "SPMB-2026-003",
        nisn: "0093847591",
        nama_calon_siswa: "Bagas Arya Saputra",
        asal_sekolah: "SMP Negeri 2 Bandung",
        gelombang: "Gelombang 1 Tahap 2",
        status_kelulusan: "Lulus",
        jadwal_registrasi_ulang: "15 Juli 2026 s.d. 22 Juli 2026",
        catatan: "Peminatan Fase F Rekayasa Teknologi",
        jalur_pendaftaran: "Reguler",
      },
      {
        no_pendaftaran: "SPMB-2026-004",
        nisn: "0094958602",
        nama_calon_siswa: "Citra Dewi Lestari",
        asal_sekolah: "SMP Taruna Bakti Bandung",
        gelombang: "Jalur Prestasi Tahap 1",
        status_kelulusan: "Lulus",
        jadwal_registrasi_ulang: "15 Juli 2026 s.d. 22 Juli 2026",
        catatan: "Juara 1 FLS2N Desain Grafis Kota Bandung; Beasiswa Prestasi",
        jalur_pendaftaran: "Prestasi",
      },
      {
        no_pendaftaran: "SPMB-2026-005",
        nisn: "0095069713",
        nama_calon_siswa: "Dimas Aditya Ramadhan",
        asal_sekolah: "SMP Negeri 7 Bandung",
        gelombang: "Gelombang 1 Tahap 2",
        status_kelulusan: "Cadangan",
        jadwal_registrasi_ulang: "23 Juli 2026 s.d. 25 Juli 2026",
        catatan: "Cadangan Peringkat 1; Menunggu konfirmasi kuota",
        jalur_pendaftaran: "Reguler",
      },
      {
        no_pendaftaran: "SPMB-2026-006",
        nisn: "0096170824",
        nama_calon_siswa: "Farhan Maulana Sidiq",
        asal_sekolah: "SMP Negeri 13 Bandung",
        gelombang: "Gelombang 1 Tahap 2",
        status_kelulusan: "Silahkan hubungi Panitia SPMB",
        jadwal_registrasi_ulang: "-",
        catatan: "Diundang konsultasi pemetaan minat/bakat ke panitia",
        jalur_pendaftaran: "Reguler",
      },
      {
        no_pendaftaran: "SPMB-2026-007",
        nisn: "0097281935",
        nama_calon_siswa: "Gisella Putri Santoso",
        asal_sekolah: "SMP Santo Aloysius Bandung",
        gelombang: "Gelombang 2 Tahap 1",
        status_kelulusan: "Lulus",
        jadwal_registrasi_ulang: "20 Juli 2026 s.d. 27 Juli 2026",
        catatan: "Peminatan Bahasa & Sosial Humaniora",
        jalur_pendaftaran: "Reguler",
      },
      {
        no_pendaftaran: "SPMB-2026-008",
        nisn: "0098392046",
        nama_calon_siswa: "Hafizh Al-Farisi",
        asal_sekolah: "SMP Salman Al Farisi",
        gelombang: "Gelombang 2 Tahap 1",
        status_kelulusan: "Lulus",
        jadwal_registrasi_ulang: "20 Juli 2026 s.d. 27 Juli 2026",
        catatan: "Hafiz Al-Qur'an 5 Juz; Jalur Prestasi Keagamaan",
        jalur_pendaftaran: "Prestasi",
      },
      {
        no_pendaftaran: "SPMB-2026-009",
        nisn: "0099403157",
        nama_calon_siswa: "Indah Permata Sari",
        asal_sekolah: "SMP Islam Al Azhar 36 Bandung",
        gelombang: "Gelombang 2 Tahap 2",
        status_kelulusan: "Lulus",
        jadwal_registrasi_ulang: "20 Juli 2026 s.d. 27 Juli 2026",
        catatan: "Berkas rekomendasi BK SMP asal terlampir lengkap",
        jalur_pendaftaran: "Reguler",
      },
      {
        no_pendaftaran: "SPMB-2026-010",
        nisn: "0090514268",
        nama_calon_siswa: "Jonathan Kevin Wirawan",
        asal_sekolah: "SMP Negeri 1 Bandung",
        gelombang: "Gelombang 2 Tahap 3",
        status_kelulusan: "Cadangan",
        jadwal_registrasi_ulang: "28 Juli 2026 s.d. 30 Juli 2026",
        catatan: "Cadangan Peringkat 2; Konfirmasi dibuka setelah registrasi utama",
        jalur_pendaftaran: "Reguler",
      },
      {
        no_pendaftaran: "SPMB-2026-011",
        nisn: "0091625379",
        nama_calon_siswa: "Kanya Salsabila",
        asal_sekolah: "SMP Darul Hikam Bandung",
        gelombang: "Gelombang 2 Tahap 3",
        status_kelulusan: "Lulus",
        jadwal_registrasi_ulang: "28 Juli 2026 s.d. 30 Juli 2026",
        catatan: "Peminatan Sains Terapan & Bioteknologi",
        jalur_pendaftaran: "Reguler",
      },
      {
        no_pendaftaran: "SPMB-2026-012",
        nisn: "0092736480",
        nama_calon_siswa: "Lukman Hakim Nugraha",
        asal_sekolah: "SMP Negeri 3 Bandung",
        gelombang: "Gelombang 2 Tahap 3",
        status_kelulusan: "Silahkan hubungi Panitia SPMB",
        jadwal_registrasi_ulang: "-",
        catatan: "Silakan menghubungi sekretariat panitia SPMB ruang TU",
        jalur_pendaftaran: "Reguler",
      },
    ];

    for (const item of mockSeed) {
      await db.run(
        `INSERT INTO spmb_calon_siswa (
          no_pendaftaran, nisn, nama_calon_siswa, asal_sekolah,
          gelombang, status_kelulusan, jadwal_registrasi_ulang,
          catatan, jalur_pendaftaran
        ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
        [
          item.no_pendaftaran,
          item.nisn,
          item.nama_calon_siswa,
          item.asal_sekolah,
          item.gelombang,
          item.status_kelulusan,
          item.jadwal_registrasi_ulang,
          item.catatan,
          item.jalur_pendaftaran,
        ]
      );
    }
  }
}
}

export async function getCalonSiswaList(filters?: CalonSiswaFilters): Promise<{
  rows: CalonSiswaRecord[];
  total: number;
  summary: {
    total: number;
    lulus: number;
    cadangan: number;
    tidak_lulus: number;
  };
}> {
  const db = await getDatabase();
  await initSpmbTables();

  let query = "SELECT * FROM spmb_calon_siswa WHERE 1=1";
  const params: unknown[] = [];

  const filterGel = filters?.gelombang || filters?.tahap;
  if (
    filterGel &&
    filterGel !== "Semua" &&
    filterGel !== "Semua Gelombang / Tahap" &&
    filterGel !== "Semua Gelombang" &&
    filterGel !== "Semua Tahap"
  ) {
    query += " AND gelombang = ?";
    params.push(filterGel);
  }

  if (
    filters?.status_kelulusan &&
    filters.status_kelulusan !== "Semua" &&
    filters.status_kelulusan !== "Semua Status"
  ) {
    // Check if status is "Silahkan hubungi Panitia SPMB" or "Tidak Lulus"
    if (
      filters.status_kelulusan === "Silahkan hubungi Panitia SPMB" ||
      filters.status_kelulusan === "Tidak Lulus"
    ) {
      query += " AND (status_kelulusan = 'Silahkan hubungi Panitia SPMB' OR status_kelulusan = 'Tidak Lulus')";
    } else {
      query += " AND status_kelulusan = ?";
      params.push(filters.status_kelulusan);
    }
  }

  if (filters?.search && filters.search.trim()) {
    const term = `%${filters.search.trim()}%`;
    query += ` AND (
      no_pendaftaran LIKE ? OR
      nisn LIKE ? OR
      nama_calon_siswa LIKE ? OR
      asal_sekolah LIKE ? OR
      gelombang LIKE ? OR
      catatan LIKE ?
    )`;
    params.push(term, term, term, term, term, term);
  }

  // Count total matching
  const countQuery = `SELECT COUNT(*) as count FROM (${query})`;
  const countRow = await db.get<{ count: number }>(countQuery, params);
  const total = countRow?.count || 0;

  query += " ORDER BY id ASC";

  if (filters?.limit) {
    query += " LIMIT ?";
    params.push(filters.limit);
    if (filters?.offset) {
      query += " OFFSET ?";
      params.push(filters.offset);
    }
  }

  const rawRows = await db.all<any[]>(query, params);
  const rows: CalonSiswaRecord[] = rawRows.map((r) => {
    const statusVal =
      r.status_kelulusan === "Tidak Lulus"
        ? "Silahkan hubungi Panitia SPMB"
        : r.status_kelulusan;

    return {
      id: r.id,
      no_pendaftaran: r.no_pendaftaran,
      nisn: r.nisn,
      nama_calon_siswa: r.nama_calon_siswa,
      asal_sekolah: r.asal_sekolah,
      gelombang: r.gelombang,
      tahap: r.gelombang, // Tetap sediakan alias
      status_kelulusan: statusVal,
      jadwal_registrasi_ulang: r.jadwal_registrasi_ulang || "",
      catatan: r.catatan || "",
      jalur_pendaftaran: r.jalur_pendaftaran || "Reguler",
      created_at: r.created_at,
      updated_at: r.updated_at,
    };
  });

  // Overall summary metrics
  const summaryRow = await db.get<{
    total: number;
    lulus: number;
    cadangan: number;
    tidak_lulus: number;
  }>(`
    SELECT
      COUNT(*) as total,
      SUM(CASE WHEN status_kelulusan = 'Lulus' THEN 1 ELSE 0 END) as lulus,
      SUM(CASE WHEN status_kelulusan = 'Cadangan' THEN 1 ELSE 0 END) as cadangan,
      SUM(CASE WHEN status_kelulusan = 'Silahkan hubungi Panitia SPMB' OR status_kelulusan = 'Tidak Lulus' THEN 1 ELSE 0 END) as tidak_lulus
    FROM spmb_calon_siswa
  `);

  return {
    rows,
    total,
    summary: {
      total: summaryRow?.total || 0,
      lulus: summaryRow?.lulus || 0,
      cadangan: summaryRow?.cadangan || 0,
      tidak_lulus: summaryRow?.tidak_lulus || 0,
    },
  };
}

export async function getCalonSiswaById(id: number): Promise<CalonSiswaRecord | undefined> {
  const db = await getDatabase();
  await initSpmbTables();
  const row = await db.get<any>("SELECT * FROM spmb_calon_siswa WHERE id = ?", [id]);
  if (!row) return undefined;
  return {
    id: row.id,
    no_pendaftaran: row.no_pendaftaran,
    nisn: row.nisn,
    nama_calon_siswa: row.nama_calon_siswa,
    asal_sekolah: row.asal_sekolah,
    gelombang: row.gelombang,
    tahap: row.gelombang,
    status_kelulusan:
      row.status_kelulusan === "Tidak Lulus"
        ? "Silahkan hubungi Panitia SPMB"
        : row.status_kelulusan,
    jadwal_registrasi_ulang: row.jadwal_registrasi_ulang || "",
    catatan: row.catatan || "",
    jalur_pendaftaran: row.jalur_pendaftaran || "Reguler",
    created_at: row.created_at,
    updated_at: row.updated_at,
  };
}

export async function createCalonSiswa(
  data: Omit<CalonSiswaRecord, "id" | "created_at" | "updated_at">
): Promise<number> {
  const db = await getDatabase();
  await initSpmbTables();

  const gelombangVal = data.gelombang || data.tahap || "Gelombang 1 Tahap 1";
  const statusVal =
    data.status_kelulusan === "Tidak Lulus"
      ? "Silahkan hubungi Panitia SPMB"
      : data.status_kelulusan;

  const res = await db.run(
    `INSERT INTO spmb_calon_siswa (
      no_pendaftaran, nisn, nama_calon_siswa, asal_sekolah,
      gelombang, status_kelulusan, jadwal_registrasi_ulang,
      catatan, jalur_pendaftaran
    ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
    [
      data.no_pendaftaran,
      data.nisn,
      data.nama_calon_siswa,
      data.asal_sekolah,
      gelombangVal,
      statusVal,
      data.jadwal_registrasi_ulang || "",
      data.catatan || "",
      data.jalur_pendaftaran || "Reguler",
    ]
  );

  return res.lastID as number;
}

export async function updateCalonSiswa(
  id: number,
  data: Partial<Omit<CalonSiswaRecord, "id" | "created_at" | "updated_at">>
): Promise<boolean> {
  const db = await getDatabase();
  await initSpmbTables();

  const fields: string[] = [];
  const params: unknown[] = [];

  if (data.no_pendaftaran !== undefined) {
    fields.push("no_pendaftaran = ?");
    params.push(data.no_pendaftaran);
  }
  if (data.nisn !== undefined) {
    fields.push("nisn = ?");
    params.push(data.nisn);
  }
  if (data.nama_calon_siswa !== undefined) {
    fields.push("nama_calon_siswa = ?");
    params.push(data.nama_calon_siswa);
  }
  if (data.asal_sekolah !== undefined) {
    fields.push("asal_sekolah = ?");
    params.push(data.asal_sekolah);
  }
  if (data.gelombang !== undefined || data.tahap !== undefined) {
    fields.push("gelombang = ?");
    params.push(data.gelombang || data.tahap);
  }
  if (data.status_kelulusan !== undefined) {
    fields.push("status_kelulusan = ?");
    const statusVal =
      data.status_kelulusan === "Tidak Lulus"
        ? "Silahkan hubungi Panitia SPMB"
        : data.status_kelulusan;
    params.push(statusVal);
  }
  if (data.jadwal_registrasi_ulang !== undefined) {
    fields.push("jadwal_registrasi_ulang = ?");
    params.push(data.jadwal_registrasi_ulang);
  }
  if (data.catatan !== undefined) {
    fields.push("catatan = ?");
    params.push(data.catatan);
  }
  if (data.jalur_pendaftaran !== undefined) {
    fields.push("jalur_pendaftaran = ?");
    params.push(data.jalur_pendaftaran);
  }

  if (fields.length === 0) return false;

  fields.push("updated_at = CURRENT_TIMESTAMP");
  params.push(id);

  const res = await db.run(
    `UPDATE spmb_calon_siswa SET ${fields.join(", ")} WHERE id = ?`,
    params
  );

  return (res.changes || 0) > 0;
}

export async function deleteCalonSiswa(id: number): Promise<boolean> {
  const db = await getDatabase();
  await initSpmbTables();
  const res = await db.run("DELETE FROM spmb_calon_siswa WHERE id = ?", [id]);
  return (res.changes || 0) > 0;
}

export async function batchDeleteCalonSiswa(ids: number[]): Promise<number> {
  if (!ids || ids.length === 0) return 0;
  const db = await getDatabase();
  await initSpmbTables();
  const placeholders = ids.map(() => "?").join(",");
  const res = await db.run(
    `DELETE FROM spmb_calon_siswa WHERE id IN (${placeholders})`,
    ids
  );
  return res.changes || 0;
}

export async function deleteAllCalonSiswa(): Promise<number> {
  const db = await getDatabase();
  await initSpmbTables();
  const res = await db.run("DELETE FROM spmb_calon_siswa");
  try {
    await db.run("DELETE FROM sqlite_sequence WHERE name = 'spmb_calon_siswa'");
  } catch (e) {
    // Ignore if sqlite_sequence doesn't exist
  }
  return res.changes || 0;
}

export async function batchUpdateJadwalRegistrasi(
  ids: number[],
  jadwal: string
): Promise<number> {
  if (!ids || ids.length === 0) return 0;
  const db = await getDatabase();
  await initSpmbTables();
  const placeholders = ids.map(() => "?").join(",");
  const res = await db.run(
    `UPDATE spmb_calon_siswa SET jadwal_registrasi_ulang = ?, updated_at = CURRENT_TIMESTAMP WHERE id IN (${placeholders})`,
    [jadwal, ...ids]
  );
  return res.changes || 0;
}

export async function batchInsertCalonSiswa(
  items: Omit<CalonSiswaRecord, "id" | "created_at" | "updated_at">[]
): Promise<number> {
  if (!items || items.length === 0) return 0;
  const db = await getDatabase();
  await initSpmbTables();

  let inserted = 0;
  for (const item of items) {
    try {
      const gelombangVal = item.gelombang || item.tahap || "Gelombang 1 Tahap 1";
      const statusVal =
        item.status_kelulusan === "Tidak Lulus"
          ? "Silahkan hubungi Panitia SPMB"
          : item.status_kelulusan;

      await db.run(
        `INSERT INTO spmb_calon_siswa (
          no_pendaftaran, nisn, nama_calon_siswa, asal_sekolah,
          gelombang, status_kelulusan, jadwal_registrasi_ulang,
          catatan, jalur_pendaftaran
        ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
        ON CONFLICT(no_pendaftaran) DO UPDATE SET
          nisn = excluded.nisn,
          nama_calon_siswa = excluded.nama_calon_siswa,
          asal_sekolah = excluded.asal_sekolah,
          gelombang = excluded.gelombang,
          status_kelulusan = excluded.status_kelulusan,
          jadwal_registrasi_ulang = excluded.jadwal_registrasi_ulang,
          catatan = excluded.catatan,
          jalur_pendaftaran = excluded.jalur_pendaftaran,
          updated_at = CURRENT_TIMESTAMP`,
        [
          item.no_pendaftaran,
          item.nisn,
          item.nama_calon_siswa,
          item.asal_sekolah,
          gelombangVal,
          statusVal,
          item.jadwal_registrasi_ulang || "",
          item.catatan || "",
          item.jalur_pendaftaran || "Reguler",
        ]
      );
      inserted++;
    } catch (e) {
      console.error("Error inserting calon siswa:", e);
    }
  }
  return inserted;
}

export async function getSpmbSettings(): Promise<SpmbSettingsRecord> {
  const db = await getDatabase();
  await initSpmbTables();
  const row = await db.get<SpmbSettingsRecord>(
    "SELECT * FROM spmb_settings ORDER BY id ASC LIMIT 1"
  );
  if (row) return row;

  return {
    id: 1,
    tahun_ajaran: "2026/2027",
    judul_pengumuman: "PENGUMUMAN HASIL SELEKSI & TES PEMETAAN SPMB SMA BPI 1 BANDUNG",
    teks_pengumuman:
      "Selamat kepada calon peserta didik baru yang dinyatakan LULUS seleksi dan tes pemetaan SMA BPI 1 Bandung Tahun Ajaran 2026/2027. Seluruh calon peserta didik yang lulus diwajibkan melakukan registrasi ulang sesuai jadwal dan ketentuan yang berlaku.",
    syarat_registrasi:
      "1. Membawa Lembar Asli / Bukti Kelulusan Seleksi SPMB ini.\n2. Fotokopi Ijazah / SKL SMP dilegalisir (2 lembar).\n3. Fotokopi Akta Kelahiran dan Kartu Keluarga (KK) (2 lembar).\n4. Pas foto resmi berseragam SMP ukuran 3x4 (3 lembar).\n5. Bukti setor lunas administrasi registrasi ulang dari Bagian Keuangan Yayasan BPI.",
    lokasi_pembayaran:
      "Sekretariat Panitia SPMB / Loket Registrasi Kampus SMA BPI 1 Bandung, Jl. Burangrang No. 8, Bandung 40262.",
    kontak_panitia:
      "Sekretariat SPMB: (022) 7301739 / WhatsApp Panitia: 0812-2026-1079 (Humas & SPMB SMA BPI 1)",
    default_jadwal_registrasi: "15 Juli 2026 s.d. 22 Juli 2026 (Pukul 08.00 - 14.00 WIB)",
    updated_at: new Date().toISOString(),
  };
}

export async function updateSpmbSettings(
  data: Partial<Omit<SpmbSettingsRecord, "id" | "updated_at">>
): Promise<boolean> {
  const db = await getDatabase();
  await initSpmbTables();

  const current = await getSpmbSettings();
  const res = await db.run(
    `UPDATE spmb_settings SET
      tahun_ajaran = ?,
      judul_pengumuman = ?,
      teks_pengumuman = ?,
      syarat_registrasi = ?,
      lokasi_pembayaran = ?,
      kontak_panitia = ?,
      default_jadwal_registrasi = ?,
      updated_at = CURRENT_TIMESTAMP
    WHERE id = ?`,
    [
      data.tahun_ajaran || current.tahun_ajaran,
      data.judul_pengumuman || current.judul_pengumuman,
      data.teks_pengumuman || current.teks_pengumuman,
      data.syarat_registrasi || current.syarat_registrasi,
      data.lokasi_pembayaran || current.lokasi_pembayaran,
      data.kontak_panitia || current.kontak_panitia,
      data.default_jadwal_registrasi || current.default_jadwal_registrasi,
      current.id,
    ]
  );

  return (res.changes || 0) > 0;
}
