// @ts-check

const LOCAL_DB_HANDLER = require("../../../utils/backend/global-db/LOCAL_DB_HANDLER");
const varDatabaseDbHandler = require("../../backend/varDatabaseDbHandler");
const nodemailer = require("nodemailer");

/**
 * # Send Email Login Code
 *
 * @param {object} param
 * @param {string} param.email
 * @param {string} param.database
 * @param {string} [param.email_login_field]
 * @param {string} [param.mail_domain]
 * @param {number} [param.mail_port]
 * @param {string} [param.sender]
 * @param {string} [param.mail_username]
 * @param {string} [param.mail_password]
 * @param {string} param.html
 * @param {boolean} [param.useLocal]
 *
 * @returns {Promise<{success: boolean, msg?: string}>}
 */
module.exports = async function apiSendEmailCode({
    email,
    database,
    email_login_field,
    mail_domain,
    mail_port,
    sender,
    mail_username,
    mail_password,
    html,
    useLocal,
}) {
    if (email?.match(/ /)) {
        return {
            success: false,
            msg: "Invalid Email/Password format",
        };
    }

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

    const foundUserQuery = `SELECT * FROM users WHERE email = ?`;
    const foundUserValues = [email];

    let foundUser = await varDatabaseDbHandler({
        queryString: foundUserQuery,
        queryValuesArray: foundUserValues,
        database,
        useLocal,
    });

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

    if (!foundUser || !foundUser[0]) {
        return {
            success: false,
            msg: "No user found",
        };
    }

    function generateCode() {
        const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        let code = "";
        for (let i = 0; i < 8; i++) {
            code += chars[Math.floor(Math.random() * chars.length)];
        }
        return code;
    }

    if (foundUser && foundUser[0] && email_login_field) {
        const tempCode = generateCode();

        let transporter = nodemailer.createTransport({
            host: mail_domain || process.env.DSQL_MAIL_HOST,
            port: mail_port || 465,
            secure: true,
            auth: {
                user: mail_username || process.env.DSQL_MAIL_EMAIL,
                pass: mail_password || process.env.DSQL_MAIL_PASSWORD,
            },
        });

        let mailObject = {};

        mailObject["from"] = `"Datasquirel SSO" <${
            sender || "support@datasquirel.com"
        }>`;
        mailObject["sender"] = sender || "support@datasquirel.com";
        mailObject["to"] = email;
        mailObject["subject"] = "One Time Login Code";
        mailObject["html"] = html.replace(/{{code}}/, tempCode);

        const info = await transporter.sendMail(mailObject);

        if (!info?.accepted) throw new Error("Mail not Sent!");

        const setTempCodeQuery = `UPDATE users SET ${email_login_field} = ? WHERE email = ?`;
        const setTempCodeValues = [tempCode + `-${Date.now()}`, email];

        let setTempCode = await varDatabaseDbHandler({
            queryString: setTempCodeQuery,
            queryValuesArray: setTempCodeValues,
            database: database,
            useLocal,
        });
    }

    return {
        success: true,
        msg: "Success",
    };
};
