/**
 * better-sqlite3-Rauchtest.
 *
 * Bewusst noch OHNE Schema: das Datenmodell kommt aus einem anderen
 * Arbeitsstrang. Hier wird nur nachgewiesen, dass das native Modul für die
 * verwendete Electron-ABI geladen werden kann und eine Abfrage beantwortet.
 *
 * Das Laden erfolgt defensiv: schlägt es fehl (typischerweise ein
 * `NODE_MODULE_VERSION`-Konflikt, weil `npm run rebuild` noch nicht lief),
 * startet die Anwendung trotzdem und meldet den Zustand in der Oberfläche,
 * statt beim Start abzustürzen.
 */

import type BetterSqlite3 from 'better-sqlite3';

import type { DatenbankStatus } from '../shared/ipc';

/** Konstruktor-Signatur von better-sqlite3 (nur der hier genutzte Teil). */
type DatenbankKonstruktor = new (pfad: string) => BetterSqlite3.Database;

let zwischengespeichert: DatenbankStatus | null = null;

function fehlerText(fehler: unknown): string {
  if (fehler instanceof Error) {
    return fehler.message;
  }
  return String(fehler);
}

function pruefen(): DatenbankStatus {
  try {
    // Absichtlich `require` statt eines statischen Imports: so bleibt das
    // Laden verzögert und ein Fehlschlag lässt sich hier abfangen, statt
    // beim Start des Main-Prozesses durchzuschlagen. better-sqlite3 ist ein
    // natives CommonJS-Modul und wird nicht mitgebündelt.
    // eslint-disable-next-line @typescript-eslint/no-require-imports
    const DatenbankKlasse = require('better-sqlite3') as DatenbankKonstruktor;

    // In-Memory-Datenbank: es entsteht keine Datei auf der Platte.
    const datenbank = new DatenbankKlasse(':memory:');
    try {
      const zeile = datenbank.prepare('SELECT sqlite_version() AS version').get() as
        { version: string } | undefined;

      const version = zeile?.version ?? null;
      return {
        verfuegbar: version !== null,
        sqliteVersion: version,
        meldung:
          version !== null
            ? `SQLite ${version} einsatzbereit.`
            : 'SQLite antwortete, lieferte aber keine Version.',
      };
    } finally {
      datenbank.close();
    }
  } catch (fehler) {
    return {
      verfuegbar: false,
      sqliteVersion: null,
      meldung:
        `SQLite nicht verfügbar: ${fehlerText(fehler)} ` +
        'Bitte "npm run rebuild" ausführen, um das native Modul für Electron neu zu bauen.',
    };
  }
}

/** Führt den Rauchtest einmalig aus und liefert danach das Ergebnis aus dem Cache. */
export function datenbankStatus(): DatenbankStatus {
  zwischengespeichert ??= pruefen();
  return zwischengespeichert;
}
