// /server/core/logger.js

/**
 * Простой логгер-обертка.
 * В будущем можно заменить на более продвинутое решение (Winston, Pino),
 * сохранив этот же интерфейс.
 */

const LOG_LEVELS = {
    DEBUG: 'DEBUG',
    INFO: 'INFO',
    WARN: 'WARN',
    ERROR: 'ERROR',
    FATAL: 'FATAL'
};

// Можно установить минимальный уровень логирования из переменной окружения или конфига
const CURRENT_LOG_LEVEL = process.env.LOG_LEVEL || LOG_LEVELS.INFO;

function shouldLog(level) {
    const levelsOrder = [LOG_LEVELS.DEBUG, LOG_LEVELS.INFO, LOG_LEVELS.WARN, LOG_LEVELS.ERROR, LOG_LEVELS.FATAL];
    return levelsOrder.indexOf(level) >= levelsOrder.indexOf(CURRENT_LOG_LEVEL);
}

function formatMessage(level, moduleName, message, ...optionalParams) {
    const timestamp = new Date().toISOString();
    let formattedMessage = `${timestamp} [${level}]`;
    if (moduleName) {
        formattedMessage += ` [${moduleName}]`;
    }
    formattedMessage += `: ${message}`;

    // Обработка дополнительных параметров (например, объектов ошибок)
    const paramsString = optionalParams.map(param => {
        if (param instanceof Error) {
            return `\n${param.stack || param.message}`;
        }
        if (typeof param === 'object') {
            try {
                return `\n${JSON.stringify(param, null, 2)}`;
            } catch (e) {
                return '\n[Unserializable Object]';
            }
        }
        return param;
    }).join(' ');

    return `${formattedMessage}${paramsString ? ' ' + paramsString : ''}`;
}

const logger = {
    debug: (moduleName, message, ...optionalParams) => {
        if (shouldLog(LOG_LEVELS.DEBUG)) {
            console.debug(formatMessage(LOG_LEVELS.DEBUG, moduleName, message, ...optionalParams));
        }
    },
    info: (moduleName, message, ...optionalParams) => {
        if (shouldLog(LOG_LEVELS.INFO)) {
            console.info(formatMessage(LOG_LEVELS.INFO, moduleName, message, ...optionalParams));
        }
    },
    warn: (moduleName, message, ...optionalParams) => {
        if (shouldLog(LOG_LEVELS.WARN)) {
            console.warn(formatMessage(LOG_LEVELS.WARN, moduleName, message, ...optionalParams));
        }
    },
    error: (moduleName, message, ...optionalParams) => {
        if (shouldLog(LOG_LEVELS.ERROR)) {
            console.error(formatMessage(LOG_LEVELS.ERROR, moduleName, message, ...optionalParams));
        }
    },
    fatal: (moduleName, message, ...optionalParams) => { // Fatal обычно означает, что приложение не может продолжать работу
        if (shouldLog(LOG_LEVELS.FATAL)) {
            console.error(formatMessage(LOG_LEVELS.FATAL, moduleName, message, ...optionalParams));
            // В реальном приложении здесь может быть process.exit(1) после логирования
        }
    },
    // Generic log function if needed, defaults to INFO
    log: (moduleName, message, ...optionalParams) => {
        logger.info(moduleName, message, ...optionalParams);
    }
};

module.exports = logger;

/*
Пример использования в другом файле:
const logger = require('../core/logger'); // Путь зависит от местоположения

logger.info('GameManager', 'Новая игра создана', { gameId: '123', mode: 'pvp' });
logger.error('AuthService', 'Ошибка аутентификации пользователя', new Error('Пароль неверный'));
logger.debug('GameInstance', 'Состояние игрока обновлено:', playerStateObject);
*/