import {DatabaseSync} from 'node:sqlite';
import {mkdirSync} from 'node:fs';
import {join,resolve} from 'node:path';
let connection:DatabaseSync|undefined;
export function database(){if(!connection){const dir=resolve(process.env.SOVEREIGN_DATA_DIR||'.sovereign-data');mkdirSync(dir,{recursive:true,mode:0o700});connection=new DatabaseSync(join(dir,'sovereign.sqlite'));connection.exec('PRAGMA journal_mode=WAL; PRAGMA busy_timeout=5000; PRAGMA foreign_keys=ON;');}const db=connection;
function prepare(sql:string){let values:any[]=[];return {bind(...args:any[]){values=args;return this},async first<T=any>():Promise<T|null>{return (db.prepare(sql).get(...values) as T)||null},async all<T=any>(){return {results:db.prepare(sql).all(...values) as T[]}},async run(){return this._run()},_run(){const r=db.prepare(sql).run(...values);return {meta:{changes:Number(r.changes),last_row_id:Number(r.lastInsertRowid)}}}};}
return {prepare,async batch(statements:any[]){db.exec('BEGIN IMMEDIATE');try{const results=[];for(const statement of statements)results.push(statement._run());db.exec('COMMIT');return results}catch(e){db.exec('ROLLBACK');throw e}}};}
