import { backup } from "node:sqlite";
import { mkdir, cp, writeFile, chmod } from "node:fs/promises";
import { resolve, join } from "node:path";
import { openDatabase } from "../server/database.ts";
import { storageRoot } from "../server/storage.ts";
if (process.env.BACKUP_WRITES_PAUSED !== "true")
  throw new Error(
    "Pause the app and jobs, then set BACKUP_WRITES_PAUSED=true for a consistent DB + files snapshot.",
  );
const base = resolve(process.env.BACKUP_DIR || "backups"),
  out = join(base, new Date().toISOString().replaceAll(":", "-"));
if (base.startsWith(storageRoot()))
  throw new Error("Backup directory must be outside storage");
await mkdir(out, { recursive: true, mode: 0o700 });
await backup(openDatabase(), join(out, "institution.sqlite"));
await chmod(join(out, "institution.sqlite"), 0o600);
await mkdir(storageRoot(), { recursive: true, mode: 0o700 });
await cp(storageRoot(), join(out, "private-files"), { recursive: true });
await writeFile(
  join(out, "manifest.json"),
  JSON.stringify(
    {
      createdAt: new Date().toISOString(),
      database: "institution.sqlite",
      storage: "private-files",
      writesPaused: true,
    },
    null,
    2,
  ),
  { mode: 0o600 },
);
console.log(out);
