package org.eclipse.e4.languages.javascript.rhino.jsdi.request;

import org.eclipse.e4.languages.javascript.debug.connect.DisconnectException;
import org.eclipse.e4.languages.javascript.debug.connect.Request;
import org.eclipse.e4.languages.javascript.debug.connect.Response;
import org.eclipse.e4.languages.javascript.debug.connect.TimeoutException;
import org.eclipse.e4.languages.javascript.jsdi.Location;
import org.eclipse.e4.languages.javascript.jsdi.ThreadReference;
import org.eclipse.e4.languages.javascript.jsdi.request.BreakpointRequest;
import org.eclipse.e4.languages.javascript.rhino.jsdi.ScriptReferenceImpl;
import org.eclipse.e4.languages.javascript.rhino.jsdi.VirtualMachineImpl;

public class BreakpointRequestImpl extends EventRequestImpl implements BreakpointRequest {

	private final Location location;
	private ThreadReference thread;
	private String condition;
	private Long breakpointId;

	public BreakpointRequestImpl(VirtualMachineImpl vm, Location location) {
		super(vm);
		this.location = location;
	}

	public synchronized void addThreadFilter(ThreadReference thread) {
		checkDeleted();
		this.thread = thread;
	}

	public synchronized ThreadReference thread() {
		return thread;
	}

	public synchronized void addConditionFilter(String condition) {
		checkDeleted();
		this.condition = condition;
	}

	public synchronized String condition() {
		return condition;
	}

	public Location location() {
		return location;
	}

	public synchronized void setEnabled(boolean enabled) {
		checkDeleted();
		if (this.enabled == enabled)
			return;

		if (enabled) {
			ScriptReferenceImpl scriptReferenceImpl = (ScriptReferenceImpl) location.scriptReference();
			Long scriptId = scriptReferenceImpl.getScriptId();

			Request request = new Request("setbreakpoint");
			request.getArguments().put("scriptId", scriptId);
			if (location.functionName() != null)
				request.getArguments().put("function", location.functionName());
			else
				request.getArguments().put("line", new Integer(location.lineNumber()));
			try {
				Response response = vm.sendRequest(request);
				breakpointId = new Long(((Number) response.getBody().get("breakpointId")).longValue());
			} catch (TimeoutException e) {
				e.printStackTrace();
			} catch (DisconnectException e) {
				e.printStackTrace();
			}
		} else {
			Request request = new Request("clearbreakpoint");
			request.getArguments().put("breakpointId", breakpointId);
			try {
				vm.sendRequest(request);
				breakpointId = null;
			} catch (TimeoutException e) {
				e.printStackTrace();
			} catch (DisconnectException e) {
				e.printStackTrace();
			}
		}
		this.enabled = enabled;
	}

	public Long breakpointId() {
		return breakpointId;
	}
}
