package eu.dnetlib.contract.evaluator;

import org.opensaml.lite.common.SAMLObject;
import org.opensaml.lite.saml2.core.Assertion;

import eu.dnetlib.contract.cp.CheckPointEvaluationException;
import eu.dnetlib.contract.cp.ICheckPoint;
import eu.dnetlib.contract.cp.eval.module.IEvaluatorModule;
import eu.dnetlib.contract.event.IContractEvent;
import eu.dnetlib.contract.node.EvaluationResult;
import eu.dnetlib.contract.node.EvaluationResult.Status;

public class IssuerAndProxyCountEvaluator implements IEvaluatorModule<IContractEvent> {

	String issuer;
	
	Integer proxyCount;
	
	@Override
	public EvaluationResult evaluate(Object inspObj, IContractEvent event,
			ICheckPoint<IContractEvent> checkPoint) throws CheckPointEvaluationException {
		final EvaluationResult failure = new EvaluationResult(
				Status.FAIL, checkPoint, event);
		if (inspObj instanceof SAMLObject[]) {
			SAMLObject[] array = (SAMLObject[]) inspObj;
			if (array.length==1) {
				if (array[0] instanceof Assertion) {
					Assertion assertion = (Assertion) array[0];
					if (issuer!=null) {
						if (!issuer.equals(assertion.getIssuer().getValue())) {
							return failure;
						}
					} else {
						if (assertion.getIssuer().getValue()!=null) {
							return failure;
						}
					}
					if (proxyCount==null) {
						if (assertion.getConditions()!=null &&
								assertion.getConditions().getProxyRestriction()!=null &&
								assertion.getConditions().getProxyRestriction().getProxyCount()!=null) {
							return failure;
						} else {
							return new EvaluationResult(
									Status.OK, checkPoint, event);
						}
					} else {
						if (assertion.getConditions()!=null &&
								assertion.getConditions().getProxyRestriction()!=null) {
							if (proxyCount.equals(
									assertion.getConditions().getProxyRestriction().getProxyCount())) {
								return new EvaluationResult(
										Status.OK, checkPoint, event);
							} else {
								return failure;
							}
						}
					}
				}
			}
		}
		return failure;
	}


	public String getIssuer() {
		return issuer;
	}


	public void setIssuer(String issuer) {
		this.issuer = issuer;
	}


	public Integer getProxyCount() {
		return proxyCount;
	}


	public void setProxyCount(Integer proxyCount) {
		this.proxyCount = proxyCount;
	}

}
