// Micara bridge — stockage local du jeton + préférences (P1-D login 1×)
// Fichier JSON dans le userData d'Electron, chmod 600.
// Le jeton est stocké EN CLAIR (plus de safeStorage/keychain) : la clé
// chiffrée via le trousseau macOS déclenchait au 1er login le pop-up
// « Micara Bridge veut accéder à la clé … Safe Storage » — très effrayant
// pour un client (app non signée). Risque accepté (décision 22/08) : le
// jeton ne donne accès qu'à l'espace de l'utilisateur. Migration : un ancien
// jeton chiffré (v ≤ 0.5.3) est déchiffré UNE seule fois — même machine, clé
// déjà autorisée dans le trousseau → pas de nouveau pop-up — puis réécrit en
// clair. Après quoi safeStorage n'est plus jamais appelé.
const fs = require('fs');
const path = require('path');

function createConfigStore({ userDataDir, safeStorage }) {
  const file = path.join(userDataDir, 'config.json');

  function read() {
    try { return JSON.parse(fs.readFileSync(file, 'utf8')); } catch { return {}; }
  }

  function write(obj) {
    fs.mkdirSync(userDataDir, { recursive: true });
    fs.writeFileSync(file, JSON.stringify(obj, null, 2), { mode: 0o600 });
    // writeFileSync n'applique le mode qu'à la création → forcer sur un
    // fichier pré-existant (créé par une ancienne version en mode par défaut).
    try { fs.chmodSync(file, 0o600); } catch { /* FS sans chmod : on ignore */ }
  }

  // token === null → efface le jeton stocké (déconnexion)
  function saveToken(token) {
    const cfg = read();
    if (token == null) {
      delete cfg.token;
      delete cfg.tokenEnc;
      write(cfg);
      return;
    }
    cfg.token = token;
    delete cfg.tokenEnc; // plus jamais de chiffrement → zéro pop-up trousseau
    write(cfg);
  }

  function loadToken() {
    const cfg = read();
    if (!cfg.token) return null;
    // Migration unique : ancien jeton chiffré (v ≤ 0.5.3) → clair.
    if (cfg.tokenEnc) {
      if (!safeStorage || !safeStorage.isEncryptionAvailable || !safeStorage.isEncryptionAvailable()) {
        return null; // clé inaccessible → l'utilisateur se reconnecte (login 1×)
      }
      try {
        const plain = safeStorage.decryptString(Buffer.from(cfg.token, 'base64'));
        saveToken(plain); // réécrit en clair + retire tokenEnc
        return plain;
      } catch {
        return null; // jeton illisible → reconnexion
      }
    }
    return cfg.token;
  }

  // fusionne des préférences (ex. { serverUrl }) sans toucher au jeton
  function save(obj) {
    write({ ...read(), ...obj });
  }

  function load() {
    return read();
  }

  // Migration silencieuse du serveur (décision 22/08) : l'ancien dev
  // stockait https://roommic.…sslip.io — toute URL stockée ≠ defaultServer
  // est remplacée par defaultServer (app.getmicara.com). Le client ne voit
  // jamais d'URL serveur. Retourne l'ancienne URL si migration, sinon null.
  function migrateServerUrl(defaultServer) {
    const cfg = read();
    const raw = cfg.serverUrl;
    if (raw == null) return null;
    const stored = String(raw).trim().replace(/\/+$/, '');
    if (stored === defaultServer && stored === raw) return null;
    write({ ...cfg, serverUrl: defaultServer });
    return stored !== defaultServer ? stored : null;
  }

  return { saveToken, loadToken, save, load, migrateServerUrl, file };
}

module.exports = { createConfigStore };
