/**
 * Connexion SQLite partagée.
 *
 * La base est ouverte une seule fois, en lecture seule : l'application web ne
 * modifie jamais les données, c'est le rôle du pipeline. Le mode WAL permet au
 * pipeline d'écrire pendant que l'application lit, sans blocage.
 */
import Database from 'better-sqlite3';
import { existsSync } from 'node:fs';
import { dirname, resolve } from 'node:path';
import { fileURLToPath } from 'node:url';

const ICI = dirname(fileURLToPath(import.meta.url));

/** Emplacements possibles de la base, du plus explicite au plus conventionnel. */
function trouverLaBase(): string {
	const candidats = [
		process.env.VEILLE_DB,
		resolve(process.cwd(), '../data/veille.db'),
		resolve(process.cwd(), 'data/veille.db'),
		resolve(ICI, '../../../../data/veille.db')
	].filter(Boolean) as string[];

	for (const candidat of candidats) {
		if (existsSync(candidat)) return candidat;
	}

	throw new Error(
		`Base introuvable. Essayés : ${candidats.join(', ')}. ` +
			'Lancer `make seed` à la racine du dépôt, ou définir VEILLE_DB.'
	);
}

let instance: Database.Database | null = null;

export function base(): Database.Database {
	if (instance) return instance;

	instance = new Database(trouverLaBase(), { readonly: true, fileMustExist: true });
	instance.pragma('journal_mode = WAL');
	// Les requêtes de facettes lisent beaucoup et écrivent rien : un cache
	// généreux évite de relire les mêmes pages à chaque requête HTTP.
	instance.pragma('cache_size = -16000');
	return instance;
}

export function fermer(): void {
	instance?.close();
	instance = null;
}

/** Date d'arrêté du corpus de recherche, affichée partout où c'est utile. */
export const DATE_ARRETE_CORPUS = '2026-07-25';
