import { randomBytes } from "node:crypto";
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
import { join } from "node:path";
import { env } from "./env.js";
export function configPath() {
    return join(env.DATA_DIR, "config.json");
}
let cached = null;
function fresh() {
    return {
        version: 1,
        domain: null,
        setupDoneAt: null,
        adminEmail: null,
        jwtAccessSecret: randomBytes(32).toString("hex"),
        jwtRefreshSecret: randomBytes(32).toString("hex"),
        jwtMaintenanceSecret: randomBytes(32).toString("hex"),
    };
}
/** Charge la config d'installation (initialise le fichier au premier accès). */
export function loadInstallConfig() {
    if (cached)
        return cached;
    let cfg;
    const path = configPath();
    if (existsSync(path)) {
        try {
            const parsed = JSON.parse(readFileSync(path, "utf8"));
            cfg = { ...fresh(), ...parsed };
        }
        catch (err) {
            // Fichier présent mais illisible : on ne détruit pas les secrets sans
            // le dire — on échoue plutôt que de repartir de zéro en silence.
            throw new Error(`config.json illisible (${path}) : ${err.message}. ` +
                `Réparez ou supprimez le fichier, puis relancez.`);
        }
    }
    else {
        cfg = fresh();
        mkdirSync(env.DATA_DIR, { recursive: true });
        writeFileSync(path, JSON.stringify(cfg, null, 2));
    }
    cached = cfg;
    return cfg;
}
export function saveInstallConfig(cfg) {
    mkdirSync(env.DATA_DIR, { recursive: true });
    writeFileSync(configPath(), JSON.stringify(cfg, null, 2));
    cached = cfg;
}
/** Applique un patch (ex. fin du setup) et persiste. */
export function updateInstallConfig(patch) {
    const cfg = { ...loadInstallConfig(), ...patch };
    saveInstallConfig(cfg);
    return cfg;
}
/** Secret access JWT effectif : env prioritaire, sinon config générée. */
export function accessSecret() {
    return process.env.JWT_ACCESS_SECRET ?? loadInstallConfig().jwtAccessSecret;
}
/** Secret refresh JWT effectif : env prioritaire, sinon config générée. */
export function refreshSecret() {
    return process.env.JWT_REFRESH_SECRET ?? loadInstallConfig().jwtRefreshSecret;
}
/** Secret des clés de maintenance : env prioritaire, sinon config générée. */
export function maintenanceSecret() {
    return process.env.JWT_MAINTENANCE_SECRET ?? loadInstallConfig().jwtMaintenanceSecret;
}
//# sourceMappingURL=config.js.map