// @ts-check
const mailService = require('../mail');
const ghostMailer = new mailService.GhostMailer();
const common = require('../../lib/common');

/**
 * An email address
 * @typedef { string } EmailAddress
 */

/**
 * An object representing an email to send
 * @typedef { Object } Email
 * @property { string } html - The html content of the email
 * @property { string } subject - The subject of the email
 */

module.exports = {
    /**
     * @param {Email} message - The message to send
     * @param {[EmailAddress]} recipients - the recipients to send the email to
     * @param {[object]} recipientData - list of data keyed by email to inject into the email
     * @returns {Promise<boolean>} A promise representing the success of the email sending
     */
    async send(message, recipients, recipientData) {
        for (const recipient of recipients) {
            const messageToSend = Object.assign({}, message, {
                to: recipient
            });
            let unsubscribeUrl = '';
            if (recipientData && recipientData[recipient]) {
                unsubscribeUrl = recipientData[recipient].unsubscribe_url;
            }
            messageToSend.html = messageToSend.html.replace('%recipient.unsubscribe_url%', unsubscribeUrl);
            try {
                await ghostMailer.send(messageToSend);
            } catch (err) {
                // @TODO log this somewhere with state?
                common.logging.warn(`Oh no! an email failed to send :( ${recipient}`);
            }
        }
        return true;
    }
};