const { createStele } = require("./index.js");
const LOCALES = ["en", "es", "pl"];
const CANONICAL = "en";
let _locale = CANONICAL;
let _current = createStele(_locale);
let _pref = "system";
let _deviceLocales = () => [];
let _storage = null;
const listeners = new Set();
function notify() {
for (const listener of listeners) listener();
}
function resolve(locale) {
if (locale === _locale) return;
_locale = locale;
_current = createStele(locale);
}
function getLocale() {
return _locale;
}
function getStele() {
return _current;
}
function isFollowingDevice() {
return _pref === "system";
}
function subscribeLocale(listener) {
listeners.add(listener);
return () => listeners.delete(listener);
}
function setLocale(locale) {
_pref = locale;
resolve(locale);
notify();
void _storage?.save(locale);
}
function followDevice() {
_pref = "system";
resolve(resolveLocale(_deviceLocales()));
notify();
void _storage?.save("system");
}
function syncDevice() {
if (_pref !== "system") return;
const next = resolveLocale(_deviceLocales());
if (next === _locale) return;
resolve(next);
notify();
}
function resolveLocale(tags) {
for (const tag of tags) {
const lower = tag.toLowerCase();
const exact = LOCALES.find((l) => l.toLowerCase() === lower);
if (exact) return exact;
const primary = lower.split("-")[0];
const base = LOCALES.find((l) => l.toLowerCase().split("-")[0] === primary);
if (base) return base;
}
return CANONICAL;
}
async function initLocale(opts) {
_storage = opts?.storage ?? null;
_deviceLocales = opts?.deviceLocales ?? (() => []);
let pref = opts?.initial ?? null;
if (pref === null && _storage !== null) pref = await _storage.load();
_pref = pref ?? "system";
if (_pref !== "system" && !LOCALES.includes(_pref)) _pref = "system";
resolve(_pref === "system" ? resolveLocale(_deviceLocales()) : _pref);
notify();
return _locale;
}
module.exports = {
getLocale,
getStele,
isFollowingDevice,
subscribeLocale,
setLocale,
followDevice,
syncDevice,
resolveLocale,
initLocale,
};