// /server_modules/auth.js
const bcrypt = require('bcryptjs'); // Для хеширования паролей
const db = require('./db'); // Ваш модуль для работы с базой данных

const SALT_ROUNDS = 10; // Количество раундов для генерации соли bcrypt

/**
 * Регистрирует нового пользователя.
 * @param {string} username - Имя пользователя.
 * @param {string} password - Пароль пользователя.
 * @returns {Promise<object>} Объект с результатом: { success: boolean, message: string, userId?: number }
 */
async function registerUser(username, password) {
    console.log(`[Auth DEBUG] registerUser called with username: "${username}"`); // 1. Начало функции

    if (!username || !password) {
        console.warn('[Auth DEBUG] Validation failed: Username or password empty.');
        return { success: false, message: 'Имя пользователя и пароль не могут быть пустыми.' };
    }
    if (password.length < 6) {
        console.warn(`[Auth DEBUG] Validation failed for "${username}": Password too short.`);
        return { success: false, message: 'Пароль должен содержать не менее 6 символов.' };
    }

    try {
        // Этап A: Проверка существующего пользователя
        console.log(`[Auth DEBUG] Stage A: Checking if user "${username}" exists...`);
        const [existingUsers] = await db.query('SELECT id FROM users WHERE username = ?', [username]);
        console.log(`[Auth DEBUG] Stage A: existingUsers query result length: ${existingUsers.length}`);

        if (existingUsers.length > 0) {
            console.warn(`[Auth DEBUG] Registration declined for "${username}": Username already taken.`);
            return { success: false, message: 'Это имя пользователя уже занято.' };
        }
        console.log(`[Auth DEBUG] Stage A: Username "${username}" is available.`);

        // Этап B: Хеширование пароля
        console.log(`[Auth DEBUG] Stage B: Hashing password for user "${username}"...`);
        const hashedPassword = await bcrypt.hash(password, SALT_ROUNDS);
        console.log(`[Auth DEBUG] Stage B: Password for "${username}" hashed successfully.`);

        // Этап C: Сохранение пользователя в БД
        console.log(`[Auth DEBUG] Stage C: Attempting to insert user "${username}" into DB...`);
        const [result] = await db.query(
            'INSERT INTO users (username, password_hash) VALUES (?, ?)',
            [username, hashedPassword]
        );
        console.log(`[Auth DEBUG] Stage C: DB insert result for "${username}":`, result);

        if (result && result.insertId) { // Добавлена проверка на существование result
            console.log(`[Auth] Пользователь "${username}" успешно зарегистрирован с ID: ${result.insertId}.`);
            return { success: true, message: 'Регистрация прошла успешно!', userId: result.insertId };
        } else {
            console.error(`[Auth] Ошибка БД при регистрации пользователя "${username}": Запись не была вставлена или insertId отсутствует. Result:`, result);
            return { success: false, message: 'Ошибка сервера при регистрации (данные не сохранены). Попробуйте позже.' };
        }

    } catch (error) {
        console.error(`[Auth] КРИТИЧЕСКАЯ ОШИБКА (catch block) при регистрации пользователя "${username}":`, error);
        // Логируем более детальную информацию об ошибке, если это ошибка MySQL
        if (error.sqlMessage) {
            console.error(`[Auth] MySQL Error Message: ${error.sqlMessage}`);
            console.error(`[Auth] MySQL Error Code: ${error.code}`);
            console.error(`[Auth] MySQL Errno: ${error.errno}`);
        }
        return { success: false, message: 'Внутренняя ошибка сервера при регистрации.' };
    }
}

/**
 * Выполняет вход пользователя.
 * @param {string} username - Имя пользователя.
 * @param {string} password - Пароль пользователя.
 * @returns {Promise<object>} Объект с результатом: { success: boolean, message: string, userId?: number, username?: string }
 */
async function loginUser(username, password) {
    console.log(`[Auth DEBUG] loginUser called with username: "${username}"`);

    if (!username || !password) {
        console.warn('[Auth DEBUG] Login validation failed: Username or password empty.');
        return { success: false, message: 'Имя пользователя и пароль не могут быть пустыми.' };
    }

    try {
        console.log(`[Auth DEBUG] Searching for user "${username}" in DB...`);
        const [users] = await db.query('SELECT id, username, password_hash FROM users WHERE username = ?', [username]);
        console.log(`[Auth DEBUG] DB query result for user "${username}" (length): ${users.length}`);

        if (users.length === 0) {
            console.warn(`[Auth DEBUG] Login failed: User "${username}" not found.`);
            return { success: false, message: 'Неверное имя пользователя или пароль.' };
        }

        const user = users[0];
        console.log(`[Auth DEBUG] User "${username}" found. ID: ${user.id}. Comparing password...`);

        const passwordMatch = await bcrypt.compare(password, user.password_hash);
        console.log(`[Auth DEBUG] Password comparison result for "${username}": ${passwordMatch}`);

        if (passwordMatch) {
            console.log(`[Auth] Пользователь "${user.username}" (ID: ${user.id}) успешно вошел в систему.`);
            return {
                success: true,
                message: 'Вход выполнен успешно!',
                userId: user.id,
                username: user.username
            };
        } else {
            console.warn(`[Auth DEBUG] Login failed for user "${user.username}": Incorrect password.`);
            return { success: false, message: 'Неверное имя пользователя или пароль.' };
        }

    } catch (error) {
        console.error(`[Auth] КРИТИЧЕСКАЯ ОШИБКА (catch block) при входе пользователя "${username}":`, error);
        if (error.sqlMessage) {
            console.error(`[Auth] MySQL Error Message: ${error.sqlMessage}`);
            console.error(`[Auth] MySQL Error Code: ${error.code}`);
            console.error(`[Auth] MySQL Errno: ${error.errno}`);
        }
        return { success: false, message: 'Внутренняя ошибка сервера при входе.' };
    }
}

module.exports = {
    registerUser,
    loginUser
};