package eu.dnetlib.enabling.aas.security.impl;

import java.security.Key;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.PublicKey;

import javax.crypto.SecretKey;

import org.opensaml.lite.security.TrustLevel;
import org.opensaml.xml.security.credential.BasicCredential;
import org.opensaml.xml.security.credential.UsageType;

import eu.dnetlib.enabling.aas.security.TrustAwareCredential;

/**
 * Trust aware credential.
 * @author mhorst
 *
 */
public class TrustAwareCredentialImpl extends BasicCredential 
	implements TrustAwareCredential{

	/**
	 * Trust level set for credential.
	 */
	private TrustLevel trustLevel;

	/**
	 * Default constructor.
	 */
	public TrustAwareCredentialImpl(TrustLevel trustLevel) {
		super();
		this.trustLevel = trustLevel;
	}
	
	public TrustAwareCredentialImpl(String alias, TrustLevel trustLevel) {
		this(trustLevel);
		this.entityID = alias;
	}
	
	public TrustAwareCredentialImpl(String alias, Key key, 
			TrustLevel trustLevel) {
		this(alias, trustLevel);
		if (key!=null) {
			if (key instanceof SecretKey) {
				this.secretKey = (SecretKey) key;
			} else if (key instanceof PrivateKey) {
				this.privateKey = (PrivateKey) key;
			} else {
				this.publicKey = (PublicKey) key;
			}
		}
	}
	
	public TrustAwareCredentialImpl(String alias, KeyPair keyPair, 
			TrustLevel trustLevel) {
		this(alias, trustLevel);
		if (keyPair!=null) {
			this.privateKey = keyPair.getPrivate();
			this.publicKey = keyPair.getPublic();
		}
	}
	
	public TrustAwareCredentialImpl(String alias, KeyPair keyPair, 
			UsageType usageType, TrustLevel trustLevel) {
		this(alias, keyPair, trustLevel);
		this.usageType = usageType;
	}
	
	/* (non-Javadoc)
	 * @see org.opensaml.lite.security.ITrustAware#getTrustLevel()
	 */
	public TrustLevel getTrustLevel() {
		return trustLevel;
	}
}
