package eu.dnetlib.goldoa.service.eligibility;

import eu.dnetlib.goldoa.domain.Currency;
import eu.dnetlib.goldoa.domain.Eligibility;
import eu.dnetlib.goldoa.domain.Publication;
import eu.dnetlib.goldoa.domain.Request;
import eu.dnetlib.goldoa.service.CurrencyConverter;
import eu.dnetlib.goldoa.service.EligibilityManager;
import eu.dnetlib.goldoa.service.dao.PublicationDAO;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * Created by antleb on 3/25/15.
 */
public class AccountingEligibilityManager implements EligibilityManager {

	@Autowired
	private PublicationDAO publicationDAO;
	@Autowired
	private CurrencyConverter currencyConverter;

	private String participationNoNoMessage;
	private String fundingRequestedNoNoMessage;

	private float maxArticleAPC;
	private String maxArticleAPCNoNoMessage;
	private float maxMonographAPC;
	private String maxMonographAPCNoNoMessage;

	@Override
	public Eligibility validate(Request request) {
		Eligibility eligibility = new Eligibility();

		if (request.getProjectParticipation() != null && (request.getProjectParticipation() <= 0 || request.getProjectParticipation() > 100))
			eligibility.merge(new Eligibility(Eligibility.Status.NONO, this.participationNoNoMessage));

		if (request.getFundingRequested() != null && (request.getFundingRequested() <= 0))
			eligibility.merge(new Eligibility(Eligibility.Status.NONO, this.fundingRequestedNoNoMessage));

		if (request.getPublication() != null && request.getFundingRequested() != null) {
			Publication publication = publicationDAO.getPublication(request.getPublication());
			float amount = currencyConverter.convert(request.getCurrency(), Currency.EUR, request.getFundingRequested());

			switch (publication.getType()) {
				case ARTICLE:
				case BOOK_CHAPTER:
					if (amount > maxArticleAPC)
						eligibility.merge(new Eligibility(Eligibility.Status.NONO, maxArticleAPCNoNoMessage));
					break;
				case MONOGRAPH:
					if (amount > maxMonographAPC)
						eligibility.merge(new Eligibility(Eligibility.Status.NONO, maxMonographAPCNoNoMessage));
					break;
			}
		}

		return eligibility;
	}

	public String getParticipationNoNoMessage() {
		return participationNoNoMessage;
	}

	public void setParticipationNoNoMessage(String participationNoNoMessage) {
		this.participationNoNoMessage = participationNoNoMessage;
	}

	public String getFundingRequestedNoNoMessage() {
		return fundingRequestedNoNoMessage;
	}

	public void setFundingRequestedNoNoMessage(String fundingRequestedNoNoMessage) {
		this.fundingRequestedNoNoMessage = fundingRequestedNoNoMessage;
	}

	public float getMaxArticleAPC() {
		return maxArticleAPC;
	}

	public void setMaxArticleAPC(float maxArticleAPC) {
		this.maxArticleAPC = maxArticleAPC;
	}

	public String getMaxArticleAPCNoNoMessage() {
		return maxArticleAPCNoNoMessage;
	}

	public void setMaxArticleAPCNoNoMessage(String maxArticleAPCNoNoMessage) {
		this.maxArticleAPCNoNoMessage = maxArticleAPCNoNoMessage;
	}

	public float getMaxMonographAPC() {
		return maxMonographAPC;
	}

	public void setMaxMonographAPC(float maxMonographAPC) {
		this.maxMonographAPC = maxMonographAPC;
	}

	public String getMaxMonographAPCNoNoMessage() {
		return maxMonographAPCNoNoMessage;
	}

	public void setMaxMonographAPCNoNoMessage(String maxMonographAPCNoNoMessage) {
		this.maxMonographAPCNoNoMessage = maxMonographAPCNoNoMessage;
	}
}
