import Database from "better-sqlite3";
import { mkdirSync, readFileSync, existsSync } from "node:fs";
import { dirname, resolve, join } from "node:path";
import { fileURLToPath } from "node:url";

let _db: Database.Database | null = null;

function dbPath(): string {
  // DB_PATH hat Vorrang — docker-compose setzt es absolut.
  // Sonst ./data/eldov.db relativ zum CWD (Repo-Root bei `next start`).
  if (process.env.DB_PATH) return resolve(process.env.DB_PATH);
  return resolve(process.cwd(), "data", "eldov.db");
}

function schemaSql(): string {
  // schema.sql liegt in src/lib/. Wir probieren mehrere plausible Pfade,
  // weil `import.meta.url` im Build auf `.next/server/chunks/...` zeigt.
  const here = dirname(fileURLToPath(import.meta.url));
  const candidates = [
    join(here, "schema.sql"),
    resolve(here, "..", "..", "schema.sql"),
    resolve(here, "..", "..", "..", "schema.sql"),
    resolve(process.cwd(), "src/lib/schema.sql"),
    resolve(process.cwd(), "schema.sql"),
  ];
  for (const p of candidates) {
    // turbopackIgnore: schema.sql wird zur Build-Zeit nicht vom FS-Trace
    // erfasst; wir lesen es erst zur Laufzeit beim ersten Request.
    if (existsSync(p)) return readFileSync(/* turbopackIgnore: true */ p, "utf8");
  }
  throw new Error(`schema.sql nicht gefunden. Geprüft: ${candidates.join(", ")}`);
}

export function getDb(): Database.Database {
  if (_db) return _db;
  const path = dbPath();
  mkdirSync(dirname(path), { recursive: true });
  const db = new Database(path);
  db.exec(schemaSql());
  // Singleton-Profile wird NICHT hier angelegt — `seedIfEmpty()` ist dafür
  // zuständig, damit der erste Seed klar als solcher erkennbar ist.
  _db = db;
  return db;
}

// Test-Hook: DB-Instanz wegwerfen (nicht für Production).
export function __resetDbForTest(): void {
  if (_db) {
    _db.close();
    _db = null;
  }
}
