import fs from 'fs';
import path from 'path';

const LOCALES_DIR = path.join(__dirname, '../../locales');
const DEFAULT_LANGUAGE = process.env.DEFAULT_LANGUAGE || 'en';
const AUTO_CREATE_TRANSLATIONS = process.env.AUTO_CREATE_TRANSLATIONS === 'true'; // Optional toggle
const cache: Record<string, Record<string, string>> = {};

export class I18N {
    private static getLocaleFilePath = (lang: string): string => {
        return path.join(LOCALES_DIR, `${lang}.json`);
    }

    private static loadLocale = (lang: string): Record<string, string> => {
        if (cache[lang]) return cache[lang];
        try {
            const content = fs.readFileSync(this.getLocaleFilePath(lang), 'utf-8');
            const parsed = JSON.parse(content);
            cache[lang] = parsed;
            return parsed;
        } catch {
            const empty = {};
            cache[lang] = empty;
            return empty;
        }
    }

    private static saveLocale = (lang: string, data: Record<string, string>) => {
        const filePath = this.getLocaleFilePath(lang);
        fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
        cache[lang] = data;
    }

    static t = (key: string, options?: TranslateOptions): string => {
        const lang = options?.language || DEFAULT_LANGUAGE;
        const translations = this.loadLocale(lang);
        let phrase = translations[key];
        if (!phrase) {
            phrase = key; // fallback
            if (AUTO_CREATE_TRANSLATIONS) {
                translations[key] = key; // auto-fill with key itself
                this.saveLocale(lang, translations);
                console.warn(`[i18n] Added missing key "${key}" to ${lang}.json`);
            }
        }
        phrase = phrase.replace(/\{(\w+)\}/g, (_, k) => options?.[k] ?? `{${k}}`);
        return phrase;
    };
}