// /server_modules/db.js
const mysql = require('mysql2'); // Используем mysql2 для поддержки промисов и улучшенной производительности

// Конфигурация подключения к вашей базе данных MySQL
// ЗАМЕНИТЕ значения на ваши реальные данные!
const dbConfig = {
    host: 'localhost',         // или IP-адрес вашего MySQL сервера
    user: 'phpmyadmin',   // Имя пользователя MySQL (например, 'root' для локальной разработки)
    password: 'Innamorato8Art', // Пароль пользователя MySQL (убедитесь, что он правильный)
    database: 'your_game_db',  // Имя вашей базы данных (например, 'your_game_db')
    port: 3306,                // Стандартный порт MySQL, измените если у вас другой
    waitForConnections: true,  // Ожидать доступного соединения, если все заняты
    connectionLimit: 10,       // Максимальное количество соединений в пуле
    queueLimit: 0              // Максимальное количество запросов в очереди (0 = безлимитно)
};

// Создаем пул соединений. Пул более эффективен для веб-приложений,
// чем создание нового соединения для каждого запроса.
let pool;
try {
    pool = mysql.createPool(dbConfig);
} catch (error) {
    console.error('[DB FATAL] Не удалось создать пул соединений MySQL. Проверьте конфигурацию `dbConfig`. Ошибка:', error);
    // Если пул не создался, дальнейшая работа с БД невозможна.
    // Можно завершить приложение или попытаться пересоздать пул позже.
    // Для простоты, мы просто выведем ошибку. Приложение, скорее всего, упадет при попытке использовать `pool`.
    // В реальном приложении здесь нужна более надежная обработка.
    process.exit(1); // Завершаем приложение, так как без БД оно не сможет работать
}


// Обертка для выполнения запросов с использованием промисов из пула
// Мы экспортируем именно эту обертку.
const promisePool = pool.promise();

// Проверка соединения (опционально, но полезно для отладки при запуске)
// Делаем это после экспорта, чтобы модуль мог быть загружен даже если проверка упадет,
// хотя в данном случае мы завершаем процесс, если пул не создался.
if (promisePool) { // Проверяем, что promisePool был успешно создан
    promisePool.getConnection()
        .then(connection => {
            console.log('[DB] Успешно подключено к базе данных MySQL и получено соединение из пула.');
            connection.release(); // Важно!!! Возвращаем соединение в пул
            console.log('[DB] Соединение возвращено в пул.');
        })
        .catch(err => {
            console.error('[DB] Ошибка при попытке получить соединение из пула или при подключении к MySQL:', err.message);
            console.error('[DB] Полные детали ошибки:', err); // Выводим полный объект ошибки для диагностики

            if (err.code === 'PROTOCOL_CONNECTION_LOST') {
                console.error('[DB] Соединение с БД было потеряно.');
            } else if (err.code === 'ER_CON_COUNT_ERROR') {
                console.error('[DB] В БД слишком много соединений.');
            } else if (err.code === 'ECONNREFUSED') {
                console.error('[DB] Соединение с БД было отклонено. Убедитесь, что сервер MySQL запущен и доступен по указанному хосту и порту.');
            } else if (err.code === 'ER_ACCESS_DENIED_ERROR') {
                console.error(`[DB] Доступ к БД запрещен для пользователя '${dbConfig.user}'. Проверьте имя пользователя и пароль в db.js.`);
            } else if (err.code === 'ER_BAD_DB_ERROR') {
                console.error(`[DB] База данных "${dbConfig.database}" не найдена. Убедитесь, что она создана.`);
            } else {
                console.error(`[DB] Неизвестная ошибка подключения к MySQL. Код: ${err.code}`);
            }
            // В продакшене здесь может быть логика переподключения или более изящного завершения работы.
            // Для отладки сейчас важно видеть эти ошибки.
            // process.exit(1); // Можно раскомментировать, если хотите жестко падать при ошибке подключения
        });
} else {
    console.error('[DB FATAL] promisePool не был создан. Проверьте создание `pool`.');
}

// Экспортируем пул с промисами, чтобы его можно было использовать в других модулях (например, в auth.js)
module.exports = promisePool;

/*
Пример использования в другом файле (например, auth.js):

const db = require('./db'); // db здесь будет promisePool

async function getUser(username) {
    if (!db) { // Дополнительная проверка на случай, если db не экспортировался
        console.error("DB модуль не загружен или не экспортировал promisePool!");
        throw new Error("DB connection is not available.");
    }
    try {
        const [rows, fields] = await db.query('SELECT * FROM users WHERE username = ?', [username]);
        return rows[0]; // Возвращаем первого найденного пользователя или undefined
    } catch (error) {
        console.error("Ошибка при получении пользователя:", error);
        throw error; // или обработать ошибку иначе
    }
}
*/