/**
 * Copyright (c) 2017 CEA.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 *  Contributors:
 *     CEA - initial API and implementation and/or initial documentation
 */
package org.eclipse.sensinact.studio.http.server;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;

import org.apache.log4j.Logger;
import org.eclipse.sensinact.studio.http.server.serverstarted.PortUpdate;
import org.eclipse.sensinact.studio.http.server.serverstarted.ResourceAddedUpdate;
import org.eclipse.sensinact.studio.http.server.serverstarted.ServerUpdatedManager;
import org.eclipse.sensinact.studio.preferences.ConfigurationListerner;
import org.eclipse.sensinact.studio.preferences.ConfigurationManager;
import org.eclipse.sensinact.studio.preferences.GatewayHttpConfig;
import org.restlet.Component;
import org.restlet.Restlet;
import org.restlet.data.Protocol;
import org.restlet.engine.Engine;
import org.restlet.resource.ServerResource;

public class GatewayHttpServer extends SensinactServerResource implements ConfigurationListerner {

	private static final Logger logger = Logger.getLogger(GatewayHttpServer.class);

	private Component serverComponent;

	private List<String> registeredPaths = new ArrayList<>();

	private boolean serverRuning = false;

	private static GatewayHttpServer instance;

	synchronized public static GatewayHttpServer getInstance() {
		if (instance == null) {
			instance = new GatewayHttpServer();
			try {
				int port = ConfigurationManager.getStudioPort();
				instance.initServer();
				instance.updateServerPort(port);
			} catch (Exception e) {
				logger.error("GatewayHttpServer creation", e);
			}
		}
		return instance;
	}

	public boolean isServerRuning() {
		return serverRuning;
	}

	private GatewayHttpServer() {
		ConfigurationManager.addListener(this);
		configureEngine();
	}

	private void configureEngine() {
		// Restlet global config
		Engine.setLogLevel(Level.OFF);

		// This is used to allow the server to return bundle resources
		Engine.getInstance().getRegisteredClients().add(new BundleResourceClientHelper(null));
	}

	private void initServer() throws Exception {
		if (serverComponent == null) {

			// Create the webapp component
			serverComponent = new Component();
			serverComponent.getClients().add(BundleResourceClientHelper.BUNDLERESOURCE);
		}
	}

	public void attach(String uriPattern, Restlet target) throws Exception {
		logger.debug("http resource registered: " + uriPattern);
		registeredPaths.add(uriPattern);
		serverComponent.getDefaultHost().attach(uriPattern, target);
		if (serverComponent.isStarted())
			ServerUpdatedManager.getInstance().notifyServerUpdated(new ResourceAddedUpdate(uriPattern, registeredPaths));
	}

	public void attach(String pathTemplate, Class<? extends ServerResource> targetClass) throws Exception {
		logger.debug("http resource registered: " + pathTemplate);
		registeredPaths.add(pathTemplate);
		serverComponent.getDefaultHost().attach(pathTemplate, targetClass);
		if (serverComponent.isStarted())
			ServerUpdatedManager.getInstance().notifyServerUpdated(new ResourceAddedUpdate(pathTemplate, registeredPaths));
	}

	public void updateServerPort(int port) throws Exception {
		// stop running server
		if (serverRuning) {
			serverRuning = false;
			serverComponent.stop();
			serverComponent.getServers().remove(0);
		}

		// start new server
		if (port != 0) {
			serverComponent.getServers().add(Protocol.HTTP, port);
			serverComponent.start();
			serverRuning = true;
		}

		// notify
		ServerUpdatedManager.getInstance().notifyServerUpdated(new PortUpdate(port));
	}

	/* ======================== */
	/* Config listener callback */
	/* ======================== */

	@Override
	public void studioPortUpdatedNotif(int port) {
		try {
			updateServerPort(port);
		} catch (Exception e) {
			logger.error("update server port", e);
		}
	}

	@Override
	public void gatewayAddedOrUpdatedNotif(GatewayHttpConfig gateway) {
		// do nothing
	}

	@Override
	public void gatewayRemovedNotif(String name) {
		// do nothing
	}
}
