import db from '../db.js'
import statuses from '../utils/status.js';
import bcrypt from 'bcrypt';

class UserService {
    async create(username, password) {
        await db.query("INSERT INTO users (username, password) VALUES ($1, $2)", [username, bcrypt.hashSync(password, 12)]).catch((e) => {
            errorHandler(e, "user");
        })
        return statuses.ok;
    }

    async getByUsername(username) {
        let user = (await db.query("SELECT * FROM Users WHERE username = $1", [username])).rows;
        if (user == undefined) return statuses.not_found;
        return (user[0]);
    }

    async getAll() {
        return (await db.query("SELECT * FROM Users")).rows;
    }

    async isInGroup(userId, groupId) {
        return (await db.query("SELECT * FROM Users WHERE ID = $1 AND $2 = ANY(groups)", [userId, groupId])).rowCount > 0;
    }

    async joinGroup(userId, groupId) {
        if (await (this.isInGroup(userId, groupId))) return statuses.duplicate;
        await db.query("UPDATE Users SET groups = array_append(groups, $1::integer) WHERE ID = $2", [groupId, userId]);
        return statuses.ok;
    }
}

export default new UserService();