const db = require('./DataBaseConnection');
const passwd = require('../passwd');

class UserRepository {
    constructor() {
        this.db = db.getConnection();
    }

    //Test poprawności podanych danych logowania
    async Valid(email, password) {
        const sql = `SELECT passwd FROM users WHERE email = ?`;
        const [rows] = await this.db.query(sql, [email]);

        if (rows.affectedRows === 0) {
            console.log("Nie znaleziono użytkowanika: " + email);
            return false;
        }

        return await passwd.ComparePassword(password, rows[0].passwd);
    }

    //Test poprawności podanych danych logowania
    async ValidPass(id, password) {
        const sql = `SELECT passwd FROM users WHERE id = ?`;
        const [rows] = await this.db.query(sql, [id]);

        if (rows.affectedRows === 0) {
            console.log("Nie znaleziono użytkowanika");
            return false;
        }
        
        return await passwd.ComparePassword(password, rows[0].passwd);
    }

    //Pobieranie danych użytkowanika na podstawie adresu email
    async GetForEmail(email) {
        try {
            const sql = `SELECT id, user, date_registration, avatar, preference FROM users WHERE email = ?`;
            const [rows] = await this.db.query(sql, [email]);

            if(rows.affectedRows === 0) {
                console.error('Nie udało się pobrać danych użytkownika :c');
                return null;
            }

            const avBlob = rows[0].avatar 

            const user = {
                id: rows[0].id,
                name: rows[0].user,
                regdate: rows[0].date_registation,
                avatar: avBlob ? avBlob.toString('base64') : null,
                preference: rows[0].preference ? rows[0].preference : {}
            }

            return user;
        }
        catch(e) {
            console.error('Pobieranie danych użytkownika:\n' + e);
            return null;
        }
    }

    async UpdatePreference(pref, user) {
        try {
            const sql = `
                UPDATE users SET
                preference = ?
                WHERE id = ?;
            `;

            await this.db.execute(sql, [pref, user]);
        }
        catch(e) {
            console.error(`ERROR: Nie udało się zaktualizować recordu preference: ${e}`);
        }
    }

    //Aktualizacja hasła
    async UpdatePassword(id, hash) {
        try {
            const sql = `UPDATE users SET passwd = ? WHERE id = ?`;

            const [rows] = await this.db.execute(sql, [hash, id]);
            return rows.affectedRows;
        }
        catch(e) {
            console.error(`ERROR: Nie udało się zaktualizować hasła: ${e}`);
            return -1;
        }
    }

    async UpdateName(id, name) {
        try {
            const sql = `UPDATE users SET user = ? WHERE id = ?`;

            const [rows] = await this.db.execute(sql, [name, id]);
            return rows.affectedRows;
        }
        catch(e) {
            console.error(`ERROR: Nie udało się zaktualizować nazwy użytkownika: ${e}`);
            return -1;
        }
    }

    async UpdateAvatar(id, blob) {
        try {
            const sql = `UPDATE users SET avatar = ? WHERE id = ?`;

            const [rows] = await this.db.execute(sql, [blob, id]);
            return rows.affectedRows;
        }
        catch(e) {
            console.error(`ERROR: Nie udało się zaktualizować avatara: ${e}`);
            return -1;
        }
    }

    async DeleteAvatar(id) {
        try {
            const sql = `UPDATE users SET avatar = NULL WHERE id = ?`;

            const [rows] = await this.db.execute(sql, [id]);
            return rows.affectedRows;
        }
        catch(e) {
            console.error(`ERROR: Nie udało się skasować avatara: ${e}`);
            return -1;
        }
    }

    async CheckEmail(email) {
        try {
            const sql = `SELECT NULL FROM users WHERE email = ?`;
            const [rows] = this.db.execute(sql, email);

            if (rows > 0) {
                return true;
            }
            return false;
        }
        catch(e) {
            console.error(`ERROR: Nie udało się sprawdzić email: ${e}`);
            return false;
        }
    }
}

module.exports = new UserRepository();