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.ResultContractEvent;
import eu.dnetlib.contract.node.EvaluationResult;
import eu.dnetlib.contract.node.EvaluationResult.Status;
import eu.dnetlib.enabling.aas.holder.IDataHolder;

/**
 * {@link Assertion} evaluator module.
 * The assertion is not retrieved from result but extracted
 * from {@link IDataHolder} module.
 * 
 * @author mhorst
 *
 */
public class AuthnAssertionEvaluator implements IEvaluatorModule<ResultContractEvent> {

	protected IDataHolder<SAMLObject[]> dataHolder;
	
	/* (non-Javadoc)
	 * @see eu.dnetlib.contract.cp.eval.module.IEvaluatorModule#evaluate(java.lang.Object, eu.dnetlib.contract.event.IContractEvent, eu.dnetlib.contract.cp.ICheckPoint)
	 */
	@Override
	public EvaluationResult evaluate(Object arg0, ResultContractEvent event,
			ICheckPoint<ResultContractEvent> cp)
			throws CheckPointEvaluationException {
		if (dataHolder!=null) {
			SAMLObject[] data = dataHolder.getData();
			if (data!=null && data.length>0) {
				if (data[0] instanceof Assertion) {
//					TODO consider checking assertion details (it's up to the policy)
					return new EvaluationResult(Status.OK, cp, event);
				} else {
					return new EvaluationResult(Status.FAIL, cp, event,
					"SAMLObject is not an instance of assertion!");
				}
				
			} else {
				return new EvaluationResult(Status.FAIL, cp, event,
				"no data stored in data holder!");
			}
		} else {
			return new EvaluationResult(Status.FAIL, cp, event,
					"no data holder injected!");
		}
	}

	public void setDataHolder(IDataHolder<SAMLObject[]> dataHolder) {
		this.dataHolder = dataHolder;
	}
	
}
