/*******************************************************************************
 * Copyright (c) 2010 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.jsdt.debug.internal.crossfire.request;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
import org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest;
import org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi.CFScriptReference;
import org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi.CFVirtualMachine;
import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.Attributes;
import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.CFRequestPacket;
import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.CFResponsePacket;
import org.eclipse.wst.jsdt.debug.internal.crossfire.transport.Commands;

/**
 * Default implementation of {@link BreakpointRequest} for Crossfire
 * 
 * @since 1.0
 */
public class CFBreakpointRequest extends CFThreadEventRequest implements BreakpointRequest {

	private String condition = null;
	private int hitcount = 0;
	private Location location = null;
	private Long bpid = null;
	
	/**
	 * Constructor
	 * @param vm
	 * @param location
	 */
	public CFBreakpointRequest(VirtualMachine vm, Location location) {
		super(vm);
		this.location = location;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Locatable#location()
	 */
	public Location location() {
		return location;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
	 */
	public void addThreadFilter(ThreadReference thread) {
		setThread(thread);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest#addConditionFilter(java.lang.String)
	 */
	public void addConditionFilter(String condition) {
		this.condition = condition;
	}

	/**
	 * Returns the {@link String} condition set for this request using {@link #addConditionFilter(String)} or <code>null</code>
	 * 
	 * @return the condition filter or <code>null</code>
	 */
	public String getConditionFilter() {
		return condition;
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest#addHitCountFilter(int)
	 */
	public void addHitCountFilter(int hitcount) {
		this.hitcount = hitcount;
	}

	/**
	 * Returns the hit count set using {@link #addHitCountFilter(int)} or <code>0</code>
	 * 
	 * @return the specified hit count or <code>0</code>
	 */
	public int getHitCount() {
		return hitcount;
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.wst.jsdt.debug.internal.crossfire.request.CFEventRequest#setEnabled(boolean)
	 */
	public void setEnabled(boolean enabled) {
		super.setEnabled(enabled);
		if(enabled) {
			//send setbreakpoint request
			CFScriptReference script = (CFScriptReference) location.scriptReference();
			CFRequestPacket request = new CFRequestPacket(Commands.SET_BREAKPOINT, script.context());
			request.setArgument(Attributes.TYPE, Attributes.LINE);
			Map loc = new HashMap();
			loc.put(Attributes.LINE, new Integer(location.lineNumber()));
			loc.put(Attributes.URL, script.id());
			request.setArgument(Attributes.LOCATION, loc);
			if (condition != null) {
				request.setArgument(Attributes.CONDITION, condition);	
			}
			request.setArgument(Attributes.ENABLED, Boolean.TRUE);
			CFResponsePacket response = ((CFVirtualMachine)virtualMachine()).sendRequest(request);
			if(response.isSuccess()) {
				//process the response to get the id of the breakpoint
				Map bp = (Map) response.getBody().get(Attributes.BREAKPOINT);
				if(bp != null) {
					Number id = (Number) bp.get(Attributes.HANDLE);
					bpid = new Long(id.longValue());
				}
			}
		}
		else if(bpid != null) {
			//send clearbreakpoint request
			CFScriptReference script = (CFScriptReference) location.scriptReference();
			CFRequestPacket request = new CFRequestPacket(Commands.CLEAR_BREAKPOINT, script.context());
			request.getArguments().put(Attributes.HANDLE, bpid);
			CFResponsePacket response = ((CFVirtualMachine)virtualMachine()).sendRequest(request);
			if(response.isSuccess()) {
				bpid = null;
			}
		}
	}
}
