/*
 * ServiceConfig
 * Connect SDK
 * 
 * Copyright (c) 2014 LG Electronics.
 * Created by Hyun Kook Khang on 19 Jan 2014
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.connectsdk.service.config;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

import org.json.JSONException;
import org.json.JSONObject;

import com.connectsdk.core.Util;

public class ServiceConfig {
	public static final String KEY_CLASS = "class";
	public static final String KEY_LAST_DETECT = "lastDetection";
	public static final String KEY_UUID = "UUID";
	private String serviceUUID;
	private long lastDetected = Long.MAX_VALUE;
	
	boolean connected;
	boolean wasConnected;
	
	public ServiceConfigListener listener;
	
	public ServiceConfig(String serviceUUID) {
		this.serviceUUID = serviceUUID;
	}
	
	public ServiceConfig(ServiceDescription desc) {
		this.serviceUUID = desc.getUUID();
		this.connected = false;
		this.wasConnected = false;
		this.lastDetected = Util.getTime();
	}
	
	public ServiceConfig(ServiceConfig config) {
		this.serviceUUID = config.serviceUUID;
		this.connected = config.connected;
		this.wasConnected = config.wasConnected;
		this.lastDetected = config.lastDetected;
		
		this.listener = config.listener;
	}
	
	public ServiceConfig(JSONObject json) {
		serviceUUID = json.optString(KEY_UUID);
		lastDetected = json.optLong(KEY_LAST_DETECT);
	}
	
	@SuppressWarnings("unchecked")
	public static ServiceConfig getConfig(JSONObject json) {
		Class<ServiceConfig> newServiceClass;
		try {
			newServiceClass = (Class<ServiceConfig>) Class.forName(ServiceConfig.class.getPackage().getName() + "." + json.optString(KEY_CLASS));
			Constructor<ServiceConfig> constructor = newServiceClass.getConstructor(JSONObject.class);
			
			return constructor.newInstance(json);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
		
		return null;
	}
	
	public String getServiceUUID() {
		return serviceUUID;
	}
	
	public void setServiceUUID(String serviceUUID) {
		this.serviceUUID = serviceUUID;
	}

	public String toString() { 
		return serviceUUID;
	}
	
	public long getLastDetected() {
		return lastDetected;
	}
	
	public void setLastDetected(long value) {
		lastDetected = value;
	}
	
	public void detect() {
		lastDetected = Util.getTime();
	}
	
	public ServiceConfigListener getListener() {
		return listener;
	}

	public void setListener(ServiceConfigListener listener) {
		this.listener = listener;
	}

	public JSONObject toJSONObject() {
		JSONObject jsonObj = new JSONObject();

		try {
			jsonObj.put(KEY_CLASS, this.getClass().getSimpleName());
			jsonObj.put(KEY_LAST_DETECT, lastDetected);
			jsonObj.put(KEY_UUID, serviceUUID);
		} catch (JSONException e) {
			e.printStackTrace();
		}
		
		return jsonObj;
	}
	
	public static interface ServiceConfigListener {
		public void onServiceConfigUpdate(ServiceConfig serviceConfig);
	}
}
