package eu.dnetlib.goldoa.service;

import eu.dnetlib.goldoa.domain.*;
import eu.dnetlib.goldoa.service.dao.RequestDAO;
import eu.dnetlib.goldoa.service.utils.EmailUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.transaction.annotation.Transactional;

import javax.mail.MessagingException;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ExecutorService;

/**
 * Created by antleb on 3/10/15.
 */
@Transactional
public class RequestManagerImpl implements RequestManager {

	@Autowired
	private RequestDAO requestDAO;
	@Autowired
	private PersonManager personManager;
	@Autowired
	private OrganizationManager organizationManager;
	@Autowired
	private ProjectManager projectManager;
	@Autowired
	private PublicationManager publicationManager;
	@Autowired
	private InvoiceManager invoiceManager;
	@Autowired
	private BudgetManager budgetManager;
	@Autowired
	private EligibilityManager eligibilityManager;
	@Autowired
	private EmailUtils emailUtils;
	@Autowired
	private ExecutorService executorService;

	private boolean sendCoordinatorEmails = false;
	private boolean sendEvaEmail = false;
	private String evaEmail = null;

	@Override
	public Request saveRequest(final Request request) {

		if (request.getId() == null) {
			request.setId(new SimpleDateFormat("yyyyMMdd-").format(new Date()) + requestDAO.getRequestId());

			BudgetInfo budget = budgetManager.getForRequest(request.getOrganization(), request.getPublisher());

			if (budget != null) {
				request.setBudget(budget.getId());

				// TODO fix amounts
//				budget.setRemaining(budget.getRemaining() - request.getFundingRequested());
//				budgetManager.saveBudget(budget);
			}
		}

		System.out.println("saving request " + request.getId() + " with status " + request.getStatus());

		requestDAO.saveRequest(request);
		requestDAO.saveCoFunders(request);

		return request;
	}

	@Override
	public RequestInfo getById(String requestId) {
		try {
			Request request = requestDAO.getRequest(requestId);

			request.setCoFunders(requestDAO.getCoFunders(request));

			return this.getRequestInfo(request);
		} catch (PersonManagerException e) {
			e.printStackTrace();
		}

		return null;
	}

