const passwd = require('../passwd');
const userRepo = require('../database/UserRepository');

async function UpdateUserPassword(req, res) {
    try {
        if (!req.session.isLogged) {
            console.error('ERROR: Użytkownik nie jest zalogowany by zmienić hasło');
            return res.status(401).json({
                success: false,
                mess: 'Nie jesteś zalogowany!'
            });
        }

        const userId      = req.session.user_id;
        const actualPass  = req.body.pass;
        const newPass     = req.body.newPass;
        const confirmPass = req.body.confirmPass;

        if (!passwd.CheckPasswodLength(newPass)) {
            console.error('ERROR: Hasło nie składa się z minimów 8 znaków');
            return res.status(400).json({
                success: false,
                mess: 'Hasło jest za ktrutkie! Musi być minimum 8 znaków.'
            });
        }

        if (!ValidGlyphsPass(newPass)) {
            console.error('ERROR: Hasło powinno zawierać conajmniej jedną Dużą i małą literę, fyfrę, znak specjalny');
            return res.status(200).json({
                success: false,
                mess: 'Hasło powinno zawierać conajmniej jedną Dużą i małą literę, fyfrę, znak specjalny!'
            });
        } 

        if (!passwd.CompareNewPasswords(newPass, confirmPass)) {
            console.error('ERROR: Podane hasła nie są takie same');
            return res.status(400).json({
                success: false,
                mess: 'Podane hasła nie są takie same!'
            });
        }

        if (!await userRepo.ValidPass(userId, actualPass)) {
            console.error('ERROR: Niepoprawne hasło');
            return res.status(401).json({
                success: false,
                mess: 'Niepoprawne hasło!'
            });
        }

        if (await userRepo.ValidPass(userId, newPass)) {
            console.error('ERROR: Nowe hasło jest podobne do starego');
            return res.status(400).json({
                success: false,
                mess: 'Nowe hasło nie może być spujne ze starym haslem!'
            });
        }

        const hash = await passwd.HashPassword(newPass);

        if(await userRepo.UpdatePassword(userId, hash) < 1) {
            console.error('ERROR: Nie udało się zaktualizować hasła');
            return res.status(400).json({
                success: false,
                mess: 'Nie udało się zaktualizować hasła!'
            });
        }

        res.status(200).json({success: true, mess: 'Hasło zaktualizowane'});
    }
    catch(e) {
        console.error(`ERROR: Nie udało sie zaktualizować hasła: ${e}`);
        res.status(500).json({success: false, mess: 'Nie udało się zaktualizować hasła!'});
    }
}

//Sprawdzenie czy hasło zawiera porządane rodzaje znaków
function ValidGlyphsPass(pass) {
    const hasUpperCase = /[A-Z]/.test(pass);
    const hasLowerCase = /[a-z]/.test(pass);
    const hasDigit = /\d/.test(pass);
    const hasSpecialChar = /[!@#$%^&*(),.?":{}|<>]/.test(pass);

    return hasUpperCase && hasLowerCase && hasDigit && hasSpecialChar;
}

module.exports = UpdateUserPassword;