/**
 * <copyright>
 *
 * Copyright (c) 2009 Metascape, LLC.
 * 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:
 *   Metascape - Initial API and Implementation
 *
 * </copyright>
 *
 */
package org.eclipse.amp.escape.command;

import org.eclipse.amp.axf.time.TimeGranularity;
import org.eclipse.amp.escape.ide.EclipseEscapeRunner;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.expressions.EvaluationContext;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.viewers.IStructuredSelection;

import org.ascape.runtime.Runner;

// TODO: Auto-generated Javadoc
/**
 * The Class ExecuteHandler.
 */
public abstract class ExecuteHandler extends ResourceHandler {

    private boolean headless;

    /**
     * Instantiates a new execute handler.
     * 
     * @param headless the headless
     */
    public ExecuteHandler(boolean headless) {
        super();
        this.setHeadless(headless);
    }

    /**
     * Starts a new job with a {@link EclipseEscapeRunner} that executes 
     * the scape.
     * 
     * @param executed scape resource/class name to execute
     * @param name scape name
     * @throws ExecutionException if problem executing
     */
    @Override
    public final void execute(final Object executed, String name) throws ExecutionException {
        Job escapeRun = new Job("Run " + name) {
        	private EclipseEscapeRunner eclipseRunner;
            @Override
						protected IStatus run(IProgressMonitor monitor) {
                setMonitor(monitor);
                try {
                    eclipseRunner = executeOpen(executed, monitor);
                } catch (RuntimeException e) {
                    setMonitor(null);
                    throw e;
                }
                setMonitor(null);
                if(eclipseRunner != null){
                	return eclipseRunner.getFinishStatus();
                }else{
                	return Status.CANCEL_STATUS;
                }
            }

            @Override
						protected void canceling() {
            	if(eclipseRunner != null){
                eclipseRunner.setFinishStatus(Status.CANCEL_STATUS);
                eclipseRunner.closeFinally();
            	}
            }
        };
        escapeRun.setPriority(Job.LONG);
        escapeRun.schedule();
    }

    /**
     * Execute open.
     * 
     * @param executed the executed scape resource/name
     * @param monitor the monitor
     */
    protected abstract EclipseEscapeRunner executeOpen(final Object executed,
            IProgressMonitor monitor);

    /**
     * Creates the runner.
     * 
     * @return the eclipse escape runner
     */
    protected EclipseEscapeRunner createRunner() {
        // TODO this is still static on Ascape side..trouble if we attempt to run headless and non-headless jobs
        Runner.setDisplayGraphics(!isHeadless());
        return new EclipseEscapeRunner();
    }


    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.core.commands.AbstractHandler#setEnabled(java.lang.Object)
     */
    @Override
    public void setEnabled(Object evaluationContext) {
        EvaluationContext ctx = (EvaluationContext) evaluationContext;
        Object selection = ctx.getVariable("selection");
        if (selection instanceof IStructuredSelection) {
            boolean enabled = false;
            IStructuredSelection ss = (IStructuredSelection) selection;
            if (ss != null && ss.getFirstElement() != null) {
                Object fs = ss.getFirstElement();
                enabled = handleSelect(fs);
            }
            // } else if (selection instanceof ITextSelection) {
            // enabled = handleSelect(selection);
            setBaseEnabled(enabled);
        }
    }

    /**
     * Handle select.
     * 
     * @param sel the sel
     * 
     * @return true, if successful
     */
    protected abstract boolean handleSelect(Object sel);

    public void setHeadless(boolean headless) {
        this.headless = headless;
    }

    public boolean isHeadless() {
        return headless;
    }
}
