import Database from 'better-sqlite3';
import path from 'path';
import fs from 'fs';

const DB_PATH = path.join(process.cwd(), 'db', 'yumder.db');
const SCHEMA_PATH = path.join(process.cwd(), 'db', 'schema.sql');

let db: Database.Database | null = null;

export function getDb(): Database.Database {
  if (db) return db;
  const isNew = !fs.existsSync(DB_PATH);
  db = new Database(DB_PATH);
  db.pragma('journal_mode = WAL');
  if (isNew) {
    const schema = fs.readFileSync(SCHEMA_PATH, 'utf-8');
    db.exec(schema);
  }
  return db;
}

/**
 * Fuehrt eine Funktion innerhalb einer SQLite-WRITE-Transaktion aus.
 * Serialisiert gleichzeitige Schreibzugriffe, da BEGIN IMMEDIATE den
 * Write-Lock sofort erwirbt. Wichtig fuer kritische Pfade wie Swipes/Matches.
 */
export function withImmediateTransaction<T>(fn: (database: Database.Database) => T): T {
  const database = getDb();
  database.prepare('BEGIN IMMEDIATE').run();
  try {
    const result = fn(database);
    database.prepare('COMMIT').run();
    return result;
  } catch (e) {
    database.prepare('ROLLBACK').run();
    throw e;
  }
}
