/*******************************************************************************
 * Copyright (c) 2017 Huawei Technologies Co., Ltd (http://www.huawei.com)
 * Huawei Base, Bantian,Longgang District ,Shenzhen ,Guangdong ,China
 *
 * 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/
 *
 * Initial Contributors:
 *     Seven Ganlu : Developer
 *
 * New contributors :
 *******************************************************************************/

package org.eclipse.om2m.dal.driver.sample.fan.function;

import java.math.BigDecimal;
import java.util.Hashtable;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.osgi.service.dal.DeviceException;
import org.osgi.service.dal.FunctionData;
import org.osgi.service.dal.FunctionEvent;
import org.osgi.service.dal.PropertyMetadata;
import org.osgi.service.dal.functions.MultiLevelControl;
import org.osgi.service.dal.functions.data.LevelData;


import org.eclipse.om2m.dal.driver.custom.functions.BaseFunction;
import org.eclipse.om2m.dal.driver.custom.functions.CustomTypes;
import org.eclipse.om2m.dal.driver.sample.Activator;

/**
 * Speed control function
 */
public class Speed extends BaseFunction implements MultiLevelControl {

	/** Logger */
	private static Log LOGGER = LogFactory.getLog(Speed.class);
	public static BigDecimal LEVEL_0 = new BigDecimal(0);
	public static BigDecimal LEVEL_1 = new BigDecimal(1);
	public static BigDecimal LEVEL_2 = new BigDecimal(2);

	private SpeedValueMetadata speedValueMetadata;
	private BigDecimal data = LEVEL_0;

	/**
	 * Constructor
	 * 
	 * @param devUid
	 *            - device UID that this function belong to funcId - function ID
	 * @return
	 */
	public Speed(String devUid, String funcId) {
		super(devUid, CustomTypes.FAN_SPEED, funcId);
	}

	/**
	 * Return the current speed level
	 * 
	 * @param
	 * @return LevelData
	 */
	@Override
	public LevelData getData() throws DeviceException {
		return new LevelData(System.currentTimeMillis(),
				speedValueMetadata.getMetadata(null), data, "");
	}

	/**
	 * Set the speed level
	 * 
	 * @param
	 * @return LevelData
	 */
	@Override
	public void setData(BigDecimal level, String unit) throws DeviceException {

		// Valid check
		if (level.compareTo(LEVEL_0) != 0 && level.compareTo(LEVEL_1) != 0
				&& level.compareTo(LEVEL_2) != 0) {
			throw new DeviceException(String.format(
					"Input level is out of scope (%s, %s, %s)!",
					LEVEL_0.toString(), LEVEL_1.toString(), LEVEL_2.toString()));
		}

		this.data = level;
		Activator.getEventAdmin().postEvent(
				new FunctionEvent(FunctionEvent.TOPIC_PROPERTY_CHANGED,
						this.uid, PROPERTY_DATA, new LevelData(System
								.currentTimeMillis(), speedValueMetadata
								.getMetadata(null), data, "")));
		LOGGER.info("Function event (" + this.uid + "-" + this.data
				+ ") is sent.");
	}

	/**
	 * Setup the function properties
	 * 
	 * @param
	 * @return
	 */
	@Override
	protected void setupFuncProperties() {
		props.put(SERVICE_VERSION, "1.0");
		props.put(SERVICE_DESCRIPTION, "Speed control function");
		props.put(SERVICE_PROPERTY_NAMES, new String[] { PROPERTY_DATA });
	}

	/**
	 * Setup the meta data of function properties
	 * 
	 * @param
	 * @return
	 */
	@Override
	protected void setupPropertyMetadata() {
		speedValueMetadata = new SpeedValueMetadata();
		propMetadatas.put(PROPERTY_DATA, speedValueMetadata);
	}

	/**
	 * Setup the meta data of function operations
	 * 
	 * @param
	 * @return
	 */
	@Override
	protected void setupOperationMetadata() {

	}

	/**
	 * Property meta data implementation
	 * 
	 */
	private class SpeedValueMetadata implements PropertyMetadata {

		/** Meta data */
		private Map<String, Object> metadatas = null;

		/**
		 * Constructor
		 * 
		 */
		public SpeedValueMetadata() {
			metadatas = new Hashtable<String, Object>();
			metadatas.put(ACCESS,
					new Integer(ACCESS_READABLE | ACCESS_WRITABLE));
			metadatas.put(DESCRIPTION, "The current speed level.");
		}

		@SuppressWarnings("rawtypes")
		@Override
		public Map getMetadata(String unit) {
			return metadatas;
		}

		@Override
		public FunctionData getStep(String unit) {
			return null;
		}

		@Override
		public FunctionData[] getEnumValues(String unit) {
			return new FunctionData[] {
					new LevelData(0, metadatas, LEVEL_0, ""),
					new LevelData(0, metadatas, LEVEL_1, ""),
					new LevelData(0, metadatas, LEVEL_2, "") };
		}

		@Override
		public FunctionData getMinValue(String unit) {
			return null;
		}

		@Override
		public FunctionData getMaxValue(String unit) {
			return null;
		}

	}
}
