import fs from 'fs/promises';
import path from 'path';
import { fileURLToPath } from 'url';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

const CONFIG_DIR = path.join(__dirname, '../config/game');

let loadedConfig = {
    sectorSettings: null,
    achievements: null,
    titles: null
};

/**
 * Lädt eine spezifische JSON-Datei und parst ihren Inhalt.
 * SAFETYS: Friert das Objekt ein, um versehentliche Mutationen im Spielcode zu verhindern.
 * 
 * @param {string} fileName - Name der Datei (z.B. 'titles.json')
 * 
 * @returns {Promise<Object>} Das parste und eingefrorene Konfigurations-Objekt
 */
async function loadConfigFile(fileName) {
    try {
        const fullPath = path.join(CONFIG_DIR, fileName);
        const rawData = await fs.readFile(fullPath, 'utf-8');
        const parsedData = JSON.parse(rawData);
        
        return Object.freeze(parsedData);
    } catch (error) {
        console.error(`❌ Kritischer Fehler beim Laden der Konfigurationsdatei [${fileName}]:`, error);
        throw error;
    }
}

/**
 * Initialisiert den ConfigService und lädt alle Module sequenziell in den Speicher.
 * Sollte direkt beim Serverstart in der server.js aufgerufen werden.
 */
export const initGameConfig = async () => {
    console.log('⏳ Lade modulare Game-Konfigurationen in den Speicher...');
    try {
        loadedConfig.sectorSettings = await loadConfigFile('sectorSettings.json');
        loadedConfig.achievements = await loadConfigFile('achievements.json');
        loadedConfig.titles = await loadConfigFile('titles.json');
        
        console.log('✅ Alle Game-Konfigurationen erfolgreich geladen und im RAM gesichert.');
    } catch (error) {
        console.error('❌ Initialisierung der Game-Konfiguration fehlgeschlagen!');
        process.exit(1);
    }
};

/**
 * Gibt die vollständigen Sektor-Einstellungen zurück.
 * 
 * @returns {Object}
 */
export const getSectorSettings = () => loadedConfig.sectorSettings;

/**
 * Gibt den gesamten Erfolgs-Katalog zurück.
 * 
 * @returns {Object}
 */
export const getAchievements = () => loadedConfig.achievements;

/**
 * Löst eine Title-ID basierend auf Sprache und Gender in den konkreten Text auf.
 * 
 * @param {number|string} titleId - Die ID des Titels aus der DB
 * @param {string} lang - Der Sprachschlüssel (z.B. 'de', 'en')
 * @param {string} gender - Das Geschlecht des Commanders ('male', 'female')
 * 
 * @returns {Object|null} Ein Objekt mit { name: "Der...", description: "..." } oder null
 */
export const resolveTitle = (titleId, lang = 'de', gender = 'male') => {
    const titleEntry = loadedConfig.titles[String(titleId)];
    
    if (!titleEntry) return null;

    const langPack = titleEntry.languages[lang] || titleEntry.languages['de'];
    if (!langPack) return null;

    return {
        system_key: titleEntry.system_key,
        name: langPack[gender] || langPack['male'], 
        description: langPack.description
    };
};