/*******************************************************************************
 * Copyright (c) 2016 CEA LIST.
 *
 * 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
 *
 * Created on: 20 mai 2010
 *
 * Contributors:
 *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
 *   - Initial API and implementation
 ******************************************************************************/

#include "AvmItePrimitive.h"

#include <computer/EvaluationEnvironment.h>
#include <computer/ExecutionEnvironment.h>

#include <computer/PathConditionProcessor.h>

#include <fml/expression/AvmCode.h>
#include <fml/expression/ExpressionConstructor.h>

#include <fml/runtime/ExecutionData.h>
#include <fml/runtime/RuntimeID.h>

#include <solver/api/SolverFactory.h>


namespace sep
{


/**
 ***************************************************************************
 * execution of an IF program
 ***************************************************************************
 */
bool AvmPrimitive_If::run(ExecutionEnvironment & ENV)
{
	if( ENV.mARG->at(0).isEqualTrue() )
	{
		// THEN STATEMENT
		ExecutionEnvironment tmpENV(ENV, ENV.mARG->outED, ENV.mARG->at(1).bfCode());
		if( tmpENV.run() )
		{
			ENV.spliceOutput( tmpENV );
		}
		else
		{
			return( false );
		}
	}
	else if( ENV.mARG->at(0).isEqualFalse() )
	{
		ENV.appendOutput( ENV.mARG->outED );
//		ENV.xappendOutED( ENV.mARG->outED , aProgram );
	}

	else
	{
		// THEN STATEMENT
		ExecutionEnvironment tmpENV(ENV, ENV.mARG->outED, ENV.mARG->at(0));
		if( PathConditionProcessor::appendPathCondition(tmpENV) )
		{
			if( tmpENV.runFromOutputs(ENV.mARG->at(1).bfCode()) )
			{
				ENV.spliceOutput( tmpENV );
			}
			else
			{
				return( false );
			}

			////////////////////////////////////////////////////////////////
			// CASE ELSE { NOP }
			BF elseCond = ExpressionConstructor::notExpr(ENV.mARG->at(0));
			if( not PathConditionProcessor::appendPathCondition(
					ENV, ENV.mARG->outED, elseCond) )
			{
				// NOTHING
			}
		}
		else
		{
			////////////////////////////////////////////////////////////////
			// CASE ELSE { NOP }
			ENV.appendOutput( ENV.inED );
		}
	}

	return( true );
}


/**
 ***************************************************************************
 * execution of an IFE program
 ***************************************************************************
 */
bool AvmPrimitive_Ife::run(ExecutionEnvironment & ENV)
{
	if( ENV.mARG->at(0).isEqualTrue() )
	{
		// THEN STATEMENT
		ExecutionEnvironment tmpENV(ENV, ENV.mARG->outED, ENV.mARG->at(1).bfCode());
		if( tmpENV.run() )
		{
			ENV.spliceOutput( tmpENV );
		}
		else
		{
			return( false );
		}
	}
	else if( ENV.mARG->at(0).isEqualFalse() )
	{
		// ELSE STATEMENT
		ExecutionEnvironment tmpENV(ENV, ENV.mARG->at(2).bfCode());
		if( tmpENV.run() )
		{
			ENV.spliceOutput( tmpENV );
		}
		else
		{
			return( false );
		}
	}

	else
	{
		// THEN STATEMENT
		ExecutionEnvironment thenENV(ENV, ENV.mARG->outED, ENV.mARG->at(0));
		if( PathConditionProcessor::appendPathCondition(thenENV) )
		{
			if( thenENV.runFromOutputs(ENV.mARG->at(1).bfCode()) )
			{
				ENV.spliceOutput( thenENV );
			}
			else
			{
				return( false );
			}
		}

		////////////////////////////////////////////////////////////////
		// ELSE STATEMENT
		BF elseCond = ExpressionConstructor::notExpr(ENV.mARG->at(0));
		ExecutionEnvironment elseENV(ENV, ENV.mARG->outED, elseCond);
		if( PathConditionProcessor::appendPathCondition(elseENV) )
		{
			if( elseENV.runFromOutputs(ENV.mARG->at(2).bfCode()) )
			{
				ENV.spliceOutput( elseENV );
			}
			else
			{
				return( false );
			}
		}
	}

	return( true );
}




}
