package bo.gotthardt.email.sendgrid;

import bo.gotthardt.email.EmailService;
import bo.gotthardt.email.EmailServiceConfiguration;
import com.codahale.metrics.MetricRegistry;
import com.google.common.base.Strings;
import com.sendgrid.SendGrid;
import com.sendgrid.SendGridException;
import lombok.extern.slf4j.Slf4j;

import javax.inject.Inject;

/**
 * Email service that uses SendGrid.
 *
 * @author Bo Gotthardt
 */
@Slf4j
public class SendGridEmailService implements EmailService {
    private final EmailServiceConfiguration config;
    private final SendGrid sendGrid;
    private final MetricRegistry metrics;

    @Inject
    public SendGridEmailService(HasSendGridConfiguration config, MetricRegistry metrics) {
        this.config = config.getEmail();
        this.metrics = metrics;
        this.sendGrid = new SendGrid(config.getSendGrid().getUsername(), config.getSendGrid().getPassword());
    }

    @Override
    public void send(String toAddress, String subject, String htmlContent) {
        SendGrid.Email email = new SendGrid.Email();
        email.setSubject(subject);
        email.setHtml(htmlContent);

        email.setFrom(config.getFromEmail());
        email.setFromName(config.getFromName());

        if (!Strings.isNullOrEmpty(config.getOverrideReceiver())) {
            email.addTo(config.getOverrideReceiver());
        } else {
            email.addTo(toAddress);
        }

        try {
            SendGrid.Response response = sendGrid.send(email);

            if (!response.getStatus()) {
                metrics.meter(MetricRegistry.name("email", "send", "failure", toMetricName(toAddress))).mark();
                log.error("Error sending email via SendGrid:", response.getMessage());
            } else {
                metrics.meter(MetricRegistry.name("email", "send", "success", toMetricName(toAddress))).mark();
            }
        } catch (SendGridException e) {
            metrics.meter(MetricRegistry.name("email", "send", "failure", toMetricName(toAddress))).mark();
            log.error("Error sending email via SendGrid:", e);
        }
    }

    private static String toMetricName(String email) {
        return email.replace(".", "-"); // TODO This probably needs to be more comprehensive.
    }
}