"use strict";

// Privilegierter Parent-Scope: schreibt/liest about:config-Prefs über Services.prefs.
// Der Modulpfad von ExtensionCommon wechselte mitten im TB-Lebenszyklus:
//   TB 115+   -> ExtensionCommon.sys.mjs (ESM)
//   TB 109-114 -> ExtensionCommon.jsm (JSM)
// Deshalb defensiv laden, damit dieselbe api.js über die Flotte funktioniert.
var { ExtensionCommon } = (() => {
  try {
    return ChromeUtils.importESModule(
      "resource://gre/modules/ExtensionCommon.sys.mjs"
    );
  } catch (e) {
    return ChromeUtils.import("resource://gre/modules/ExtensionCommon.jsm");
  }
})();

// `Services` ist im privilegierten ExtensionAPI-Sandbox in TB 109+ global
// (stellt Services.prefs = nsIPrefBranch bereit); kein Import nötig.

this.forcedPrefs = class extends ExtensionCommon.ExtensionAPI {
  getAPI(context) {
    return {
      forcedPrefs: {
        async setPref(name, type, value) {
          switch (type) {
            case "bool":
              Services.prefs.setBoolPref(name, !!value);
              break;
            case "int":
              Services.prefs.setIntPref(name, value | 0);
              break;
            case "string":
              // setStringPref ist unicode-sicher (im Gegensatz zu setCharPref).
              Services.prefs.setStringPref(name, String(value));
              break;
            default:
              throw new Error("forcedPrefs.setPref: unknown type " + type);
          }
          return true;
        },

        async getPref(name, type) {
          if (Services.prefs.getPrefType(name) === Services.prefs.PREF_INVALID) {
            return null;
          }
          switch (type) {
            case "bool":
              return Services.prefs.getBoolPref(name, false);
            case "int":
              return Services.prefs.getIntPref(name, 0);
            case "string":
              return Services.prefs.getStringPref(name, "");
            default:
              throw new Error("forcedPrefs.getPref: unknown type " + type);
          }
        },
      },
    };
  }
};