	@Override
	public RequestInfoPage getForUser(String personId, Date fromDate, Date toDate, RequestSort requestSortBy, RequestSortOrder order, RequestFilter requestFilter, String term, Request.RequestStatus[] statusFilter, int from, int to) {
		RequestPage requests = requestDAO.getForUser(personId, fromDate, toDate, requestSortBy, order, requestFilter, term, statusFilter, from, to);
		List<RequestInfo> res = new ArrayList<RequestInfo>();

		for (Request request : requests.getRequests()) {
			try {
				request.setCoFunders(requestDAO.getCoFunders(request));

				RequestInfo req = getShortRequestInfo(request);

				res.add(req);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		return new RequestInfoPage(res, requests.getTotal(), requests.getFrom(), requests.getTo());
	}

	@Override
	public RequestInfoPage getForPublisher(String publisherId, Date fromDate, Date toDate, RequestSort requestSortBy, RequestSortOrder order, RequestFilter requestFilter, String term, Request.RequestStatus[] statusFilter, int from, int to) {
		RequestPage requests = requestDAO.getForPublisher(publisherId, fromDate, toDate, requestSortBy, order, requestFilter, term, statusFilter, from, to);
		List<RequestInfo> res = new ArrayList<RequestInfo>();

		for (Request request : requests.getRequests()) {
			try {
				request.setCoFunders(requestDAO.getCoFunders(request));

				RequestInfo req = getShortRequestInfo(request);

				res.add(req);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		return new RequestInfoPage(res, requests.getTotal(), requests.getFrom(), requests.getTo());
	}

	@Override
	public RequestInfoPage getForOrganization(List<String> organizationIds, Date fromDate, Date toDate, RequestSort requestSortBy, RequestSortOrder order, RequestFilter requestFilter, String term, Request.RequestStatus[] statusFilter, int from, int to) {
		RequestPage requests = requestDAO.getForOrganization(organizationIds, fromDate, toDate, requestSortBy, order, requestFilter, term, statusFilter, from, to);
		List<RequestInfo> res = new ArrayList<RequestInfo>();

		for (Request request : requests.getRequests()) {
			try {
				request.setCoFunders(requestDAO.getCoFunders(request));

				RequestInfo req = getShortRequestInfo(request);

				res.add(req);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		return new RequestInfoPage(res, requests.getTotal(), requests.getFrom(), requests.getTo());
	}

	@Override
	public List<Request> getForProject(String projectId) {
		return requestDAO.getForProject(projectId);
	}

	@Override
	public String getCSV(String mode, RequestSort requestSortBy, RequestSortOrder order, RequestFilter requestFilter, String term, Request.RequestStatus[] statusFilter) {
		Integer[] statuses = null;

		if ("moderator".equals(mode)) {
			if (statusFilter == null || statusFilter.length == 0) {

			} else {
				statuses = new Integer[statusFilter.length];

				for (int i = 0; i < statusFilter.length; i++) {
					statuses[i] = statusFilter[i].getCode();
				}
			}
		} else if ("accounting".equals(mode)) {
			if (statusFilter == null || statusFilter.length == 0)
				statuses = new Integer[] {
						Request.RequestStatus.APPROVED.getCode(),
						Request.RequestStatus.ACCOUNTING_PROCESSING.getCode(),
						Request.RequestStatus.ACCOUNTING_ON_HOLD.getCode(),
						Request.RequestStatus.ACCOUNTING_DENIED.getCode(),
						Request.RequestStatus.ACCOUNTING_PAID.getCode()};

			else {
				statuses = new Integer[statusFilter.length];

				for (int i = 0; i < statusFilter.length; i++) {
					Request.RequestStatus s = statusFilter[i];

					statuses[i] = s.getCode();
				}
			}
		}

		try {
			return requestDAO.getCSV(requestSortBy, order, requestFilter, term, statuses);
		} catch (IOException e) {
			e.printStackTrace();

			return e.getMessage();
		}
	}

	@Override
	public RequestInfoPage getRequests(Date fromDate, Date toDate, RequestSort requestSortBy, RequestSortOrder order, RequestFilter requestFilter, String term, Request.RequestStatus[] statusFilter, int from, int to) {
		RequestPage requests = requestDAO.getRequests(fromDate, toDate, requestSortBy, order, requestFilter, term, statusFilter, from, to);
		List<RequestInfo> res = new ArrayList<RequestInfo>();

		for (Request request : requests.getRequests()) {
			try {
				request.setCoFunders(requestDAO.getCoFunders(request));

				RequestInfo req = getShortRequestInfo(request);

				res.add(req);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		return new RequestInfoPage(res, requests.getTotal(), requests.getFrom(), requests.getTo());
	}

	@Override
	public RequestInfoPage getForAccounting(Date fromDate, Date toDate, RequestSort requestSortBy, RequestSortOrder order, RequestFilter requestFilter, String term, Request.RequestStatus[] statusFilter, int from, int to) {
		Integer[] statuses;

		if (statusFilter == null || statusFilter.length == 0)
			statuses = new Integer[] {Request.RequestStatus.APPROVED.getCode(), Request.RequestStatus.ACCOUNTING_PROCESSING.getCode(), Request.RequestStatus.ACCOUNTING_ON_HOLD.getCode()
			, Request.RequestStatus.ACCOUNTING_DENIED.getCode(), Request.RequestStatus.ACCOUNTING_PAID.getCode()};

		else {
			statuses = new Integer[statusFilter.length];

			for (int i = 0; i < statusFilter.length; i++) {
				Request.RequestStatus s = statusFilter[i];

				statuses[i] = s.getCode();
			}
		}

		RequestPage requests = requestDAO.getRequests(fromDate, toDate, requestSortBy, order, requestFilter, term, statuses, from, to);
		List<RequestInfo> res = new ArrayList<RequestInfo>();

		for (Request request : requests.getRequests()) {
			try {
				request.setCoFunders(requestDAO.getCoFunders(request));

				RequestInfo req = getShortRequestInfo(request);

				res.add(req);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		return new RequestInfoPage(res, requests.getTotal(), requests.getFrom(), requests.getTo());
	}

	@Override
	public Request submitRequest(final Request request) {

		if (request.getBudget() != null) {
			BudgetInfo budget = budgetManager.getBudget(request.getBudget());

			if (budget.getOrganisation() != null)
				request.addStatus(Request.RequestStatus.LIBRARY_FUND_SUBMITTED);
			else if (budget.getPublisher() != null)
				request.addStatus(Request.RequestStatus.PUBLISHER_FUND_SUBMITTED);
		} else {
			request.addStatus(Request.RequestStatus.SUBMITTED);
		}
		request.setSubmissionDate(new Date());

		requestDAO.submitRequest(request.getId());

		saveRequest(request);

		executorService.submit(new Runnable() {
			@Override
			public void run() {
				RequestInfo requestInfo = null;
				try {
					requestInfo = getRequestInfo(request);

					switch (requestInfo.getEligibility().getStatus()) {
						case OK:
							emailUtils.sendRequesterOKEmail(requestInfo);

							for (Person person : personManager.getModerators())
								emailUtils.sendModeratorOKEmail(requestInfo, person);
							break;
						case IFFY:
							emailUtils.sendRequesterIFFYEmail(requestInfo);

							for (Person person : personManager.getModerators())
								emailUtils.sendModeratorIFFYEmail(requestInfo, person);
							break;
						case NONO:
							break;
					}

					if (sendCoordinatorEmails) {
						for (Person coordinator : requestInfo.getProject().getCoordinators())
							emailUtils.sendCoordinatorRequestSubmittedEmail(coordinator, requestInfo);
					}
				} catch (MessagingException e) {
					e.printStackTrace();
				} catch (PersonManagerException e) {
					e.printStackTrace();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});

		return request;
	}

	@Override
	public Request submitLibraryRequest(final Request request) throws PersonManagerException {
		request.addStatus(Request.RequestStatus.LIBRARY_FUND_SUBMITTED);
		request.setSubmissionDate(new Date());

//		requestDAO.submitRequest(request.getId());

		saveRequest(request);

//		executorService.submit(new Runnable() {
//			@Override
//			public void run() {
//				RequestInfo requestInfo = null;
//				try {
//					requestInfo = getRequestInfo(request);
//
//					switch (requestInfo.getEligibility().getStatus()) {
//						case OK:
//							emailUtils.sendRequesterOKEmail(requestInfo);
//
//							for (Person person : personManager.getModerators())
//								emailUtils.sendModeratorOKEmail(requestInfo, person);
//							break;
//						case IFFY:
//							emailUtils.sendRequesterIFFYEmail(requestInfo);
//
//							for (Person person : personManager.getModerators())
//								emailUtils.sendModeratorIFFYEmail(requestInfo, person);
//							break;
//						case NONO:
//							break;
//					}
//
//					if (sendCoordinatorEmails) {
//						for (Person coordinator : requestInfo.getProject().getCoordinators())
//							emailUtils.sendCoordinatorRequestSubmittedEmail(coordinator, requestInfo);
//					}
//				} catch (MessagingException e) {
//					e.printStackTrace();
//				} catch (PersonManagerException e) {
//					e.printStackTrace();
//				} catch (Exception e) {
//					e.printStackTrace();
//				}
//			}
//		});

		return request;
	}

	@Override
	public Request submitPublisherRequest(Request request) throws PersonManagerException {
		request.addStatus(Request.RequestStatus.PUBLISHER_FUND_SUBMITTED);
		request.setSubmissionDate(new Date());

//		requestDAO.submitRequest(request.getId());

		saveRequest(request);

//		executorService.submit(new Runnable() {
//			@Override
//			public void run() {
//				RequestInfo requestInfo = null;
//				try {
//					requestInfo = getRequestInfo(request);
//
//					switch (requestInfo.getEligibility().getStatus()) {
//						case OK:
//							emailUtils.sendRequesterOKEmail(requestInfo);
//
//							for (Person person : personManager.getModerators())
//								emailUtils.sendModeratorOKEmail(requestInfo, person);
//							break;
//						case IFFY:
//							emailUtils.sendRequesterIFFYEmail(requestInfo);
//
//							for (Person person : personManager.getModerators())
//								emailUtils.sendModeratorIFFYEmail(requestInfo, person);
//							break;
//						case NONO:
//							break;
//					}
//
//					if (sendCoordinatorEmails) {
//						for (Person coordinator : requestInfo.getProject().getCoordinators())
//							emailUtils.sendCoordinatorRequestSubmittedEmail(coordinator, requestInfo);
//					}
//				} catch (MessagingException e) {
//					e.printStackTrace();
//				} catch (PersonManagerException e) {
//					e.printStackTrace();
//				} catch (Exception e) {
//					e.printStackTrace();
//				}
//			}
//		});

		return request;
	}

	@Override
	public void conditionallyApproveRequest(final String requestId, final String personId, final String comment, String template) {
		requestDAO.conditionallyApproveRequest(requestId, personId, comment, template);

		executorService.submit(new Runnable() {
			@Override
			public void run() {
				RequestInfo requestInfo = getById(requestId);

				try {
					emailUtils.sendRequesterInitiallyApprovedEmail(requestInfo);
				} catch (MessagingException e) {
					e.printStackTrace();
				}
			}
		});
	}

	@Override
	public void approveRequest(final String requestId, final String personId, final String comment, String template) {
		requestDAO.approveRequest(requestId, personId, comment, template);

		executorService.submit(new Runnable() {
			@Override
			public void run() {
				RequestInfo requestInfo = getById(requestId);

				try {
					emailUtils.sendRequesterApprovedEmail(requestInfo);
				} catch (MessagingException e) {
					e.printStackTrace();
				}

				if (requestInfo.getInvoice() == null) {
					try {
						emailUtils.sendRequesterInvoiceNotification(requestInfo);
						emailUtils.sendPublisherInvoiceNotification(requestInfo);
					} catch (MessagingException e) {
						e.printStackTrace();
					}
				} else {
					try {
						for (Person person : personManager.getAccountingOfficers())
							emailUtils.sendAccountingRequestApprovedEmail(person, requestInfo);
					} catch (MessagingException e) {
						e.printStackTrace();
					}
				}
			}
		});
	}

	@Override
	public void rejectRequest(final String requestId, String personId, String comment, String template) {
		requestDAO.rejectRequest(requestId, personId, comment, template);

		executorService.submit(new Runnable() {
			@Override
			public void run() {
				RequestInfo requestInfo = getById(requestId);

				try {
					emailUtils.sendRequesterRejectedEmail(requestInfo);
				} catch (MessagingException e) {
					e.printStackTrace();
				}
			}
		});
	}

	@Override
	public void processingRequest(final String requestId, String personId, String comment, String template) {
		requestDAO.processingRequest(requestId, personId, comment, template);

		executorService.submit(new Runnable() {
			@Override
			public void run() {
				RequestInfo requestInfo = getById(requestId);

				try {
					for (Person person : personManager.getModerators())
						emailUtils.sendModeratorProcessingEmail(person, requestInfo);

				} catch (MessagingException e) {
					e.printStackTrace();
				}
			}
		});
	}

	@Override
	public void paidRequest(final String requestId, String personId, String comment, String template, float apc_paid, float transfer_cost, float other_cost, Date datePaid) {
		requestDAO.paidRequest(requestId, personId, comment, template, apc_paid, transfer_cost, other_cost, datePaid);

		executorService.submit(new Runnable() {
			@Override
			public void run() {
				RequestInfo requestInfo = getById(requestId);

				try {
					emailUtils.sendRequesterPaidEmail(requestInfo);
					emailUtils.sendPublisherPaidEmail(requestInfo);

					for (Person person : personManager.getModerators())
						emailUtils.sendModeratorPaidEmail(person, requestInfo);

					if (sendEvaEmail)
						emailUtils.sendEvaPaidEmail(evaEmail, requestInfo);

				} catch (MessagingException e) {
					e.printStackTrace();
				}
			}
		});
	}

	@Override
	public void paidLibraryRequest(String requestId, String personId, String comment, String template, float apc_paid, float transfer_cost, float other_cost, Date datePaid) {
		requestDAO.paidLibraryRequest(requestId, personId, comment, template, apc_paid, transfer_cost, other_cost, datePaid);

//		executorService.submit(new Runnable() {
//			@Override
//			public void run() {
//				RequestInfo requestInfo = getById(requestId);
//
//				try {
//					emailUtils.sendRequesterPaidEmail(requestInfo);
//					emailUtils.sendPublisherPaidEmail(requestInfo);
//
//					for (Person person : personManager.getModerators())
//						emailUtils.sendModeratorPaidEmail(person, requestInfo);
//
//					if (sendEvaEmail)
//						emailUtils.sendEvaPaidEmail(evaEmail, requestInfo);
//
//				} catch (MessagingException e) {
//					e.printStackTrace();
//				}
//			}
//		});
	}

	@Override
	public void paidPublisherRequest(String requestId, String personId, String comment, String template, float apc_paid, float transfer_cost, float other_cost, Date datePaid) {
		requestDAO.paidPublisherRequest(requestId, personId, comment, template, apc_paid, transfer_cost, other_cost, datePaid);

		//		executorService.submit(new Runnable() {
//			@Override
//			public void run() {
//				RequestInfo requestInfo = getById(requestId);
//
//				try {
//					emailUtils.sendRequesterPaidEmail(requestInfo);
//					emailUtils.sendPublisherPaidEmail(requestInfo);
//
//					for (Person person : personManager.getModerators())
//						emailUtils.sendModeratorPaidEmail(person, requestInfo);
//
//					if (sendEvaEmail)
//						emailUtils.sendEvaPaidEmail(evaEmail, requestInfo);
//
//				} catch (MessagingException e) {
//					e.printStackTrace();
//				}
//			}
//		});
	}

	@Override
	public void onHoldRequest(final String requestId, String personId, String comment, String template) {
		requestDAO.onHoldRequest(requestId, personId, comment, template);

		executorService.submit(new Runnable() {
			@Override
			public void run() {
				RequestInfo requestInfo = getById(requestId);

				try {
					emailUtils.sendRequesterOnHoldEmail(requestInfo);
					emailUtils.sendPublisherOnHoldEmail(requestInfo);

					for (Person person : personManager.getModerators())
						emailUtils.sendModeratorOnHoldEmail(person, requestInfo);
				} catch (MessagingException e) {
					e.printStackTrace();
				}
			}
		});
	}

	@Override
	public void deniedRequest(final String requestId, String personId, String comment, String template) {
		requestDAO.deniedRequest(requestId, personId, comment, template);

		executorService.submit(new Runnable() {
			@Override
			public void run() {
				RequestInfo requestInfo = getById(requestId);

				try {
					emailUtils.sendRequesterDeniedEmail(requestInfo);
					emailUtils.sendPublisherDeniedEmail(requestInfo);

					for (Person person : personManager.getModerators())
						emailUtils.sendModeratorDeniedEmail(person, requestInfo);
				} catch (MessagingException e) {
					e.printStackTrace();
				}
			}
		});
	}

	@Override
	public void invoiceUploaded(final String requestId, String invoiceId) {

		executorService.submit(new Runnable() {
			@Override
			public void run() {
				RequestInfo requestInfo = getById(requestId);

				if (requestInfo.getRequest().getStatus(Request.RequestStatus.CONDITIONALLY_APPROVED)) {
					try {
						for (Person person : personManager.getModerators())
							emailUtils.sendModeratorInvoiceUploaded(person, requestInfo);
					} catch (MessagingException e) {
						e.printStackTrace();
					}
				}
			}
		});
	}

	@Override
	public void uploadTransferReceipt(String requestid, String contentType, InputStream inputStream) {
		requestDAO.uploadBankTransferReceipt(requestid, contentType, inputStream);
	}

	@Override
	public BankTransferReceipt downloadBankTransferReceipt(String requestId) throws RequestManagerException {
		try {
			return requestDAO.downloadBankTransferReceipt(requestId);
		} catch (EmptyResultDataAccessException e) {
			throw new RequestManagerException(RequestManagerException.ErrorCause.NOT_EXISTS);
		}
	}

	@Override
	public List<CommentTemplate> getCommentTemplates(Request.RequestStatus requestStatus) {
		try {
			return requestDAO.getCommentTemplates(requestStatus);
		} catch (EmptyResultDataAccessException e) {
			return new ArrayList<CommentTemplate>();
		}
	}

	private RequestInfo getRequestInfo(Request request) throws PersonManagerException {
		RequestInfo req = new RequestInfo();

		try {
			// TODO add missing fields
			req.setId(request.getId());
			req.setUser(personManager.getById(request.getUser()));
			req.setDate(request.getDate());
			req.setResearcher(personManager.getById(request.getResearcher()));
			req.setOrganization(organizationManager.getById(request.getOrganization()));
			req.setProject(projectManager.getById(request.getProject()).getProject());
			req.setPublication(publicationManager.getPublication(request.getPublication()));
			req.setPublisherEmail(request.getPublisherEmail());
			req.setApc(request.getApc());
			req.setDiscount(request.getDiscount());
			req.setProjectParticipation(request.getProjectParticipation());
			req.setFundingRequested(request.getFundingRequested());
			req.setCurrency(request.getCurrency());
			req.setBankAccount(request.getBankAccount());
			if (request.getInvoice() != null)
				req.setInvoice(invoiceManager.getInvoice(request.getInvoice()));
			req.setEligibility(eligibilityManager.validate(request));
			req.setStatus(Request.RequestStatus.forStatus(request.getStatus()));
			req.setComments(requestDAO.getComments(request.getId()));
			req.setCoFunders(request.getCoFunders());
			req.setRequest(request);

			req.setApc_paid(request.getApc_paid());
			req.setTransfer_cost(request.getTransfer_cost());
			req.setOther_cost(request.getOther_cost());
			req.setDate_paid(request.getDate_paid());
			req.setSubmissionDate(request.getSubmissionDate());
			req.setApprovalDate(request.getApprovalDate());

			if (request.getBudget() != null) {
				req.setBudgetInfo(budgetManager.getBudget(request.getBudget()));
			}

			loadCommentPersons(req);
		} catch (ManagerException me) {
			me.printStackTrace();
		} catch (OrganizationManagerException e) {
			e.printStackTrace();
		}

		return req;
	}

	private RequestInfo getShortRequestInfo(Request request) throws PersonManagerException {
		RequestInfo req = new RequestInfo();

		try {
			// TODO add missing fields
			req.setId(request.getId());
			req.setDate(request.getDate());
			req.setProject(projectManager.getById(request.getProject()).getProject());
			req.setPublication(publicationManager.getPublication(request.getPublication()));
			req.setPublisherEmail(request.getPublisherEmail());
			req.setApc(request.getApc());
			req.setDiscount(request.getDiscount());
			req.setProjectParticipation(request.getProjectParticipation());
			req.setFundingRequested(request.getFundingRequested());
			req.setCurrency(request.getCurrency());
			req.setBankAccount(request.getBankAccount());
			if (request.getInvoice() != null)
				req.setInvoice(invoiceManager.getInvoice(request.getInvoice()));
			req.setCoFunders(request.getCoFunders());
			req.setStatus(Request.RequestStatus.forStatus(request.getStatus()));
			req.setComments(requestDAO.getComments(request.getId()));
			req.setRequest(request);

			req.setApc_paid(request.getApc_paid());
			req.setTransfer_cost(request.getTransfer_cost());
			req.setOther_cost(request.getOther_cost());
			req.setDate_paid(request.getDate_paid());
			req.setSubmissionDate(request.getSubmissionDate());
			req.setApprovalDate(request.getApprovalDate());

			loadCommentPersons(req);
		} catch (ManagerException me) {
			me.printStackTrace();
		}

		return req;
	}

	private void loadCommentPersons(RequestInfo requestInfo) throws PersonManagerException {
		for (Comment comment : requestInfo.getComments()) {
			comment.setPerson(personManager.getById(comment.getPerson().getId()));
		}
	}

	public boolean isSendCoordinatorEmails() {
		return sendCoordinatorEmails;
	}

	public void setSendCoordinatorEmails(boolean sendCoordinatorEmails) {
		this.sendCoordinatorEmails = sendCoordinatorEmails;
	}

	public boolean isSendEvaEmail() {
		return sendEvaEmail;
	}

	public void setSendEvaEmail(boolean sendEvaEmail) {
		this.sendEvaEmail = sendEvaEmail;
	}

	public String getEvaEmail() {
		return evaEmail;
	}

	public void setEvaEmail(String evaEmail) {
		this.evaEmail = evaEmail;
	}
}
