/*******************************************************************************
* Copyright (c) 2014-2018 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/
*
* Contributors:
*    BAREAU Cyrille <cyrille.bareau@orange.com>
*    BONNARDEL Gregory <gbonnardel.ext@orange.com>
*    BORAWSKI Pawel <pawel.borawski@orange.com>
*    RATUSZEK Przemyslaw <przemyslaw.ratuszek@orange.com>
*    WIERZBOWSKI Jacek <jacek.wierzbowski@orange.com>
*******************************************************************************/
package org.eclipse.om2m.hue.impl.controller;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.om2m.hue.api.types.HueException;
import org.eclipse.om2m.hue.api.types.LightState;
import org.eclipse.om2m.hue.api.types.UnknownHueGatewayException;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

/**
 * Represents a light bulb associated to the Hue gateway
 * uses a {@link Utils} tool in order to command Hue gateway and change the light's state 
 */
public class Light extends PHDevice {

	/**
     * Logger
     */
    private static Log Logger = LogFactory.getLog(Light.class);
    
	/**
	 * light type 
	 */
	private String type;

	/**
	 * light modelId 
	 */
	private String modelId;

	/**
	 * light softwareVersion 
	 */
	private String softwareVersion;

	/**
	 * light reachability 
	 */
	private boolean reachable;

	// ====================================================================================

	/**
	 * @param IP Hue gateway IP address
	 * @param usr Hue gateway authorized user
	 * @param id light id
	 */
	public Light(final String IP, final String usr, final String id) {
		super(IP, usr, id, id);
		this.type = "";
		this.modelId = "";
		this.softwareVersion = "";
		this.reachable = false;

		// try to get more info
		try {
			// make GET request to retrieve light's information
			String resp = sendGetRequest(LIGHTS + "/" + id);
			JSONObject jsonLight = (JSONObject) new JSONParser().parse(resp);

			if ((jsonLight != null) && ! jsonLight.containsKey(ERROR)) {
				this.name = (String)jsonLight.get(NAME);
				this.modelId = (String)jsonLight.get(MODEL_ID);
				this.type = (String)jsonLight.get(TYPE);
				this.softwareVersion = (String)jsonLight.get(SW_VERSION);
				if (jsonLight.containsKey(STATE)) {
					JSONObject state = (JSONObject) jsonLight.get(STATE);
					this.reachable = ((Boolean)state.get(REACHABLE)).booleanValue();
				}
			}
		} catch (HueException e) {
			Logger.warn("", e);
		} catch (ParseException e) {
			Logger.warn("", e);
		} catch (UnknownHueGatewayException e) {
			Logger.warn("", e);
		} catch (Exception e) {
			Logger.warn("", e);
		}
	}


	// ====================================================================================

	/**
	 * @param s state {@link LightState} of the light to set  
	 * @throws HueException signaling REST resource path incorrect
	 * @throws UnknownHueGatewayException signaling that maybe the IP address of the gateway has changed
	 */
	public void setState(final LightState ls) throws HueException, UnknownHueGatewayException {
		// create JSON format object to send with PUT request
		JSONObject state = setStateObject(ls);
		// make PUT request, get JSON format string response
		String resp = sendPutRequest(LIGHTS + "/" + id + "/" + STATE, state.toString());
		if (resp.substring(3, 8).equals(ERROR)) {
			throw new HueException("ERROR while setting state for light : " 
					+ name + ", id : " + id + "\n\t" + resp);
		}
	}

	/**
	 * @return state {@link LightState} of the light
	 * @throws HueException signaling REST resource path incorrect
	 * @throws UnknownHueGatewayException 
	 */
	public LightState getState() throws HueException, UnknownHueGatewayException {	
		// make GET request
		String resp = sendGetRequest(LIGHTS + "/" + id);
		if (resp.substring(3, 8).equals(ERROR)) {
			//return null;
			throw new HueException("ERROR while getting state for light : " 
					+ name + ", id : " + id + "\n\t" + resp);
		}
		return getState(resp, STATE);
	}

	public String toString() {
		return "<Light id=" + id + " name=" + name + " gateway_IP=" + IP 
				+ " user_name=" + userName + " reachable=" + reachable + "/>";
	}

	public boolean equals(final Object obj){
		if (this == obj)
			return true;
		if ((obj == null) || (obj.getClass() != this.getClass()))
			return false;
		Light l = (Light)obj;
		return IP.equals(l.IP) && userName.equals(l.userName) && id.equals(l.id);		
	}

	/**
	 * @return the type
	 */
	public String getType() {
		return type;
	}

	/**
	 * @return the model id
	 */
	public String getModelId() {
		return modelId;
	}

	/**
	 * @return the software version
	 */
	public String getSoftwareversion() {
		return softwareVersion;
	}
	
	/**
	 * @return the reachability
	 */
	public boolean isReachable() {
		return reachable;
	}

}
