// /server/core/db.js
require('dotenv').config({ path: require('node:path').resolve(process.cwd(), '.env') }); // Загружаем переменные из .env в process.env
const mysql = require('mysql2'); // Используем mysql2 для поддержки промисов и улучшенной производительности

// Конфигурация подключения к вашей базе данных MySQL
// Значения теперь берутся из переменных окружения (файла .env)
const dbConfig = {
    host: process.env.DB_HOST || 'localhost',
    user: process.env.DB_USER, // Обязательно должно быть задано в .env
    password: process.env.DB_PASSWORD, // Обязательно должно быть задано в .env
    database: process.env.DB_NAME, // Обязательно должно быть задано в .env
    port: parseInt(process.env.DB_PORT || '3306', 10), // Порт по умолчанию 3306, если не указан
    waitForConnections: process.env.DB_WAIT_FOR_CONNECTIONS ? (process.env.DB_WAIT_FOR_CONNECTIONS === 'true') : true,
    connectionLimit: parseInt(process.env.DB_CONNECTION_LIMIT || '10', 10),
    queueLimit: parseInt(process.env.DB_QUEUE_LIMIT || '0', 10)
};

// Проверка, что все обязательные переменные окружения для БД заданы
if (!dbConfig.user || !dbConfig.password || !dbConfig.database || !dbConfig.host) {
    console.error('[DB FATAL] Не все обязательные переменные окружения для БД заданы!');
    console.error('Убедитесь, что у вас есть файл .env в корне проекта и он содержит как минимум:');
    console.error('DB_HOST, DB_USER, DB_PASSWORD, DB_NAME');
    console.error('Текущие загруженные (некоторые могут быть undefined):');
    console.error(`  DB_HOST: ${process.env.DB_HOST}`);
    console.error(`  DB_USER: ${process.env.DB_USER}`);
    console.error(`  DB_PASSWORD: ${process.env.DB_PASSWORD ? '****** (задано)' : 'undefined'}`); // Не выводим пароль в лог
    console.error(`  DB_NAME: ${process.env.DB_NAME}`);
    console.error(`  DB_PORT: ${process.env.DB_PORT}`);
    process.exit(1); // Завершаем приложение, так как без БД оно не сможет работать корректно.
}

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

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

// Проверка соединения (опционально, но полезно для отладки при запуске)
if (promisePool) {
    promisePool.getConnection()
        .then(connection => {
            console.log(`[DB] Успешно подключено к базе данных MySQL (${dbConfig.database}) на ${dbConfig.host}:${dbConfig.port} и получено соединение из пула.`);
            connection.release();
            console.log('[DB] Соединение возвращено в пул.');
        })
        .catch(err => {
            console.error('[DB] Ошибка при попытке получить соединение из пула или при подключении к MySQL:', err.message);
            // Выводим полный объект ошибки для диагностики, если это не просто ошибка конфигурации
            if (err.code !== 'ER_ACCESS_DENIED_ERROR' && err.code !== 'ER_BAD_DB_ERROR' && err.code !== 'ECONNREFUSED') {
                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 запущен и доступен по адресу ${dbConfig.host}:${dbConfig.port}.`);
            } else if (err.code === 'ER_ACCESS_DENIED_ERROR') {
                console.error(`[DB] Доступ к БД запрещен для пользователя '${dbConfig.user}'. Проверьте имя пользователя и пароль в вашем файле .env.`);
            } else if (err.code === 'ER_BAD_DB_ERROR') {
                console.error(`[DB] База данных "${dbConfig.database}" не найдена. Убедитесь, что она создана на сервере MySQL и указана верно в .env (DB_NAME).`);
            } else {
                console.error(`[DB] Неизвестная ошибка подключения к MySQL. Код: ${err.code}`);
            }
            // process.exit(1); // Раскомментируйте, если хотите падать при ошибке подключения
        });
} else {
    console.error('[DB FATAL] promisePool не был создан. Это не должно было случиться.');
    process.exit(1);
}

// Экспортируем пул с промисами
module.exports = promisePool;

/*
Пример SQL для создания таблицы пользователей (если ее еще нет):

CREATE TABLE IF NOT EXISTS users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255) NOT NULL UNIQUE,
    password_hash VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

*/