/**
 * 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.view.visualizer.graphmanager;

import java.util.concurrent.atomic.AtomicBoolean;

import org.eclipse.nebula.visualization.xygraph.dataprovider.CircularBufferDataProvider;
import org.eclipse.nebula.visualization.xygraph.figures.Trace;
import org.eclipse.nebula.visualization.xygraph.figures.Trace.PointStyle;
import org.eclipse.sensinact.studio.model.resource.utils.ResourceDescriptor;
import org.eclipse.nebula.visualization.xygraph.figures.XYGraph;
import org.eclipse.swt.widgets.Display;

/**
 * @author Etienne Gandrille
 */
public class GraphManager {

	private final XYGraph graph;
	private final AtomicBoolean isRuning;
	private double value;
	private final CircularBufferDataProvider traceDataProvider;
	private final Trace trace;

	private final double Y_MIN_INIT = 0;
	private final double Y_MAX_INIT = 1;
	private double yMin = Y_MIN_INIT;
	private double yMax = Y_MAX_INIT;

	private final int TIMER_PERIOD_MS = 250;
	private final int NUMBER_OF_VALUES = 100;
	
	public GraphManager(XYGraph graph) {
		this.graph = graph;
		this.isRuning = new AtomicBoolean(false);

		graph.setTitle("");
		graph.primaryXAxis.setTitle("Time");
		graph.primaryXAxis.setDateEnabled(true);
		graph.primaryXAxis.setFormatPattern("HH:mm:ss");
		
		
		graph.primaryYAxis.setTitle("value");
		graph.primaryYAxis.setAutoScale(false);
		graph.primaryXAxis.setAutoScale(true);
		
		traceDataProvider = new CircularBufferDataProvider(true);
		traceDataProvider.setBufferSize(NUMBER_OF_VALUES);

		trace = new Trace("values", graph.primaryXAxis, graph.primaryYAxis, traceDataProvider);
		trace.setPointStyle(PointStyle.POINT);
		graph.addTrace(trace);
		graph.setShowLegend(false);
	}

	public void start(ResourceDescriptor rDescriptor) {
		if (!isRuning.getAndSet(true)) {
			traceDataProvider.clearTrace();

			graph.setTitle(rDescriptor.getDevice() + "/" + rDescriptor.getService() + "/" + rDescriptor.getResource());
			yMin = Y_MIN_INIT;
			yMax = Y_MAX_INIT;
			trace.getYAxis().setRange(Y_MIN_INIT,Y_MAX_INIT);
						
			Runnable updater = new Runnable() {
				public void run() {
					double curVal = value; // local copy
					traceDataProvider.setCurrentYData(curVal, System.currentTimeMillis());
					
					if (yMin > curVal) {
						yMin = curVal;
						trace.getYAxis().setRange(yMin, yMax);
					} else if (yMax < curVal) {
						yMax = curVal;
						trace.getYAxis().setRange(yMin, yMax);
					}

					if (isRuning.get()) {
						Display.getDefault().timerExec(TIMER_PERIOD_MS, this);
					}
				}
			};

			Display.getDefault().timerExec(0, updater);
		}
	}

	public void stop() {
		isRuning.set(false);
	}

	public void setValue(double newValue) {
		value = newValue;
	}

	boolean isRunning() {
		return isRuning.get();
	}
}
