/*******************************************************************************
 * 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: 11 févr. 2009
 *
 * Contributors:
 *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
 *   - Initial API and implementation
 ******************************************************************************/

#include "avm_debug.h"

#include <util/avm_string.h>


namespace sep {


/**
 ***************************************************************************
 * AVM DEBUG LEVEL
 ***************************************************************************
 */
unsigned short  _AVM_DEBUG_LEVEL_ = AVM_DEBUG_ZERO_LEVEL;


/**
 ***************************************************************************
 * AVM DEBUG KIND
 ***************************************************************************
 */
std::size_t  _AVM_DEBUG_FLAG_ = AVM_DEBUG_NOTHING_FLAG;



/**
 * avm_setDebugLevel
 * avm_unsetDebugLevel
 */
void avm_setDebugLevel(std::string strDebugLevel)
{
#define SET_DEBUG_LEVEL( level )   \
	else if( strDebugLevel == #level )  AVM_DEBUG_SET_LEVEL( level )

	StringTools::toupper(strDebugLevel);

	if( strDebugLevel.empty() )  AVM_DEBUG_SET_LEVEL( ZERO )

	SET_DEBUG_LEVEL( ZERO     )

	SET_DEBUG_LEVEL( LOW      )
	SET_DEBUG_LEVEL( MEDIUM   )

	SET_DEBUG_LEVEL( HIGH     )
	SET_DEBUG_LEVEL( ULTRA    )

	SET_DEBUG_LEVEL( GOD_MODE )

	else AVM_DEBUG_SET_LEVEL( ZERO )
}


void avm_unsetDebugLevel(std::string strDebugLevel)
{
#define UNSET_DEBUG_EXCEPT_LEVEL( level )   \
	else if( strDebugLevel == #level )  AVM_DEBUG_SET_LEVEL( ZERO )

#define UNSET_DEBUG_LEVEL( level )   \
	else if( strDebugLevel == #level )  AVM_DEBUG_UNSET_LEVEL( level )

	StringTools::toupper(strDebugLevel);

	if( strDebugLevel.empty() )  AVM_DEBUG_SET_LEVEL( ZERO )

	UNSET_DEBUG_LEVEL( LOW    )
	UNSET_DEBUG_LEVEL( MEDIUM )

	UNSET_DEBUG_LEVEL( HIGH   )
	UNSET_DEBUG_LEVEL( ULTRA  )

	UNSET_DEBUG_EXCEPT_LEVEL( ZERO     )
	UNSET_DEBUG_EXCEPT_LEVEL( GOD_MODE )

	else AVM_DEBUG_SET_LEVEL( ZERO )
}

std::string avm_strDebugLevel()
{
#define PRINT_DEBUG_LEVEL( level )   \
	case AVM_DEBUG_##level##_LEVEL :  return( #level );

	switch( _AVM_DEBUG_LEVEL_ )
	{
		PRINT_DEBUG_LEVEL( ZERO     )

		PRINT_DEBUG_LEVEL( LOW      )
		PRINT_DEBUG_LEVEL( MEDIUM   )

		PRINT_DEBUG_LEVEL( HIGH     )
		PRINT_DEBUG_LEVEL( ULTRA    )

		PRINT_DEBUG_LEVEL( GOD_MODE )

		default: return( "DEBUG#LEVEL< UNKNOWN >" );
	}
}


/**
 * avm_setDebugFlag
 * avm_unsetDebugFlag
 */
void avm_setDebugFlag(std::string strDebugFlag)
{
#define SET_DEBUG_FLAG( flag )   \
		else if( strDebugFlag == #flag  )  AVM_DEBUG_ENABLE_FLAG( flag )


	if( _AVM_DEBUG_FLAG_ == AVM_DEBUG_ALL_FLAG )
	{
		return;
	}
	else if( strDebugFlag.empty() || strDebugFlag == "NOTHING" ) {
		_AVM_DEBUG_FLAG_ = AVM_DEBUG_NOTHING_FLAG;
	}

	// General Context

	SET_DEBUG_FLAG( PARSING                 )

	SET_DEBUG_FLAG( CONFIGURING             )

	SET_DEBUG_FLAG( COMPILING               )

	SET_DEBUG_FLAG( LOADING                 )

	SET_DEBUG_FLAG( COMPUTING               )

	SET_DEBUG_FLAG( REPORTING               )

	SET_DEBUG_FLAG( SOLVING                 )
	SET_DEBUG_FLAG( SAT_SOLVING             )
	SET_DEBUG_FLAG( SMT_SOLVING             )

	SET_DEBUG_FLAG( PROFILING               )


	// Process Stage: Processing, Filtering, ...

	SET_DEBUG_FLAG( ALL_PROCESS_STAGE       )
	SET_DEBUG_FLAG( PROCESSOR               )

	SET_DEBUG_FLAG( PROCESSING              )
	SET_DEBUG_FLAG( PRE_PROCESSING          )
	SET_DEBUG_FLAG( POST_PROCESSING         )

	SET_DEBUG_FLAG( FILTERING               )
	SET_DEBUG_FLAG( PRE_FILTERING           )
	SET_DEBUG_FLAG( POST_FILTERING          )

	SET_DEBUG_FLAG( QUEUE                   )
	SET_DEBUG_FLAG( QUEUING                 )


	// Statement Evaluation

	SET_DEBUG_FLAG( PROGRAM                 )

	SET_DEBUG_FLAG( STATEMENT               )

	SET_DEBUG_FLAG( ASSIGNMENT              )
	SET_DEBUG_FLAG( STATEMENT_ASSIGNMENT    )

	SET_DEBUG_FLAG( COMMUNICATION           )
	SET_DEBUG_FLAG( STATEMENT_COMMUNICATION )

	SET_DEBUG_FLAG( STATEMENT_CONTROL       )
	SET_DEBUG_FLAG( STATEMENT_SCHEDULING    )

	SET_DEBUG_FLAG( TEST_DECISION           )
	SET_DEBUG_FLAG( STATEMENT_TEST_DECISION )

	SET_DEBUG_FLAG( BYTECODE                )

	SET_DEBUG_FLAG( DATA                    )

	SET_DEBUG_FLAG( TRACE                   )


	// Element: Property, Signal...

	SET_DEBUG_FLAG( VARIABLE                )

	SET_DEBUG_FLAG( BUFFER                  )

	SET_DEBUG_FLAG( PORT                    )

	SET_DEBUG_FLAG( SIGNAL                  )

	SET_DEBUG_FLAG( CONNEXION               )

	SET_DEBUG_FLAG( TIME                    )


	// Executable Component...

	SET_DEBUG_FLAG( EXECUTABLE              )

	SET_DEBUG_FLAG( PRIMITIVE               )

	SET_DEBUG_FLAG( ACTIVITY                )

	SET_DEBUG_FLAG( ROUTINE                 )

	SET_DEBUG_FLAG( TRANSITION              )

	SET_DEBUG_FLAG( MACHINE                 )

	SET_DEBUG_FLAG( STATEMACHINE            )


	// Others: [Qualified]NameID, RefCount, ...

	SET_DEBUG_FLAG( NAME_ID                 )

	SET_DEBUG_FLAG( QUALIFIED_NAME_ID       )

	SET_DEBUG_FLAG( FULLY_QUALIFIED_NAME_ID )


	SET_DEBUG_FLAG( CAS                     )

	SET_DEBUG_FLAG( REDUNDANCE              )


	SET_DEBUG_FLAG( REFERENCE_COUNTING      )

	// God Mode
	SET_DEBUG_FLAG( ALL                     )
	SET_DEBUG_FLAG( GOD_MODE                )
}


void avm_unsetDebugFlag(std::string strDebugFlag)
{
#define UNSET_DEBUG_FLAG( flag )   \
		else if( strDebugFlag == #flag )  AVM_DEBUG_DISABLE_FLAG( flag )


	if( _AVM_DEBUG_FLAG_ == AVM_DEBUG_NOTHING_FLAG )
	{
		return;
	}
	else if( strDebugFlag.empty()
		|| strDebugFlag == "NOTHING" ) {
		_AVM_DEBUG_FLAG_ = AVM_DEBUG_NOTHING_FLAG;

		return;
	}

	// General Context

	UNSET_DEBUG_FLAG( PARSING                 )

	UNSET_DEBUG_FLAG( CONFIGURING             )

	UNSET_DEBUG_FLAG( COMPILING               )

	UNSET_DEBUG_FLAG( LOADING                 )

	UNSET_DEBUG_FLAG( COMPUTING               )

	UNSET_DEBUG_FLAG( REPORTING               )

	UNSET_DEBUG_FLAG( SOLVING                 )
	UNSET_DEBUG_FLAG( SAT_SOLVING             )
	UNSET_DEBUG_FLAG( SMT_SOLVING             )

	UNSET_DEBUG_FLAG( PROFILING               )


	// Process Stage: Processing, Filtering, ...

	UNSET_DEBUG_FLAG( ALL_PROCESS_STAGE       )
	UNSET_DEBUG_FLAG( PROCESSOR               )

	UNSET_DEBUG_FLAG( PROCESSING              )
	UNSET_DEBUG_FLAG( PRE_PROCESSING          )
	UNSET_DEBUG_FLAG( POST_PROCESSING         )

	UNSET_DEBUG_FLAG( FILTERING               )
	UNSET_DEBUG_FLAG( PRE_FILTERING           )
	UNSET_DEBUG_FLAG( POST_FILTERING          )

	UNSET_DEBUG_FLAG( QUEUE                   )
	UNSET_DEBUG_FLAG( QUEUING                 )


	// Statement Evaluation

	UNSET_DEBUG_FLAG( PROGRAM                 )

	UNSET_DEBUG_FLAG( STATEMENT               )

	UNSET_DEBUG_FLAG( ASSIGNMENT              )
	UNSET_DEBUG_FLAG( STATEMENT_ASSIGNMENT    )

	UNSET_DEBUG_FLAG( COMMUNICATION           )
	UNSET_DEBUG_FLAG( STATEMENT_COMMUNICATION )

	UNSET_DEBUG_FLAG( STATEMENT_CONTROL       )
	UNSET_DEBUG_FLAG( STATEMENT_SCHEDULING    )

	UNSET_DEBUG_FLAG( TEST_DECISION           )
	UNSET_DEBUG_FLAG( STATEMENT_TEST_DECISION )

	UNSET_DEBUG_FLAG( BYTECODE                )

	UNSET_DEBUG_FLAG( DATA                    )

	UNSET_DEBUG_FLAG( TRACE                   )


	// Element: Property, Signal...

	UNSET_DEBUG_FLAG( VARIABLE                )

	UNSET_DEBUG_FLAG( BUFFER                  )

	UNSET_DEBUG_FLAG( PORT                    )

	UNSET_DEBUG_FLAG( SIGNAL                  )

	UNSET_DEBUG_FLAG( CONNEXION               )

	UNSET_DEBUG_FLAG( TIME                    )


	// Executable Component...

	UNSET_DEBUG_FLAG( EXECUTABLE              )

	UNSET_DEBUG_FLAG( PRIMITIVE               )

	UNSET_DEBUG_FLAG( ACTIVITY                )

	UNSET_DEBUG_FLAG( ROUTINE                 )

	UNSET_DEBUG_FLAG( TRANSITION              )

	UNSET_DEBUG_FLAG( MACHINE                 )

	UNSET_DEBUG_FLAG( STATEMACHINE            )


	// Others: [Qualified]NameID, RefCount, ...

	UNSET_DEBUG_FLAG( NAME_ID                 )

	UNSET_DEBUG_FLAG( QUALIFIED_NAME_ID       )

	UNSET_DEBUG_FLAG( FULLY_QUALIFIED_NAME_ID )


	UNSET_DEBUG_FLAG( CAS                     )

	UNSET_DEBUG_FLAG( REDUNDANCE              )


	UNSET_DEBUG_FLAG( REFERENCE_COUNTING      )

	// God Mode
	UNSET_DEBUG_FLAG( ALL                     )
	UNSET_DEBUG_FLAG( GOD_MODE                )
}


std::string avm_strDebugFlag(const std::string & sep)
{
	if( _AVM_DEBUG_FLAG_ == AVM_DEBUG_NOTHING_FLAG )
	{
		return( "NOTHING" );
	}
	if( _AVM_DEBUG_FLAG_ == AVM_DEBUG_GOD_MODE_FLAG )
	{
		return( "GOD_MODE" );
	}
	if( _AVM_DEBUG_FLAG_ == AVM_DEBUG_ALL_FLAG )
	{
		return( "ALL" );
	}
	else
	{
		std::ostringstream oss;
		bool needSep = false;

#define STR_DEBUG_FLAG( flag )  \
		if( AVM_DEBUG_FLAG_ENABLED( flag ) )  \
		{ oss << (needSep ? sep : "") << #flag; needSep = true; }

#define STR_DEBUG_GROUP( flag )   \
		if( AVM_DEBUG_FLAG_GROUP_ENABLED( flag ) )  \
		{ oss << (needSep ? sep : "") << #flag; needSep = true; }

		// General Context

		STR_DEBUG_FLAG( PARSING                 )

		STR_DEBUG_FLAG( CONFIGURING             )

		STR_DEBUG_FLAG( COMPILING               )

		STR_DEBUG_FLAG( LOADING                 )

		STR_DEBUG_FLAG( COMPUTING               )

		STR_DEBUG_FLAG( REPORTING               )

		STR_DEBUG_FLAG( SOLVING                 )
//		STR_DEBUG_FLAG( SAT_SOLVING             )
//		STR_DEBUG_FLAG( SMT_SOLVING             )

		STR_DEBUG_FLAG( PROFILING               )


		// Process Stage: Processing, Filtering, ... ...

		STR_DEBUG_FLAG( ALL_PROCESS_STAGE       )

		STR_DEBUG_FLAG( QUEUE                   )
		STR_DEBUG_FLAG( QUEUING                 )


		// Statement Evaluation

		STR_DEBUG_FLAG( PROGRAM                 )

		STR_DEBUG_FLAG( STATEMENT               )

		STR_DEBUG_FLAG( ASSIGNMENT              )
//		STR_DEBUG_FLAG( STATEMENT_ASSIGNMENT    )

		STR_DEBUG_FLAG( COMMUNICATION           )
//		STR_DEBUG_FLAG( STATEMENT_COMMUNICATION )

		STR_DEBUG_FLAG( STATEMENT_CONTROL       )
		STR_DEBUG_FLAG( STATEMENT_SCHEDULING    )

		STR_DEBUG_FLAG( TEST_DECISION           )
//		STR_DEBUG_FLAG( STATEMENT_TEST_DECISION )

		STR_DEBUG_FLAG( BYTECODE                )

		STR_DEBUG_FLAG( DATA                    )

		STR_DEBUG_FLAG( TRACE                   )


		// Element: Property, Signal...

		STR_DEBUG_FLAG( VARIABLE                )

		STR_DEBUG_FLAG( BUFFER                  )

		STR_DEBUG_FLAG( PORT                    )

		STR_DEBUG_FLAG( SIGNAL                  )

		STR_DEBUG_FLAG( CONNEXION               )

		STR_DEBUG_FLAG( TIME                    )


		// Executable Component...

		STR_DEBUG_FLAG( EXECUTABLE              )

		STR_DEBUG_FLAG( PRIMITIVE               )

		STR_DEBUG_FLAG( ACTIVITY                )

		STR_DEBUG_FLAG( ROUTINE                 )

		STR_DEBUG_FLAG( TRANSITION              )

		STR_DEBUG_FLAG( MACHINE                 )

		STR_DEBUG_FLAG( STATEMACHINE            )


		// Others: [Qualified]NameID, RefCount, ...

		STR_DEBUG_FLAG( NAME_ID                 )

		STR_DEBUG_FLAG( QUALIFIED_NAME_ID       )

		STR_DEBUG_FLAG( FULLY_QUALIFIED_NAME_ID )


		STR_DEBUG_FLAG( CAS                     )

		STR_DEBUG_FLAG( REDUNDANCE              )


		STR_DEBUG_FLAG( REFERENCE_COUNTING      )


		// ... Process Stage: Processing, Filtering, ...
		else
		{
			STR_DEBUG_GROUP( PROCESSING         )
			else
			{
				STR_DEBUG_FLAG( PRE_PROCESSING  )

				STR_DEBUG_FLAG( POST_PROCESSING )
			}

			STR_DEBUG_GROUP( FILTERING          )
			else
			{
				STR_DEBUG_FLAG( PRE_FILTERING   )

				STR_DEBUG_FLAG( POST_FILTERING  )
			}
		}

		return( oss.str() );
	}
}



}
