/*******************************************************************************
 * Copyright (c) 2014, 2016 Orange.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *******************************************************************************/
package org.eclipse.om2m.ipe.sdt;

import java.util.Dictionary;
import java.util.Hashtable;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.om2m.commons.constants.ResponseStatusCode;
import org.eclipse.om2m.commons.resource.AbstractFlexContainer;
import org.eclipse.om2m.commons.resource.CustomAttribute;
import org.eclipse.om2m.commons.resource.FlexContainer;
import org.eclipse.om2m.commons.resource.ResponsePrimitive;
import org.eclipse.om2m.sdt.Module;
import org.eclipse.om2m.sdt.events.SDTEventListener;
import org.eclipse.om2m.sdt.events.SDTNotification;
import org.osgi.framework.ServiceRegistration;

/**
 * This class handles notifications from SDT layer. An instance is registered
 * per SDT Module
 * 
 * @author MPCY8647
 *
 */
public class ModuleSDTListener implements SDTEventListener {

    private static Log logger = LogFactory.getLog(ModuleSDTListener.class);

	private final Module module;
	private final String moduleFlexContainerLocation;

	private ServiceRegistration<?> serviceRegistration;

	public ModuleSDTListener(final Module pModule, final String pModuleFlexContainerLocation) {
		this.module = pModule;
		this.moduleFlexContainerLocation = pModuleFlexContainerLocation;
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	public void register() {
		logger.info("registering as a SDTListener");
		if (serviceRegistration == null) {
			Dictionary properties = new Hashtable<>();
			properties.put(SDTEventListener.DOMAINS, "*");
			properties.put(SDTEventListener.DEVICES_IDS, module.getOwner().getId());
			properties.put(SDTEventListener.MODULES_NAMES, module.getName());
			properties.put(SDTEventListener.DATAPOINTS, "*");
			properties.put(SDTEventListener.DEVICES_DEFS, "*");
			properties.put(SDTEventListener.MODULES_DEFS, "*");

			serviceRegistration = Activator.registerSDTListener(this, properties);

			logger.info("register as a SDTListener - DONE");
		} else {
			logger.error("ModuleSDTListener has been previously registered!!!", null);
		}
	}

	public void unregister() {
		logger.info("unregistering as a SDTListener");
		if (serviceRegistration != null) {
			serviceRegistration.unregister();
			serviceRegistration = null;
		}
	}

	@Override
	public void handleNotification(SDTNotification notif) {
		logger.info("receive a notification for " + notif.getDataPoint().getName() 
				+ ", value=" + notif.getValue());

		AbstractFlexContainer toBeUpdated = new FlexContainer();
		CustomAttribute ca = new CustomAttribute();
		ca.setShortName(notif.getDataPoint().getName());
		Object value = notif.getValue();
		ca.setValue((value != null ? value.toString() : null));
		toBeUpdated.getCustomAttributes().add(ca);

		ResponsePrimitive response = CseUtil.sendInternalNotifyFlexContainerRequest(toBeUpdated, 
				moduleFlexContainerLocation);
		if (! ResponseStatusCode.UPDATED.equals(response.getResponseStatusCode())) {
			logger.info("unable to send INTERNAL NOTIFY request to flexContainer " 
					+ moduleFlexContainerLocation + " : " + response.getContent(),
					null);
		} else {
			logger.debug("INTERNAL NOTIFY request successfully performed");
		}
	}

	@Override
	public void setAuthenticationThreadGroup(ThreadGroup group) {

	}
	
}
