package eu.dnetlib.goldoa.service.utils;

import eu.dnetlib.goldoa.domain.BudgetInfo;
import eu.dnetlib.goldoa.domain.Comment;
import eu.dnetlib.goldoa.domain.Person;
import eu.dnetlib.goldoa.domain.Publisher;
import eu.dnetlib.goldoa.domain.RequestInfo;
import eu.dnetlib.goldoa.domain.Role;
import eu.dnetlib.goldoa.service.CurrencyConverter;
import eu.dnetlib.goldoa.service.dao.PersonDAO;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;

import javax.mail.MessagingException;
import java.text.SimpleDateFormat;
import java.util.List;

/**
 * Created by antleb on 3/9/15.
 */
public class EmailUtilsImpl implements EmailUtils {
	private static Logger logger = Logger.getLogger(EmailUtilsImpl.class);

	@Autowired
	PersonDAO personDAO;
	@Autowired
	private MailLibrary mailLibrary;
	@Autowired
	CurrencyConverter currencyConverter;

	private String baseAddress;
	private String termsOfAgreementUrl;
	String contactLink = "postgrantpilotinfo@openaire.eu";

	@Override
	public void sendActivationEmail(Person user, String token) throws MessagingException {
		String link = baseAddress + "/GoldOAPortal.html?token=" + token + "&email=" + user.getEmail() + "#activate";
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] Account activation";

		String message = "Dear " + user.getName() + " " + user.getLastname() + ",\n" +
				"Welcome to the OpenAIRE FP7 post-grant Gold OA Pilot service, \n" +
				"\n" +
				"Thank you for signing up. To verify your account, please click on the link below:\n" +
				link + "\n" +
				"\n" +
				"Best,\n" +
				"The OpenAIRE team";

