package org.eclipse.emf.emfstore.jax.client;

import javax.net.ssl.SSLContext;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;

import org.eclipse.emf.emfstore.client.exceptions.ESCertificateException;
import org.eclipse.emf.emfstore.internal.client.model.ServerInfo;
import org.eclipse.emf.emfstore.internal.client.model.connectionmanager.KeyStoreManager;
import org.eclipse.emf.emfstore.internal.server.exceptions.ConnectionException;
import org.glassfish.jersey.client.ClientProperties;
import org.glassfish.jersey.client.RequestEntityProcessing;
import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;

/**
 * manager for handling a JAX-RS client (contains the proper WebTarget, username, password)
 *
 * @author Pascal Schliski
 *
 */
@SuppressWarnings("restriction")
public class JaxrsClientManager {

	private static final int CHUNKED_ENCODING_SIZE = 1024;
	private WebTarget target;
	private final String username;
	private final String password;

	/**
	 * default constructor
	 *
	 * @param serverInfo the serverInfo of the server that is targeted
	 * @param username username of the client
	 * @param password password of the client, already encoded
	 * @throws ESCertificateException
	 */
	public JaxrsClientManager(ServerInfo serverInfo, String username, String password) throws
		ESCertificateException {

		this.username = username;
		this.password = password;

		initWebTarget(serverInfo, username, password);

	}

	/**
	 * initialize the webTarget
	 *
	 * @param serverInfo
	 * @param username
	 * @param password
	 * @throws ConnectionException
	 * @throws ESCertificateException
	 */
	private void initWebTarget(ServerInfo serverInfo, String username, String password) throws ESCertificateException {

		// enable HTTP BasicAuth
		final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic(username, password);

		// enable ssl connection
		final SSLContext sslContext = KeyStoreManager.getInstance().getSSLContext();

		// create the client with SSL, BasicAuth and chunked encoding (the lather is crucial for getting real
		// streaming)
		final Client client = ClientBuilder.newBuilder().sslContext(sslContext).register(feature)
			.property(ClientProperties.CHUNKED_ENCODING_SIZE, CHUNKED_ENCODING_SIZE)
			.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.CHUNKED).build();

		// target the server
		target = client.target("https://" + serverInfo.getUrl() + ":" + serverInfo.getPort() + "/" + "services"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$

	}

	/**
	 * @return the webTarget, on which calls are created
	 */
	public WebTarget getTarget() {
		return target;
	}

	public String getUsername() {
		return username;
	}

	public String getPassword() {
		return password;
	}
}
