/**
 * Copyright (c) 2019 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.navigator.device;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelEditor;
import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelUpdater;
import org.eclipse.sensinact.studio.navigator.device.filter.SensinactTreeViewer;
import org.eclipse.sensinact.studio.resource.Device;
import org.eclipse.sensinact.studio.resource.Gateway;
import org.eclipse.sensinact.studio.resource.Resource;
import org.eclipse.sensinact.studio.resource.Service;
import org.eclipse.sensinact.studio.resource.Studio;
import org.eclipse.sensinact.studio.resource.impl.DeviceImpl;
import org.eclipse.sensinact.studio.resource.impl.GatewayImpl;

/**
 * @author Nicolas Hili, Etienne Gandrille
 *
 */
public class DeviceNavigatorContentProvider implements ITreeContentProvider {

	protected SensinactTreeViewer viewer;
	
	public DeviceNavigatorContentProvider() {
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
	 */
	@Override
	public void dispose() {
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
	 */
	@Override
	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
		this.viewer=(SensinactTreeViewer)viewer;
		this.viewer.setLabelProvider(new DeviceNavigatorLabelProvider());
	}
	

	/* (non-Javadoc)
	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getElements(java.lang.Object)
	 */
	@Override
	public Object[] getElements(Object inputElement) {
		return getChildren(inputElement);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
	 */
	@Override
	public Object[] getChildren(Object parentElement) {
		if (parentElement instanceof Studio) {
			return ((Studio) parentElement).getGateways().toArray();
		} else if (parentElement instanceof Gateway) {
			return ((Gateway) parentElement).getDevice().toArray();	
		} else if (parentElement instanceof Device) {
//			try {
//				DeviceImpl device=(DeviceImpl)parentElement;
//				GatewayImpl gateway=(GatewayImpl)device.eContainer();
//				if(ModelEditor.getInstance().getServicesId(gateway.getName(),device.getName()).size()==0)
//					ModelUpdater.getInstance().updateServices(gateway.getName(),device.getName());				
//			} catch (Exception e) {
//				e.printStackTrace();
//			}
			return ((Device) parentElement).getService().toArray();
		} else if (parentElement instanceof Service) {
			return ((Service) parentElement).getResource().toArray();
		} 
		
		return new Object[0];
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
	 */
	@Override
	public Object getParent(Object element) {
		return ((EObject) element).eContainer();
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
	 */
	@Override
	public boolean hasChildren(Object element) {
		EObject eobject=(EObject)element;
		if(element instanceof Device){
			return true;
		}else if(element instanceof Resource){
			return false;
		}
		return eobject.eContents().size()>0;
	}
}