		mailLibrary.sendEmail(user.getEmail(), subject, message);
	}

	@Override
	public void sendResetPasswordEmail(Person user, String password) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] New password";
		String message = "Dear " + user.getName() + " " + user.getLastname() + ",\n" +
				"Your new password is '" + password + "'. You can change it to one of your liking by editing your profile.\n" +
				"\n" +
				"Best,\n" +
				"The OpenAIRE team";

		mailLibrary.sendEmail(user.getEmail(), subject, message);
	}

	@Override
	public void sendRequesterOKEmail(RequestInfo requestInfo) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] Your funding request at " + new SimpleDateFormat("yyyy-MM-dd").format(requestInfo.getDate());
		String link = baseAddress + "/#existingFundingRequests";

		String text = "Dear " + requestInfo.getUser().getName() + " " + requestInfo.getUser().getLastname() + ",\n" +
				"\n" +
				"We have received a request to fund for the following:\n" +
				"\n" +
				"Project: " + requestInfo.getProject().getAcronym() + " - " + requestInfo.getProject().getGrant() + "\n" +
				"Publication: " + requestInfo.getPublication().getTitle() + "\n"; // TODO add authors

		if (requestInfo.getPublication().getJournal() != null) {
			text += "Journal: " + requestInfo.getPublication().getJournal().getTitle();

			if (requestInfo.getPublication().getJournal().getPublisher() != null)
				text += " , " + requestInfo.getPublication().getJournal().getPublisher().getName();

			text += "\n";
		} else if (requestInfo.getPublication().getPublisher() != null)
			text += "Publisher: " + requestInfo.getPublication().getPublisher().getName() + "\n";

		text += "Requested funding: " + requestInfo.getFundingRequested() + " " + requestInfo.getCurrency().getName() + "\n" +
				"\n" +
				"At a first glance it seems that this is an eligible request and it will be processed asap. We will notify you if you need to take further actions and we will you keep you posted on its status.\n" +
				"\n" +
				"You may click on the link below at any time to follow the status of your request:\n" +
				link + "\n" +
				" \n" +
				"Best,\n" +
				"The OpenAIRE team";

		mailLibrary.sendEmail(requestInfo.getUser().getEmail(), subject, text);
	}

	@Override
	public void sendModeratorOKEmail(RequestInfo requestInfo, Person moderator) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] New funding request (" + requestInfo.getId() + ")";
		String link = baseAddress + "/#monitorFundingRequests";


		String text = "Dear moderator,\n" +
				"\n" +
				"We have received a request to fund for the following:\n" +
				"\n" +
				"Project: " + requestInfo.getProject().getAcronym() + " - " + requestInfo.getProject().getGrant() + "\n" +
				"Publication: " + requestInfo.getPublication().getTitle() + "\n"; // TODO add authors

		if (requestInfo.getPublication().getJournal() != null) {
			text += "Journal: " + requestInfo.getPublication().getJournal().getTitle();

			if (requestInfo.getPublication().getJournal().getPublisher() != null)
				text += " , " + requestInfo.getPublication().getJournal().getPublisher().getName();

			text += "\n";
		} else if (requestInfo.getPublication().getPublisher() != null)
			text += "Publisher: " + requestInfo.getPublication().getPublisher().getName() + "\n";

		text += "Requested funding: " + requestInfo.getFundingRequested() + " " + requestInfo.getCurrency().getName() + "\n" +
				"\n" +
				"At a first glance it seems that this is an eligible request. Please visit the link below to validate and process the request:\n" +
				link + "\n" +
				" \n" +
				"Best,\n" +
				"The OpenAIRE team";

		mailLibrary.sendEmail(moderator.getEmail(), subject, text);
	}

	@Override
	public void sendRequesterIFFYEmail(RequestInfo requestInfo) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] Your funding request at " + new SimpleDateFormat("yyyy-MM-dd").format(requestInfo.getDate());

		String text = "Hello " + requestInfo.getUser().getName() + ",\n" +
				" your request will be processed soon.The terms of agreement can be found here: " + termsOfAgreementUrl + "\n" +
				" The OpenAIRE Gold Open Access team.";

		mailLibrary.sendEmail(requestInfo.getUser().getEmail(), subject, text);
	}

	@Override
	public void sendModeratorIFFYEmail(RequestInfo requestInfo, Person moderator) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] New funding request (" + requestInfo.getId() + ")";
		String link = baseAddress + "/#monitorFundingRequests";


		String text = "Dear moderator,\n" +
				"\n" +
				"A new request has been submitted that needs your intervention:\n" +
				"\n" +
				"Project: " + requestInfo.getProject().getAcronym() + " - " + requestInfo.getProject().getGrant() + "\n" +
				"Publication: " + requestInfo.getPublication().getTitle() + "\n"; // TODO add authors

		if (requestInfo.getPublication().getJournal() != null) {
			text += "Journal: " + requestInfo.getPublication().getJournal().getTitle();

			if (requestInfo.getPublication().getJournal().getPublisher() != null)
				text += " , " + requestInfo.getPublication().getJournal().getPublisher().getName();

			text += "\n";
		} else if (requestInfo.getPublication().getPublisher() != null)
			text += "Publisher: " + requestInfo.getPublication().getPublisher().getName() + "\n";

		text += "Requested funding: " + requestInfo.getFundingRequested() + " " + requestInfo.getCurrency().getName() + "\n" +
				"\n" +
				"At a first glance it seems that this is an eligible request. Please visit the link below to validate and process the request:\n" +
				link + "\n" +
				" \n" +
				"Best,\n" +
				"The OpenAIRE team";

		mailLibrary.sendEmail(moderator.getEmail(), subject, text);
	}

	@Override
	public void sendRequesterInitiallyApprovedEmail(RequestInfo requestInfo) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] Your funding request at " + new SimpleDateFormat("yyyy-MM-dd").format(requestInfo.getDate()) + " has been initially approved";
		String link = baseAddress + "/#existingFundingRequests";
		String text = "Dear " + requestInfo.getUser().getName() + " " + requestInfo.getUser().getLastname() + ",\n" +
				"\n" +
				"The following request is eligible and has been initially approved for funding but you must edit it before its final approval. Please, see the moderator's comments below.\n" +
				"\n" +
				"Project: " + requestInfo.getProject().getAcronym() + " - " + requestInfo.getProject().getGrant() + "\n" +
				"Publication: " + requestInfo.getPublication().getTitle() + "\n"; // TODO add authors

		if (requestInfo.getPublication().getJournal() != null) {
			text += "Journal: " + requestInfo.getPublication().getJournal().getTitle();

			if (requestInfo.getPublication().getJournal().getPublisher() != null)
				text += " , " + requestInfo.getPublication().getJournal().getPublisher().getName();

			text += "\n";
		} else if (requestInfo.getPublication().getPublisher() != null)
			text += "Publisher: " + requestInfo.getPublication().getPublisher().getName() + "\n";

		text += "Requested funding: " + requestInfo.getFundingRequested() + " " + requestInfo.getCurrency().getName() + "\n" +
				"\n" +
				"If no invoice has been uploaded, or the publisher bank information is missing, our accounting office may put the request on hold until all information is in the system.\n" +
				"\n";

		text += formatComments(requestInfo);
		text += "You may click on the link below at any time to follow the status of your request:\n" +
				link + "\n" +
				" \n" +
				"Best,\n" +
				"The OpenAIRE team";

		mailLibrary.sendEmail(requestInfo.getUser().getEmail(), subject, text);
	}

	@Override
	public void sendRequesterApprovedEmail(RequestInfo requestInfo) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] Your funding request at " + new SimpleDateFormat("yyyy-MM-dd").format(requestInfo.getDate()) + " has been approved";
		String link = baseAddress + "/#existingFundingRequests";
		String text = "Dear " + requestInfo.getUser().getName() + " " + requestInfo.getUser().getLastname() + ",\n" +
				"\n" +
				"The following request is eligible and has been approved for funding:\n" +
				"\n" +
				"Project: " + requestInfo.getProject().getAcronym() + " - " + requestInfo.getProject().getGrant() + "\n" +
				"Publication: " + requestInfo.getPublication().getTitle() + "\n"; // TODO add authors

		if (requestInfo.getPublication().getJournal() != null) {
			text += "Journal: " + requestInfo.getPublication().getJournal().getTitle();

			if (requestInfo.getPublication().getJournal().getPublisher() != null)
				text += " , " + requestInfo.getPublication().getJournal().getPublisher().getName();

			text += "\n";
		} else if (requestInfo.getPublication().getPublisher() != null)
			text += "Publisher: " + requestInfo.getPublication().getPublisher().getName() + "\n";

		text += "Requested funding: " + requestInfo.getFundingRequested() + " " + requestInfo.getCurrency().getName() + "\n" +
				"\n" +
				"If no invoice has been uploaded, or the publisher bank information is missing, our accounting office may put the request on hold until all information is in the system.\n" +
				"\n";

		text += formatComments(requestInfo);
		text += "You may click on the link below at any time to follow the status of your request:\n" +
				link + "\n" +
				" \n" +
				"Best,\n" +
				"The OpenAIRE team";

		mailLibrary.sendEmail(requestInfo.getUser().getEmail(), subject, text);
	}

	@Override
	public void sendRequesterRejectedEmail(RequestInfo requestInfo) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] Your funding request at " + new SimpleDateFormat("yyyy-MM-dd").format(requestInfo.getDate()) + " has been rejected";
		String link = baseAddress + "/#existingFundingRequests";

		String text = "Dear " + requestInfo.getUser().getName() + " " + requestInfo.getUser().getLastname() + ",\n" +
				"\n" +
				"The following request has been rejected:\n" +
				"\n" +
				"Project: " + requestInfo.getProject().getAcronym() + " - " + requestInfo.getProject().getGrant() + "\n" +
				"Publication: " + requestInfo.getPublication().getTitle() + "\n"; // TODO add authors

		if (requestInfo.getPublication().getJournal() != null) {
			text += "Journal: " + requestInfo.getPublication().getJournal().getTitle();

			if (requestInfo.getPublication().getJournal().getPublisher() != null)
				text += " , " + requestInfo.getPublication().getJournal().getPublisher().getName();

			text += "\n";
		} else if (requestInfo.getPublication().getPublisher() != null)
			text += "Publisher: " + requestInfo.getPublication().getPublisher().getName() + "\n";

		text += "Requested funding: " + requestInfo.getFundingRequested() + " " + requestInfo.getCurrency().getName() + "\n" +
				"\n";
		text += formatComments(requestInfo);
		text += "You may click on the link below at any time to find more information:\n" +
				link + "\n" +
				" \n" +
				"Best,\n" +
				"The OpenAIRE team";

		mailLibrary.sendEmail(requestInfo.getUser().getEmail(), subject, text);
	}

	@Override
	public void sendModeratorNewBudgetEmail(Person moderator, BudgetInfo budgetInfo) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] New budget request";

		String text = "Hello " + moderator.getName() + ",\n" +
				" A new budget request by " + budgetInfo.getUser().getName() + " " + budgetInfo.getUser().getLastname() + " has been submitted!\n" +
				" The OpenAIRE Gold Open Access team.";

		mailLibrary.sendEmail(new String[]{moderator.getEmail()}, subject, text);
	}

	@Override
	public void sendUserNewBudgetEmail(BudgetInfo budgetInfo) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] New budget request";

		String text = "Hello " + budgetInfo.getUser().getName() + ",\n" +
				" Your budget request has been submitted. We'll process it as soon as possible!\n" +
				" The OpenAIRE Gold Open Access team.";

		mailLibrary.sendEmail(new String[]{budgetInfo.getUser().getEmail()}, subject, text);
	}

	@Override
	public void sendUserAcceptedBudgetEmail(BudgetInfo budgetInfo) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] Your budget request";

		String text = "Hello " + budgetInfo.getUser().getName() + ",\n" +
				" Your budget request has been accepted! Spend them wisely!\n" +
				" The OpenAIRE Gold Open Access team.";

		mailLibrary.sendEmail(new String[]{budgetInfo.getUser().getEmail()}, subject, text);
	}

	@Override
	public void sendModeratorAcceptedBudgetEmail(Person moderator, BudgetInfo budgetInfo) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] Budget request accepted";

		String text = "Hello " + moderator.getName() + ",\n" +
				" A budget request  by " + budgetInfo.getUser().getName() + " " + budgetInfo.getUser().getLastname() + " has been accepted!\n" +
				" The OpenAIRE Gold Open Access team.";

		mailLibrary.sendEmail(new String[]{moderator.getEmail()}, subject, text);
	}

	@Override
	public void sendUserRejectedBudgetEmail(BudgetInfo budgetInfo) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] Your budget request";

		String text = "Hello " + budgetInfo.getUser().getName() + ",\n" +
				" Your budget request has been rejected :(\n" +
				" The OpenAIRE Gold Open Access team.";

		mailLibrary.sendEmail(new String[]{budgetInfo.getUser().getEmail()}, subject, text);
	}

	@Override
	public void sendModeratorRejectedBudgetEmail(Person moderator, BudgetInfo budgetInfo) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] Budget request rejected";

		String text = "Hello " + moderator.getName() + ",\n" +
				" A budget request  by " + budgetInfo.getUser().getName() + " " + budgetInfo.getUser().getLastname() + " has been rejected.\n" +
				" The OpenAIRE Gold Open Access team.";

		mailLibrary.sendEmail(new String[]{moderator.getEmail()}, subject, text);
	}

	@Override
	public void sendUserRoleAcceptedEmail(Person person, Role role) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] " + role.getName() + " status granted";

		String text = "Dear " + person.getName() + " " + person.getLastname() + ",\n" +
				"\n" +
				"You have been upgraded/granted to the " + role.getName() + " status.\n" +
				"\n" +
				"Best,\n" +
				"The OpenAIRE team";

		mailLibrary.sendEmail(new String[]{person.getEmail()}, subject, text);
	}

	@Override
	public void sendModeratorRoleAcceptedEmail(Person moderator, Person user, Role role) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] " + role.getName() + " status granted to user " + user.getName() + " " + user.getLastname();

		String text = "Dear moderator,\n" +
				"\n" +
				"User " + user.getName() + " " + user.getLastname();
		if (user.getAffiliations().size() > 0 && user.getAffiliations().get(0).getOrganization() != null && user.getAffiliations().get(0).getOrganization().getName() != null)
			text += " from organization " + user.getAffiliations().get(0).getOrganization().getName();
		text += " has been upgraded/granted the " + role.getName() + " status.\n" +
				" \n" +
				"Best,\n" +
				"The OpenAIRE team";

		mailLibrary.sendEmail(new String[]{moderator.getEmail()}, subject, text);
	}

	@Override
	public void sendUserRoleRejectedEmail(Person person, Role role) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] " + role.getName() + " status not granted";
		// TODO use contact us link when ready
		String link = baseAddress + "/#home";

		String text = "Dear " + person.getName() + " " + person.getLastname() + ",\n" +
				"\n" +
				"You have not been upgraded/granted the " + role.getName() + " status.\n" +
				"\n" +
				"Contact us at " + link + " if you need further information.\n" +
				" \n" +
				"Best,\n" +
				"The OpenAIRE team";

		mailLibrary.sendEmail(new String[]{person.getEmail()}, subject, text);
	}

	@Override
	public void sendModeratorRoleRejectedEmail(Person moderator, Person user, Role role) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] " + role.getName() + " status NOT granted to user " + user.getName() + " " + user.getLastname();

		String text = "Dear moderator,\n" +
				"\n" +
				"User " + user.getName() + " " + user.getLastname();
		if (user.getAffiliations().size() > 0 && user.getAffiliations().get(0).getOrganization() != null && user.getAffiliations().get(0).getOrganization().getName() != null)
			text += " from organization " + user.getAffiliations().get(0).getOrganization().getName();
		text += "has not been upgraded/granted the " + role.getName() + " status.\n" +
				" \n" +
				"Best,\n" +
				"The OpenAIRE team";

		mailLibrary.sendEmail(new String[]{moderator.getEmail()}, subject, text);
	}

	@Override
	public void sendUserRoleRequestedEmail(Person person, List<Role> roles) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] ";
		for (Role role : roles) {
			subject += role.getName() + ", ";
		}
		subject = subject.substring(0, subject.length() - 2);
		subject += " status upgrade requested";
		// TODO use contact us link when ready
		String link = baseAddress + "/#home";

		String text = "Dear " + person.getName() + " " + person.getLastname() + ",\n" +
				"\n" +
				"You have requested to upgrade your status to ";
		for (Role role : roles) {
			text += role.getName() + ", ";
		}
		text = text.substring(0, text.length() - 2);
		text += "\n" +
				"We will process your request asap.\n" +
				"\n" +
				"If you don't hear us from us within the next few days, or need further information do not hesitate to contact us at " + link + ".\n" +
				" \n" +
				"Best,\n" +
				"The OpenAIRE team";

		mailLibrary.sendEmail(new String[]{person.getEmail()}, subject, text);
	}

	@Override
	public void sendModeratorRoleRequestedEmail(Person moderator, Person user, List<Role> roles) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] ";
		for (Role role : roles) {
			subject += role.getName() + ", ";
		}
		subject = subject.substring(0, subject.length() - 2);
		subject += " status upgrade requested by user " + user.getName() + " " + user.getLastname();

		String text = "Dear moderator,\n" +
				"\n" +
				"User " + user.getName() + " " + user.getLastname();
		if (user.getAffiliations().size() > 0 && user.getAffiliations().get(0).getOrganization() != null && user.getAffiliations().get(0).getOrganization().getName() != null)
			text += " from organization " + user.getAffiliations().get(0).getOrganization().getName();
		text += " has requested to upgraded/be granted the ";
		for (Role role : roles) {
			text += role.getName() + ", ";
		}
		text = text.substring(0, text.length() - 2);
		text += " status.\n\n" +
				"Best,\n" +
				"The OpenAIRE team";

		mailLibrary.sendEmail(new String[]{moderator.getEmail()}, subject, text);
	}

	@Override
	public void sendRequesterInvoiceNotification(RequestInfo requestInfo) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] Your funding request " + requestInfo.getId() + " - missing invoice";
		// TODO use contact us link when ready
		String requestLink = baseAddress + "/#existingFundingRequests";

		String text = "Dear " + requestInfo.getUser().getName() + " " + requestInfo.getUser().getLastname() + ",\n" +
				"\n" +
				"The following request has been approved for funding but we are missing the invoice:\n" +
				"\n" +
				"Project: " + requestInfo.getProject().getAcronym() + " - " + requestInfo.getProject().getGrant() + "\n" +
				"Publication: " + requestInfo.getPublication().getTitle() + "\n"; // TODO add authors

		if (requestInfo.getPublication().getJournal() != null) {
			text += "Journal: " + requestInfo.getPublication().getJournal().getTitle();

			if (requestInfo.getPublication().getJournal().getPublisher() != null)
				text += " , " + requestInfo.getPublication().getJournal().getPublisher().getName();

			text += "\n";
		} else if (requestInfo.getPublication().getPublisher() != null)
			text += "Publisher: " + requestInfo.getPublication().getPublisher().getName() + "\n";

		text += "Requested funding: " + requestInfo.getFundingRequested() + " " + requestInfo.getCurrency().getName() + "\n" +
				"\n" +
				"Please make sure that either you or the publisher uploads the invoice in our system. Unless you do so, the request will be left in a pending state.\n" +
				"\n" +
				"All invoices must be addressed to: \n" +
				"\"\"Athena\"\" Research Centre\n" +
				"Artemidos 6 & Epidavrou\n" +
				"GR-151 25, Athens - GREECE\n" +
				"Phone: +30 210 6875 300 Fax +30 210 6875 485\n" +
				"VAT NUMBER: EL999723442\n" +
				"\n";
		text += formatComments(requestInfo);
		text += "Click on the link below at any time to follow the status of your request:\n" +
				requestLink + "\n" +
				"\n" +
				"Feel free to contact us at " + contactLink + " if you need further information.\n" +
				" \n" +
				"Best,\n" +
				"The OpenAIRE team";

		mailLibrary.sendEmail(new String[]{requestInfo.getUser().getEmail()}, subject, text);
	}

	@Override
	public void sendPublisherInvoiceNotification(RequestInfo requestInfo) throws MessagingException {
		Publisher publisher = requestInfo.getPublication().getPublisher() != null ? requestInfo.getPublication().getPublisher() : requestInfo.getPublication().getJournal().getPublisher();
		String publisherEmail = null;

		if (requestInfo.getPublisherEmail() != null)
			publisherEmail = requestInfo.getPublisherEmail();
		else {
			if (publisher != null)
				publisherEmail = publisher.getEmail();
		}

		if (publisherEmail != null) {
			String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] Funding request " + requestInfo.getId() + " - missing invoice";
			// TODO use contact us link when ready
			String requestLink = baseAddress + "/#existingFundingRequests";
			Person contact;
			String text;

			if (publisher != null && publisher.getContact() != null && publisher.getContact().getId() != null) {
				contact = personDAO.getPersonById(publisher.getContact().getId());
				text = "Dear " + contact.getName() + " " + contact.getLastname() + ",\n";
			} else {
				text = "Dear Madame/Sir,\n";
			}

			text += "The following request by " + requestInfo.getUser().getName() + " " + requestInfo.getUser().getLastname() + " has been approved for funding but we are missing the invoice:\n" +
					"\n" +
					"Project: " + requestInfo.getProject().getAcronym() + " - " + requestInfo.getProject().getGrant() + "\n" +
					"Publication: " + requestInfo.getPublication().getTitle() + "\n"; // TODO add authors

			if (requestInfo.getPublication().getJournal() != null) {
				text += "Journal: " + requestInfo.getPublication().getJournal().getTitle();

				if (requestInfo.getPublication().getJournal().getPublisher() != null)
					text += " , " + requestInfo.getPublication().getJournal().getPublisher().getName();

				text += "\n";
			} else if (requestInfo.getPublication().getPublisher() != null)
				text += "Publisher: " + requestInfo.getPublication().getPublisher().getName() + "\n";

			text += "Requested funding: " + requestInfo.getFundingRequested() + " " + requestInfo.getCurrency().getName() + "\n" +
					"\n" +
					"If you haven't done so already, sign in our system and see how to upload the invoice. Unless you or do so, the request will be left in a pending state.\n" +
					"\n" +
					"All invoices must be addressed to: \n" +
					"\"\"Athena\"\" Research Centre\n" +
					"Artemidos 6 & Epidavrou\n" +
					"GR-151 25, Athens - GREECE\n" +
					"Phone: +30 210 6875 300 Fax +30 210 6875 485\n" +
					"VAT NUMBER: EL999723442\n" +
					"\n";

			text += formatComments(requestInfo);
			text += "Click on the link below at any time to follow the status of this request:\n" +
					requestLink + "\n" +
					"\n" +
					"Feel free to contact us at " + contactLink + " if you need further information.\n" +
					" \n" +
					"Best,\n" +
					"The OpenAIRE team";

			mailLibrary.sendEmail(new String[]{publisherEmail}, subject, text);
		}
	}

	@Override
	public void sendAccountingRequestApprovedEmail(Person person, RequestInfo requestInfo) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] Funding request " + requestInfo.getId() + " approved";
		// TODO use contact us link when ready
		String requestLink = baseAddress + "/#accountingMonitorFundingRequests";

		String text = "Dear Accounting Officer,\n" +
				"\n" +
				"The following request has been approved for funding:\n" +
				"\n" +
				"Project: " + requestInfo.getProject().getAcronym() + " - " + requestInfo.getProject().getGrant() + "\n" +
				"Publication: " + requestInfo.getPublication().getTitle() + "\n"; // TODO add authors

		if (requestInfo.getPublication().getJournal() != null) {
			text += "Journal: " + requestInfo.getPublication().getJournal().getTitle();

			if (requestInfo.getPublication().getJournal().getPublisher() != null)
				text += " , " + requestInfo.getPublication().getJournal().getPublisher().getName();

			text += "\n";
		} else if (requestInfo.getPublication().getPublisher() != null)
			text += "Publisher: " + requestInfo.getPublication().getPublisher().getName() + "\n";

		text += "Requested funding: " + requestInfo.getFundingRequested() + " " + requestInfo.getCurrency().getName() + "\n" +
				"\n";
		text += "Click on the link below to visit the publication data and related accounting info:\n" +
				requestLink + "\n" +
				"\n" +
				"Best,\n" +
				"The OpenAIRE team";

		mailLibrary.sendEmail(new String[]{person.getEmail()}, subject, text);
	}

	@Override
	public void sendRequesterPaidEmail(RequestInfo requestInfo) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] Your funding request " + requestInfo.getId() + " has been paid";

		String text = "Dear " + requestInfo.getUser().getName() + " " + requestInfo.getUser().getLastname() + ",\n" +
				"\n" +
				"The following request has been completed and APCs have been paid:\n" +
				"\n" +
				"Project: " + requestInfo.getProject().getAcronym() + " - " + requestInfo.getProject().getGrant() + "\n" +
				"Publication: " + requestInfo.getPublication().getTitle() + "\n"; // TODO add authors

		if (requestInfo.getPublication().getJournal() != null) {
			text += "Journal: " + requestInfo.getPublication().getJournal().getTitle();

			if (requestInfo.getPublication().getJournal().getPublisher() != null)
				text += " , " + requestInfo.getPublication().getJournal().getPublisher().getName();

			text += "\n";
		} else if (requestInfo.getPublication().getPublisher() != null)
			text += "Publisher: " + requestInfo.getPublication().getPublisher().getName() + "\n";

		text += "Requested funding: " + requestInfo.getFundingRequested() + " " + requestInfo.getCurrency().getName() + "\n" +
				"\n";
		text += "APC paid: " + requestInfo.getApc_paid() + " Euro\n";
		text += "Additional costs: " + (requestInfo.getOther_cost() + requestInfo.getTransfer_cost()) + " Euro\n";
		text += "Bank Transfer Document: " + baseAddress + "/GoldOAPortal/bankTransfer?requestId=" + requestInfo.getId() + "\n\n";
		text += "Please make sure that you or the researcher\n" +
				"1. update the DOI in our system, and \n" +
				"2. deposit the final manuscript in an OpenAIRE compliant repository (see list here: " +
				"https://www.openaire.eu/search/data-providers#pubRepo#comp3#comp2plus)\n";

		text += formatComments(requestInfo);
		text += "Feel free to contact us at " + contactLink + " if you need further information.\n\n" +
				"Best,\n" +
				"The OpenAIRE team";

		mailLibrary.sendEmail(new String[]{requestInfo.getUser().getEmail()}, subject, text);
	}

	@Override
	public void sendEvaPaidEmail(String evaEmail, RequestInfo requestInfo) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] Funding request " + requestInfo.getId() + " has been paid";

		String text = "Dear Eva,\n" +
				"\n" +
				"The following request has been completed and APCs have been paid:\n" +
				"\n" +
				"Project: " + requestInfo.getProject().getAcronym() + " - " + requestInfo.getProject().getGrant() + "\n" +
				"Publication: " + requestInfo.getPublication().getTitle() + "\n"; // TODO add authors

		if (requestInfo.getPublication().getJournal() != null) {
			text += "Journal: " + requestInfo.getPublication().getJournal().getTitle();

			if (requestInfo.getPublication().getJournal().getPublisher() != null)
				text += " , " + requestInfo.getPublication().getJournal().getPublisher().getName();

			text += "\n";
		} else if (requestInfo.getPublication().getPublisher() != null)
			text += "Publisher: " + requestInfo.getPublication().getPublisher().getName() + "\n";

		text += "Requested funding: " + requestInfo.getFundingRequested() + " " + requestInfo.getCurrency().getName() + "\n" +
				"\n";
		text += "APC paid: " + requestInfo.getApc_paid() + " Euro\n";
		text += "Additional costs: " + (requestInfo.getOther_cost() + requestInfo.getTransfer_cost()) + " Euro\n\n";
		text += "Invoice: " + baseAddress + "/GoldOAPortal/invoice?invoiceId=" + requestInfo.getInvoice().getId() + "\n";
		text += "Bank Transfer Document: " + baseAddress + "/GoldOAPortal/bankTransfer?requestId=" + requestInfo.getId() + "\n\n";

		text += formatComments(requestInfo);
		text += "Feel free to contact us at " + contactLink + " if you need further information.\n\n" +
				"Best,\n" +
				"The OpenAIRE team";

		mailLibrary.sendEmail(new String[]{evaEmail}, subject, text);
	}

	@Override
	public void sendPublisherPaidEmail(RequestInfo requestInfo) throws MessagingException {
		Publisher publisher = requestInfo.getPublication().getPublisher() != null ? requestInfo.getPublication().getPublisher() : requestInfo.getPublication().getJournal().getPublisher();
		String publisherEmail = null;

		if (requestInfo.getPublisherEmail() != null)
			publisherEmail = requestInfo.getPublisherEmail();
		else {
			if (publisher != null)
				publisherEmail = publisher.getEmail();
		}

		if (publisherEmail != null) {
			String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] Funding request " + requestInfo.getId() + " for invoice " + requestInfo.getInvoice().getNumber() + " has been paid";
			String text;
			Person contact;

			if (publisher != null && publisher.getContact() != null && publisher.getContact().getId() != null) {
				contact = personDAO.getPersonById(publisher.getContact().getId());
				text = "Dear " + contact.getName() + " " + contact.getLastname() + ",\n";
			} else {
				text = "Dear Madame/Sir,\n";
			}

			text += "\n" +
					"The following request has been completed and APCs have been paid:\n" +
					"\n" +
					"Invoice #: " + requestInfo.getInvoice().getNumber() + "\n" +
					"Project: " + requestInfo.getProject().getAcronym() + " - " + requestInfo.getProject().getGrant() + "\n" +
					"Publication: " + requestInfo.getPublication().getTitle() + "\n"; // TODO add authors

			if (requestInfo.getPublication().getJournal() != null) {
				text += "Journal: " + requestInfo.getPublication().getJournal().getTitle();

				if (requestInfo.getPublication().getJournal().getPublisher() != null)
					text += " , " + requestInfo.getPublication().getJournal().getPublisher().getName();

				text += "\n";
			} else if (requestInfo.getPublication().getPublisher() != null)
				text += "Publisher: " + requestInfo.getPublication().getPublisher().getName() + "\n";

			text += "Requested funding: " + requestInfo.getFundingRequested() + " " + requestInfo.getCurrency().getName() + "\n" +
					"\n";
			text += "APC paid: " + requestInfo.getApc_paid() + " Euro\n";
			text += "Additional costs: " + (requestInfo.getOther_cost() + requestInfo.getTransfer_cost()) + " Euro\n";
			text += "Bank Transfer Document: " + baseAddress + "/GoldOAPortal/bankTransfer?requestId=" + requestInfo.getId() + "\n\n";
			text += "Please make sure that you or the researcher\n" +
					"1. update the DOI in our system, and \n" +
					"2. deposit the final manuscript in an OpenAIRE compliant repository (see list here)\n" +
					"\n";
			text += formatComments(requestInfo);
			text += "Feel free to contact us at " + contactLink + " if you need further information.\n\n" +
					"Best,\n" +
					"The OpenAIRE team";

			mailLibrary.sendEmail(new String[]{publisherEmail}, subject, text);
		}
	}

	@Override
	public void sendModeratorPaidEmail(Person moderator, RequestInfo requestInfo) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] Funding request " + requestInfo.getId() + " for invoice " + requestInfo.getInvoice().getNumber() + " has been paid";
		String text;

		text = "Dear moderator,\n";
		text += "\n" +
				"The following request has been completed and APCs have been paid:\n" +
				"\n" +
				"Invoice #: " + requestInfo.getInvoice().getNumber() + "\n" +
				"Project: " + requestInfo.getProject().getAcronym() + " - " + requestInfo.getProject().getGrant() + "\n" +
				"Publication: " + requestInfo.getPublication().getTitle() + "\n"; // TODO add authors

		if (requestInfo.getPublication().getJournal() != null) {
			text += "Journal: " + requestInfo.getPublication().getJournal().getTitle();

			if (requestInfo.getPublication().getJournal().getPublisher() != null)
				text += " , " + requestInfo.getPublication().getJournal().getPublisher().getName();

			text += "\n";
		} else if (requestInfo.getPublication().getPublisher() != null)
			text += "Publisher: " + requestInfo.getPublication().getPublisher().getName() + "\n";

		text += "Requested funding: " + requestInfo.getFundingRequested() + " " + requestInfo.getCurrency().getName() + "\n" +
				"\n";
		text += "APC paid: " + requestInfo.getApc_paid() + " Euro\n";
		text += "Additional costs: " + (requestInfo.getOther_cost() + requestInfo.getTransfer_cost()) + " Euro\n";
		text += "Bank Transfer Document: " + baseAddress + "/GoldOAPortal/bankTransfer?requestId=" + requestInfo.getId() + "\n\n";

		text += "Best,\n" +
				"The OpenAIRE team";

		mailLibrary.sendEmail(new String[]{moderator.getEmail()}, subject, text);
	}

	@Override
	public void sendRequesterOnHoldEmail(RequestInfo requestInfo) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] Your funding request " + requestInfo.getId() + " has been put on hold";
		String requestLink = baseAddress + "/#existingFundingRequests";

		String text = "Dear " + requestInfo.getUser().getName() + " " + requestInfo.getUser().getLastname() + ",\n" +
				"\n" +
				"The following request has been put on hold by our accounting office:\n" +
				"\n" +
				"Project: " + requestInfo.getProject().getAcronym() + " - " + requestInfo.getProject().getGrant() + "\n" +
				"Publication: " + requestInfo.getPublication().getTitle() + "\n"; // TODO add authors

		if (requestInfo.getPublication().getJournal() != null) {
			text += "Journal: " + requestInfo.getPublication().getJournal().getTitle();

			if (requestInfo.getPublication().getJournal().getPublisher() != null)
				text += " , " + requestInfo.getPublication().getJournal().getPublisher().getName();

			text += "\n";
		} else if (requestInfo.getPublication().getPublisher() != null)
			text += "Publisher: " + requestInfo.getPublication().getPublisher().getName() + "\n";

		text += "Requested funding: " + requestInfo.getFundingRequested() + " " + requestInfo.getCurrency().getName() + "\n" +
				"\n";
		text += formatComments(requestInfo);
		text += "Click on the link below at any time to follow the status of your request:\n" +
				requestLink + "\n" +
				"\n" +
				"Feel free to contact us at " + contactLink + " if you need further information.\n\n" +
				"Best,\n" +
				"The OpenAIRE team";

		mailLibrary.sendEmail(new String[]{requestInfo.getUser().getEmail()}, subject, text);
	}

	@Override
	public void sendModeratorOnHoldEmail(Person moderator, RequestInfo requestInfo) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] The funding request " + requestInfo.getId() + " has been put on hold";

		String text = "Dear Moderator,\n" +
				"\n" +
				"The following request has been put on hold by our accounting office:\n" +
				"\n" +
				"Project: " + requestInfo.getProject().getAcronym() + " - " + requestInfo.getProject().getGrant() + "\n" +
				"Publication: " + requestInfo.getPublication().getTitle() + "\n"; // TODO add authors

		if (requestInfo.getPublication().getJournal() != null) {
			text += "Journal: " + requestInfo.getPublication().getJournal().getTitle();

			if (requestInfo.getPublication().getJournal().getPublisher() != null)
				text += " , " + requestInfo.getPublication().getJournal().getPublisher().getName();

			text += "\n";
		} else if (requestInfo.getPublication().getPublisher() != null)
			text += "Publisher: " + requestInfo.getPublication().getPublisher().getName() + "\n";

		text += "Requested funding: " + requestInfo.getFundingRequested() + " " + requestInfo.getCurrency().getName() + "\n" +
				"\n";
		text += formatComments(requestInfo);
		text += "Best,\n" +
				"The OpenAIRE team";

		mailLibrary.sendEmail(new String[]{moderator.getEmail()}, subject, text);
	}

	private String formatComments(RequestInfo requestInfo) {
		String text = "";

		if (requestInfo.getComments() != null && requestInfo.getComments().size() > 0) {
			text = "IMPORTANT:\n";

//			for (int i = 0; i < requestInfo.getComments().size(); i++) {
//				Comment comment = requestInfo.getComments().get(i);
//
//				if (i > 0)
//					text += "\n";
//
//				text += comment.getComment() + " -" + comment.getPerson().getName() + " " + comment.getPerson().getLastname() + " @ " + new SimpleDateFormat("yyyy-MM-dd").format(comment.getDate());
//			}

			Comment comment = requestInfo.getComments().get(requestInfo.getComments().size() - 1);

 			text += comment.getComment() + " -" + comment.getPerson().getName() + " " + comment.getPerson().getLastname() + " @ " + new SimpleDateFormat("yyyy-MM-dd").format(comment.getDate());

			text += "\n\n";
		}

		return text;
	}

	@Override
	public void sendPublisherOnHoldEmail(RequestInfo requestInfo) throws MessagingException {
		Publisher publisher = requestInfo.getPublication().getPublisher() != null ? requestInfo.getPublication().getPublisher() : requestInfo.getPublication().getJournal().getPublisher();
		String publisherEmail = null;

		if (requestInfo.getPublisherEmail() != null)
			publisherEmail = requestInfo.getPublisherEmail();
		else {
			if (publisher != null)
				publisherEmail = publisher.getEmail();
		}

		if (publisherEmail != null) {
			String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] Funding request " + requestInfo.getId() + " for invoice " + requestInfo.getInvoice().getNumber() + " has been put on hold";
			String requestLink = baseAddress + "/#existingFundingRequests";
			String text;
			Person contact;

			if (publisher != null && publisher.getContact() != null && publisher.getContact().getId() != null) {
				contact = personDAO.getPersonById(publisher.getContact().getId());
				text = "Dear " + contact.getName() + " " + contact.getLastname() + ",\n";
			} else {
				text = "Dear Madame/Sir,\n";
			}

			text += "\n" +
					"The following request has been put on hold by our accounting office:\n" +
					"\n" +
					"Invoice #: " + requestInfo.getInvoice().getNumber() + "\n" +
					"Project: " + requestInfo.getProject().getAcronym() + " - " + requestInfo.getProject().getGrant() + "\n" +
					"Publication: " + requestInfo.getPublication().getTitle() + "\n"; // TODO add authors

			if (requestInfo.getPublication().getJournal() != null) {
				text += "Journal: " + requestInfo.getPublication().getJournal().getTitle();

				if (requestInfo.getPublication().getJournal().getPublisher() != null)
					text += " , " + requestInfo.getPublication().getJournal().getPublisher().getName();

				text += "\n";
			} else if (requestInfo.getPublication().getPublisher() != null)
				text += "Publisher: " + requestInfo.getPublication().getPublisher().getName() + "\n";

			text += "Requested funding: " + requestInfo.getFundingRequested() + " " + requestInfo.getCurrency().getName() + "\n" +
					"\n";
			text += formatComments(requestInfo);
			text += "Click on the link below at any time to follow the status of your request:\n" +
					requestLink + "\n" +
					"\n" +
					"Feel free to contact us at " + contactLink + " if you need further information.\n\n" +
					"Best,\n" +
					"The OpenAIRE team";

			mailLibrary.sendEmail(new String[]{publisherEmail}, subject, text);
		}
	}

	@Override
	public void sendRequesterDeniedEmail(RequestInfo requestInfo) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] Your funding request " + requestInfo.getId() + " has been denied payment";
		String requestLink = baseAddress + "/#existingFundingRequests";

		String text = "Dear " + requestInfo.getUser().getName() + " " + requestInfo.getUser().getLastname() + ",\n" +
				"\n" +
				"The following request has been denied payment by our accounting office:\n" +
				"\n" +
				"Project: " + requestInfo.getProject().getAcronym() + " - " + requestInfo.getProject().getGrant() + "\n" +
				"Publication: " + requestInfo.getPublication().getTitle() + "\n"; // TODO add authors

		if (requestInfo.getPublication().getJournal() != null) {
			text += "Journal: " + requestInfo.getPublication().getJournal().getTitle();

			if (requestInfo.getPublication().getJournal().getPublisher() != null)
				text += " , " + requestInfo.getPublication().getJournal().getPublisher().getName();

			text += "\n";
		} else if (requestInfo.getPublication().getPublisher() != null)
			text += "Publisher: " + requestInfo.getPublication().getPublisher().getName() + "\n";

		text += "Requested funding: " + requestInfo.getFundingRequested() + " " + requestInfo.getCurrency().getName() + "\n" +
				"\n";
		text += formatComments(requestInfo);
		text += "Click on the link below at any time to follow the status of your request:\n" +
				requestLink + "\n" +
				"\n" +
				"Feel free to contact us at " + contactLink + " if you need further information.\n\n" +
				"Best,\n" +
				"The OpenAIRE team";

		mailLibrary.sendEmail(new String[]{requestInfo.getUser().getEmail()}, subject, text);
	}

	@Override
	public void sendModeratorDeniedEmail(Person moderator, RequestInfo requestInfo) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] The funding request " + requestInfo.getId() + " has been denied payment";

		String text = "Dear Moderator,\n" +
				"\n" +
				"The following request has been denied payment by our accounting office:\n" +
				"\n" +
				"Project: " + requestInfo.getProject().getAcronym() + " - " + requestInfo.getProject().getGrant() + "\n" +
				"Publication: " + requestInfo.getPublication().getTitle() + "\n"; // TODO add authors

		if (requestInfo.getPublication().getJournal() != null) {
			text += "Journal: " + requestInfo.getPublication().getJournal().getTitle();

			if (requestInfo.getPublication().getJournal().getPublisher() != null)
				text += " , " + requestInfo.getPublication().getJournal().getPublisher().getName();

			text += "\n";
		} else if (requestInfo.getPublication().getPublisher() != null)
			text += "Publisher: " + requestInfo.getPublication().getPublisher().getName() + "\n";

		text += "Requested funding: " + requestInfo.getFundingRequested() + " " + requestInfo.getCurrency().getName() + "\n" +
				"\n";
		text += formatComments(requestInfo);
		text += "Best,\n" +
				"The OpenAIRE team";

		mailLibrary.sendEmail(new String[]{moderator.getEmail()}, subject, text);
	}

	@Override
	public void sendModeratorProcessingEmail(Person moderator, RequestInfo requestInfo) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] The funding request " + requestInfo.getId() + " is being processed";

		String text = "Dear Moderator,\n" +
				"\n" +
				"The following request is being processed by our accounting office:\n" +
				"\n" +
				"Project: " + requestInfo.getProject().getAcronym() + " - " + requestInfo.getProject().getGrant() + "\n" +
				"Publication: " + requestInfo.getPublication().getTitle() + "\n"; // TODO add authors

		if (requestInfo.getPublication().getJournal() != null) {
			text += "Journal: " + requestInfo.getPublication().getJournal().getTitle();

			if (requestInfo.getPublication().getJournal().getPublisher() != null)
				text += " , " + requestInfo.getPublication().getJournal().getPublisher().getName();

			text += "\n";
		} else if (requestInfo.getPublication().getPublisher() != null)
			text += "Publisher: " + requestInfo.getPublication().getPublisher().getName() + "\n";

		text += "Requested funding: " + requestInfo.getFundingRequested() + " " + requestInfo.getCurrency().getName() + "\n" +
				"\n";
		text += formatComments(requestInfo);
		text += "Best,\n" +
				"The OpenAIRE team";

		mailLibrary.sendEmail(new String[]{moderator.getEmail()}, subject, text);
	}

	@Override
	public void sendModeratorInvoiceUploaded(Person moderator, RequestInfo requestInfo) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] Invoice for funding request " + requestInfo.getId() + " has been uploaded";

		String text = "Dear Moderator,\n" +
				"\n" +
				"The invoice for the following request has been uploaded:\n" +
				"\n" +
				"Project: " + requestInfo.getProject().getAcronym() + " - " + requestInfo.getProject().getGrant() + "\n" +
				"Publication: " + requestInfo.getPublication().getTitle() + "\n"; // TODO add authors

		if (requestInfo.getPublication().getJournal() != null) {
			text += "Journal: " + requestInfo.getPublication().getJournal().getTitle();

			if (requestInfo.getPublication().getJournal().getPublisher() != null)
				text += " , " + requestInfo.getPublication().getJournal().getPublisher().getName();

			text += "\n";
		} else if (requestInfo.getPublication().getPublisher() != null)
			text += "Publisher: " + requestInfo.getPublication().getPublisher().getName() + "\n";

		text += "Requested funding: " + requestInfo.getFundingRequested() + " " + requestInfo.getCurrency().getName() + "\n" +
				"\n";
		text += formatComments(requestInfo);
		text += "Best,\n" +
				"The OpenAIRE team";

		mailLibrary.sendEmail(new String[]{moderator.getEmail()}, subject, text);
	}

	@Override
	public void sendPublisherDeniedEmail(RequestInfo requestInfo) throws MessagingException {
		//
	}

	@Override
	public void sendCoordinatorRequestSubmittedEmail(Person coordinator, RequestInfo requestInfo) throws MessagingException {
		String subject = "[OpenAIRE-FP7-Post-Grant-OA-Pilot] A new funding request (" + requestInfo.getId() + ") has been submitted";
		String portalLink = baseAddress + "/#home";

		String text = "Dear " + coordinator.getName() + " " + coordinator.getLastname() + ",\n" +
				"We are contacting you in your capacity of project coordinator for project " + requestInfo.getProject().getAcronym() + ".\n" +
				"As you may already know your project is eligible for publising funds from the OpenAIRE FP7 post-grant Gold Open Access Pilot " + portalLink + ".\n";


		if (!requestInfo.getUser().getId().equals(requestInfo.getResearcher().getId())) {
			text += requestInfo.getUser().getName() + " " + requestInfo.getUser().getLastname() + " from " + requestInfo.getUser().getAffiliations().get(0).getOrganization().getName() +
					" has requested on behalf of " + requestInfo.getResearcher().getName() + " " + requestInfo.getResearcher().getLastname() +
					" the funding of the following publication:\n";
		} else {
			text += requestInfo.getResearcher().getName() + " " + requestInfo.getResearcher().getLastname() + " from " + requestInfo.getUser().getAffiliations().get(0).getOrganization().getName() +
					" has requested the funding of the following publication:\n";
		}

		text += "\n";
		text += "Publication: " + requestInfo.getPublication().getTitle() + "\n"; // TODO add authors

		if (requestInfo.getPublication().getJournal() != null) {
			text += "Journal: " + requestInfo.getPublication().getJournal().getTitle();

			if (requestInfo.getPublication().getJournal().getPublisher() != null)
				text += " , " + requestInfo.getPublication().getJournal().getPublisher().getName();

			text += "\n";
		} else if (requestInfo.getPublication().getPublisher() != null)
			text += "Publisher: " + requestInfo.getPublication().getPublisher().getName() + "\n";

		text += "Requested funding: " + requestInfo.getFundingRequested() + " " + requestInfo.getCurrency().getName() + "\n" +
				"\n";

		text += "As there is a limit of 3 publications from each project from this Pilot and would like to ensure a fair use of the fund. For the project's best interests, please let us know if there is any reason why we should not proceed with the requestd funding within the next 3 working days.\n";
		text += "Feel free to contact us at " + this.contactLink + " if you need further information.\n\n" +
				"Best,\n" +
				"The OpenAIRE team";

		mailLibrary.sendEmail(coordinator.getEmail(), subject, text);
	}

	public String getBaseAddress() {
		return baseAddress;
	}

	public void setBaseAddress(String baseAddress) {
		this.baseAddress = baseAddress;
	}

	public String getTermsOfAgreementUrl() {
		return termsOfAgreementUrl;
	}

	public void setTermsOfAgreementUrl(String termsOfAgreementUrl) {
		this.termsOfAgreementUrl = termsOfAgreementUrl;
	}
}