import fs from "fs";
import _ from "lodash";
import nodemailer from "nodemailer";
import Mail from "nodemailer/lib/mailer";
import SMTPTransport from "nodemailer/lib/smtp-transport";

export type HandleNodemailerParam = Mail.Options & {
    senderName?: string;
    alias?: string | null;
    options?: SMTPTransport.Options;
};

/**
 * # Handle mails With Nodemailer
 */
export default async function handleNodemailer(
    params: HandleNodemailerParam
): Promise<SMTPTransport.SentMessageInfo | undefined> {
    if (
        !process.env.DSQL_MAIL_HOST ||
        !process.env.DSQL_MAIL_EMAIL ||
        !process.env.DSQL_MAIL_PASSWORD
    ) {
        return undefined;
    }

    let transporter = nodemailer.createTransport({
        host: process.env.DSQL_MAIL_HOST,
        port: 465,
        secure: true,
        auth: {
            user: process.env.DSQL_MAIL_EMAIL,
            pass: process.env.DSQL_MAIL_PASSWORD,
        },
        ...params.options,
    });

    const sender = (() => {
        if (params.alias?.match(/support/i)) return process.env.DSQL_MAIL_EMAIL;
        return process.env.DSQL_MAIL_EMAIL;
    })();

    const mailRootPath = process.env.DSQL_MAIL_ROOT || "./email/index.html";

    let mailRoot = fs.existsSync(mailRootPath)
        ? fs.readFileSync(mailRootPath, "utf8")
        : undefined;

    let finalHtml = mailRoot
        ? mailRoot
              .replace(/{{email_body}}/, params.html?.toString() || "")
              .replace(/{{issue_date}}/, Date().substring(0, 24))
        : params.html?.toString();

    try {
        let mailObject: any = {};

        mailObject["from"] = `"${
            params.senderName || "Datasquirel"
        }" <${sender}>`;
        mailObject["sender"] = sender;
        if (params.alias) mailObject["replyTo"] = sender;
        mailObject["to"] = params.to;
        mailObject["subject"] = params.subject;
        mailObject["text"] = params.text;
        mailObject["html"] = finalHtml;

        let info = await transporter.sendMail({
            ..._.omit(mailObject, ["alias", "senderName", "options"]),
            ...mailObject,
        });

        return info;
    } catch (error: any) {
        console.log("ERROR in handleNodemailer Function =>", error.message);
    }

    return undefined;
}