package auth

import (
	"errors"

	"linux-auth/internal/db"
	"linux-auth/internal/utils"
)

/**
 * @brief Проверка аутентификации пользователя
 *
 * Сравнивает введённый пароль с хешем из БД.
 * Учитывает блокировку пользователя и количество неудачных попыток.
 *
 * @param username Логин пользователя
 * @param password Введённый пароль
 * @return true если доступ разрешён, false если логин/пароль неверны
 * @return ошибка если произошла системная ошибка (например, БД)
 */
func Authenticate(username, password string) (bool, error) {
	user, err := db.GetUser(username)
	if err != nil {
		// Пользователь не найден
		return false, nil
	}

	// Проверка блокировки
	if user.Locked {
		return false, errors.New("пользователь заблокирован")
	}

	// Проверка пароля
	if !utils.CheckPassword(password, user.PasswordHash) {
		// Инкрементируем счётчик неудачных попыток
		err := db.IncrementFail(username)
		if err != nil {
			return false, err
		}

		// Если достигнут максимум — блокируем
		const MaxAttempts = 3 // Можно передавать через config.toml
		user.FailedAttempts++
		if user.FailedAttempts >= MaxAttempts {
			_ = db.LockUser(username)
		}

		return false, nil
	}

	// Успешный вход — сбрасываем счётчик неудачных попыток
	_ = db.ResetFails(username)
	return true, nil
}
