// @ts-check

const generator = require("generate-password");
const DB_HANDLER = require("../../utils/backend/global-db/DB_HANDLER");
const NO_DB_HANDLER = require("../../utils/backend/global-db/NO_DB_HANDLER");
const addDbEntry = require("./db/addDbEntry");
const encrypt = require("../dsql/encrypt");
const LOCAL_DB_HANDLER = require("../../utils/backend/global-db/LOCAL_DB_HANDLER");

/**
 * # Add Mariadb User
 *
 * @description this function adds a Mariadb user to the database server
 *
 * @param {object} params - parameters object *
 * @param {number | string} params.userId - invited user object
 * @param {boolean} [params.useLocal]
 *
 * @returns {Promise<any>} new user auth object payload
 */
module.exports = async function addMariadbUser({ userId, useLocal }) {
    try {
        const defaultMariadbUserHost = process.env.DSQL_DB_HOST || "127.0.0.1";

        const username = `dsql_user_${userId}`;
        const password = generator.generate({
            length: 16,
            numbers: true,
            symbols: true,
            uppercase: true,
            exclude: "*#.'`\"",
        });
        const encryptedPassword = encrypt({ data: password });

        const createMariadbUsersQuery = `CREATE USER IF NOT EXISTS '${username}'@'127.0.0.1' IDENTIFIED BY '${password}'`;

        if (useLocal) {
            await LOCAL_DB_HANDLER(createMariadbUsersQuery);
        } else {
            await NO_DB_HANDLER(createMariadbUsersQuery);
        }

        const updateUserQuery = `UPDATE users SET mariadb_user = ?, mariadb_host = '127.0.0.1', mariadb_pass = ? WHERE id = ?`;
        const updateUserValues = [username, encryptedPassword, userId];

        const updateUser = useLocal
            ? await LOCAL_DB_HANDLER(updateUserQuery, updateUserValues)
            : await DB_HANDLER(updateUserQuery, updateUserValues);

        const addMariadbUser = await addDbEntry({
            tableName: "mariadb_users",
            data: {
                user_id: userId,
                username,
                host: defaultMariadbUserHost,
                password: encryptedPassword,
                primary: "1",
                grants: '[{"database":"*","table":"*","privileges":["ALL"]}]',
            },
            dbContext: "Master",
            useLocal,
        });

        console.log(`User ${userId} SQL credentials successfully added.`);
    } catch (/** @type {any} */ error) {
        console.log(
            `Error in adding SQL user in 'addMariadbUser' function =>`,
            error.message
        );
    }
};

////////////////////////////////////////////////
////////////////////////////////////////////////
////////////////////////////////////////////////
