/*******************************************************************************
 * 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: 21 avr. 2016
 *
 * Contributors:
 *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
 *   - Initial API and Implementation
 ******************************************************************************/

#include "SpecifierElement.h"

#include <sstream>


namespace sep
{


/**
 * STATIC EXECUTABLE SPECIFIER
 */
Specifier Specifier::EXECUTABLE_UNDEFINED_SPECIFIER;

Specifier Specifier::COMPONENT_PACKAGE_SPECIFIER(
		Specifier::COMPONENT_UNDEFINED_KIND);//*COMPONENT_PACKAGE_KIND);

Specifier Specifier::COMPONENT_SYSTEM_SPECIFIER(
		Specifier::COMPONENT_SYSTEM_KIND );

Specifier Specifier::COMPONENT_EXECUTABLE_SPECIFIER(
		Specifier::COMPONENT_EXECUTABLE_KIND );

Specifier Specifier::COMPONENT_PROCEDURE_SPECIFIER(
		Specifier::COMPONENT_PROCEDURE_KIND );

Specifier Specifier::EXECUTABLE_PROCEDURE_COMPOSITE_SPECIFIER(
		Specifier::COMPONENT_PROCEDURE_KIND,
		Specifier::MOC_COMPOSITE_STRUCTURE_KIND );

Specifier Specifier::EXECUTABLE_PROCEDURE_MODEL_SPECIFIER(
		Specifier::COMPONENT_PROCEDURE_KIND,
		Specifier::DESIGN_MODEL_KIND );

Specifier Specifier::EXECUTABLE_PROCEDURE_INSTANCE_STATIC_SPECIFIER(
		Specifier::COMPONENT_PROCEDURE_KIND,
		Specifier::DESIGN_INSTANCE_STATIC_KIND );


/**
 * EXECUTABLE DESIGN
 */
Specifier Specifier::DESIGN_MODEL_SPECIFIER(
		Specifier::DESIGN_MODEL_KIND);

Specifier Specifier::DESIGN_PROTOTYPE_STATIC_SPECIFIER(
		Specifier::DESIGN_PROTOTYPE_STATIC_KIND);

Specifier Specifier::DESIGN_INSTANCE_STATIC_SPECIFIER(
		Specifier::DESIGN_INSTANCE_STATIC_KIND);

Specifier Specifier::DESIGN_INSTANCE_DYNAMIC_SPECIFIER(
		Specifier::DESIGN_INSTANCE_DYNAMIC_KIND);


////////////////////////////////////////////////////////////////////////////////
// SCOPE <KIND
////////////////////////////////////////////////////////////////////////////////

Specifier::SCOPE_KIND Specifier::toScope(const std::string & id)
{
	if( id == "machine"    ) return SCOPE_MACHINE_KIND;

	if( id == "program"    ) return SCOPE_PROGRAM_KIND;

	if( id == "transition" ) return SCOPE_TRANSITION_KIND;

	if( id == "routine"    ) return SCOPE_ROUTINE_KIND;

	if( id == "runnable"   ) return SCOPE_RUNNABLE_KIND;

	return SCOPE_UNDEFINED_KIND;
}


std::string Specifier::strScope(SCOPE_KIND kind)
{
	switch( kind )
	{
		case SCOPE_MACHINE_KIND    : return( "machine"    );

		case SCOPE_PROGRAM_KIND    : return( "program"    );

		case SCOPE_TRANSITION_KIND : return( "transition" );

		case SCOPE_ROUTINE_KIND    : return( "routine"    );

		case SCOPE_RUNNABLE_KIND   : return( "runnable"   );

		case SCOPE_UNDEFINED_KIND  : return( "undefined<specifier#scope#kind>");

		default                    : return( "unknown<specifier#scope#kind>" );
	}
}


/**
 * SETTER
 */
Specifier & Specifier::set(const std::string strSpecifier)
{
#define IF_IS( spec  )  if( strSpecifier == spec )
#define IF_HAS( spec )  if( strSpecifier.find(spec) != std::string::npos )

	IF_HAS( "executable"     ) { setComponentExecutable();   }
	IF_HAS( "machine"        ) { setComponentExecutable();   }
	IF_HAS( "statemachine"   ) { setComponentStatemachine(); }
	IF_HAS( "system"         ) { setComponentSystem();       }
	IF_HAS( "procedure"      ) { setComponentProcedure();    }

	IF_HAS( "package"        ) { /*setComponentPackage();*/  }


	IF_HAS( "group"          ) { setGroupMasK();   }
	IF_HAS( "every"          ) { setGroupEvery();  }
	IF_HAS( "some"           ) { setGroupSome();   }
	IF_HAS( "except"         ) { setGroupExcept(); }

	IF_HAS( "composite"      ) { setMocComposite();             }
	IF_HAS( "and"            ) { setMocCompositeStructure();    }

	IF_HAS( "or"             ) { setMocStateTransitionSystem(); }
	IF_HAS( "STS"            ) { setMocStateTransitionSystem(); }
	IF_HAS( "stf"            ) { setMocStateTransitionFlow();   }
	IF_HAS( "STF"            ) { setMocStateTransitionFlow();   }

	IF_HAS( "flow"           ) { setCompositeMocDataFlow();     }
	IF_HAS( "DF"             ) { setCompositeMocDataFlow();     }

	IF_HAS( "simple"         ) { setStateMocSIMPLE();  }
	IF_HAS( "start"          ) { setStateMocSTART();   }
	IF_HAS( "final"          ) { setStateMocFINAL();   }
	IF_HAS( "sync"           ) { setStateMocSYNC();    }

	IF_HAS( "initial"        ) { setPseudostateMocINITIAL();  }
	IF_HAS( "terminal"       ) { setPseudostateMocTERMINAL(); }
	IF_HAS( "return"         ) { setPseudostateMocRETURN();   }

	IF_HAS( "junction"       ) { setPseudostateMocJUNCTION(); }
	IF_HAS( "choice"         ) { setPseudostateMocCHOICE();   }

	IF_HAS( "fork"           ) { setPseudostateMocFORK();     }
	IF_HAS( "join"           ) { setPseudostateMocJOIN();     }

	IF_HAS( "dhistory"       ) { setPseudostateMocDEEP_HISTORY();    }
	IF_HAS( "deepHistory"    ) { setPseudostateMocDEEP_HISTORY();    }

	IF_HAS( "shistory"       ) { setPseudostateMocSHALLOW_HISTORY(); }
	IF_HAS( "shallowHistory" ) { setPseudostateMocSHALLOW_HISTORY(); }

	IF_HAS( "history"        ) { setPseudostateMocSHALLOW_HISTORY(); }

	return( *this );
}


Specifier & Specifier::setMoc(const std::string strSpecifier)
{
#define IF_HAS( spec )  if( strSpecifier.find(spec) != std::string::npos )

	IF_HAS( "composite"      ) { setMocComposite();             }
	IF_HAS( "and"            ) { setMocCompositeStructure();    }

	IF_HAS( "or"             ) { setMocStateTransitionSystem(); }
	IF_HAS( "sts"            ) { setMocStateTransitionSystem(); }
	IF_HAS( "STS"            ) { setMocStateTransitionSystem(); }
	IF_HAS( "stf"            ) { setMocStateTransitionFlow();   }
	IF_HAS( "STF"            ) { setMocStateTransitionFlow();   }

	IF_HAS( "flow"           ) { setCompositeMocDataFlow();     }
	IF_HAS( "DF"             ) { setCompositeMocDataFlow();     }

	IF_HAS( "simple"         ) { setStateMocSIMPLE();  }
	IF_HAS( "start"          ) { setStateMocSTART();   }
	IF_HAS( "final"          ) { setStateMocFINAL();   }
	IF_HAS( "sync"           ) { setStateMocSYNC();    }

	IF_HAS( "initial"        ) { setPseudostateMocINITIAL();  }
	IF_HAS( "terminal"       ) { setPseudostateMocTERMINAL(); }
	IF_HAS( "return"         ) { setPseudostateMocRETURN();   }

	IF_HAS( "junction"       ) { setPseudostateMocJUNCTION(); }
	IF_HAS( "choice"         ) { setPseudostateMocCHOICE();   }

	IF_HAS( "fork"           ) { setPseudostateMocFORK();     }
	IF_HAS( "join"           ) { setPseudostateMocJOIN();     }

	IF_HAS( "dhistory"       ) { setPseudostateMocDEEP_HISTORY();    }
	IF_HAS( "deepHistory"    ) { setPseudostateMocDEEP_HISTORY();    }

	IF_HAS( "shistory"       ) { setPseudostateMocSHALLOW_HISTORY(); }
	IF_HAS( "shallowHistory" ) { setPseudostateMocSHALLOW_HISTORY(); }

	IF_HAS( "history"        ) { setPseudostateMocSHALLOW_HISTORY(); }

	return( *this );
}


/**
 * STRING TO DESIGN KIND
 */
Specifier::DESIGN_KIND Specifier::toDesignKind(const std::string & strDesign)
{
	std::string aDesign = strDesign;
	StringTools::tolower(aDesign);

	if( aDesign == "instance" )
	{
		return( Specifier::DESIGN_INSTANCE_KIND );
	}
	else if( (aDesign == "model") || (aDesign == "form") )
	{
		return( Specifier::DESIGN_MODEL_KIND );

	}
	else if( aDesign == "prototype" )
	{
		return( Specifier::DESIGN_PROTOTYPE_STATIC_KIND );
	}

	else if( aDesign == "dynamic" )
	{
		return( Specifier::DESIGN_DYNAMIC_KIND );
	}
	else if( aDesign == "runtime" )
	{
		return( Specifier::DESIGN_RUNTIME_KIND );
	}
//	else if( aDesign == "meta" )
//	{
//		return( Specifier::DESIGN_META_KIND );
//	}
	else
	{
		return( Specifier::DESIGN_UNDEFINED_KIND );
	}
}


/**
 * COMPONENT KIND to STRING
 */
std::string Specifier::keywordComponent(bit_field_t componentKind)
{
	switch( componentKind )
	{
		case COMPONENT_UNDEFINED_KIND:
			return( "<keyword:component:undef>" );

		case COMPONENT_SYSTEM_KIND:
			return( "system" );

		case COMPONENT_EXECUTABLE_KIND:
			return( "executable" );

		case COMPONENT_PROCEDURE_KIND:
			return( "procedure" );

		case COMPONENT_ROUTINE_KIND:
			return( "routine" );

		case COMPONENT_STATEMACHINE_KIND:
			return( "statemachine" );

		case COMPONENT_STATE_KIND:
			return( "state" );

		case COMPONENT_PSEUDOSTATE_KIND:
//			return( "pseudostate" );
			return( "state" );

		default:
			return( xstrComponent(componentKind, "#") );
	}
}


std::string Specifier::strComponent(
		bit_field_t componentKind, const std::string & separator)
{
	switch( componentKind )
	{
		case COMPONENT_UNDEFINED_KIND:
			return( "" );
//			return( "<component:undef>" + separator );

		case COMPONENT_SYSTEM_KIND:
			return( "system" + separator );

		case COMPONENT_EXECUTABLE_KIND:
			return( "executable" + separator );

		case COMPONENT_PROCEDURE_KIND:
			return( "procedure" + separator );

		case COMPONENT_ROUTINE_KIND:
			return( "routine" + separator );

		case COMPONENT_STATEMACHINE_KIND:
			return( "statemachine" + separator );

		case COMPONENT_STATE_KIND:
			return( "state" + separator );

		case COMPONENT_PSEUDOSTATE_KIND:
			return( "pseudostate" + separator );

		default:
			return( xstrComponent(componentKind, separator) );
	}
}


std::string Specifier::xstrComponent(
		bit_field_t componentKind, const std::string & separator)
{
	if( componentKind != COMPONENT_UNDEFINED_KIND)
	{
		std::ostringstream oss;

		if( (componentKind & COMPONENT_SYSTEM_KIND) != 0 )
		{
			oss << "system" << separator;
		}

		if( (componentKind & COMPONENT_EXECUTABLE_KIND) != 0 )
		{
			oss << "executable" << separator;
		}

		if( (componentKind & COMPONENT_PROCEDURE_KIND) != 0 )
		{
			oss << "procedure" << separator;
		}
		if( (componentKind & COMPONENT_ROUTINE_KIND) != 0 )
		{
			oss << "routine" << separator;
		}

		if( (componentKind & COMPONENT_STATEMACHINE_KIND) != 0 )
		{
			oss << "statemachine" << separator;
		}
		if( (componentKind & COMPONENT_STATE_KIND) != 0 )
		{
			oss << "state" << separator;
		}
		if( (componentKind & COMPONENT_PSEUDOSTATE_KIND) != 0 )
		{
			oss << "pseudostate" << separator;
		}

		return( oss.str() );
	}

	return "<component:undef>";
}


/**
 * COMPOSITE MOC to STRING
 */
std::string Specifier::strModelOfComputation(
		bit_field_t modelOfComputationKind, const std::string & separator)
{
	switch( modelOfComputationKind )
	{
		case MOC_UNDEFINED_KIND:
			return( "" );
//			return( "<composite:undef>" + separator );

		case MOC_COMPOSITE_STRUCTURE_KIND:
			return( "and" + separator );

		case MOC_STATE_TRANSITION_STRUCTURE_KIND:
			return( "or" + separator );

		case MOC_STATE_TRANSITION_SYSTEM_KIND:
			return( "#STS" + separator );

		case MOC_STATE_TRANSITION_FLOW_KIND:
			return( "#STF" + separator );

		case MOC_DATA_FLOW_KIND:
			return( "#DF" + separator );

		case MOC_COMPOSITE_MASK_KIND:
			return( "composite" + separator );

		default:
			return( "<composite:unknown>" + separator );
	}
}


/**
 * GROUP KIND to STRING
 */
std::string Specifier::strGroup(
		bit_field_t groupKind, const std::string & separator)
{
	switch( groupKind )
	{
		case GROUP_UNDEFINED_KIND:
			return( "" );
//			return( "<group:undef>" + separator );

		case GROUP_EVERY_KIND:
			return( "every" + separator );

		case GROUP_SOME_KIND:
			return( "some" + separator );

		case GROUP_EXCEPT_KIND:
			return( "except" + separator );

		case GROUP_MASK_KIND:
			return( "group" + separator );

		default:
			return( "<group:unknown>" + separator );
	}
}


/**
 * STATE MOC to STRING
 */
std::string Specifier::strStateMoc(
		bit_field_t stateMoc, const std::string & separator)
{
	switch( stateMoc )
	{
		case STATE_UNDEFINED_MOC:
			return( "" );
//			return( "<state:undef>" + separator );

		case STATE_SIMPLE_MOC:
			return( "simple" + separator );

		case STATE_START_MOC:
			return( "start" + separator );

		case STATE_FINAL_MOC:
			return( "final" + separator );

		case STATE_SYNC_MOC:
			return( "sync" + separator );

		default:
			return( xstrStateMoc(stateMoc, separator) );
	}
}


std::string Specifier::xstrStateMoc(
		bit_field_t stateMoc, const std::string & separator)
{
	if( stateMoc != STATE_UNDEFINED_MOC)
	{
		std::ostringstream oss;

		if( (stateMoc & STATE_SIMPLE_MOC) != 0 )
		{
			oss << "simple" << separator;
		}
		if( (stateMoc & STATE_START_MOC) != 0 )
		{
			oss << "start" << separator;
		}
		if( (stateMoc & STATE_FINAL_MOC) != 0 )
		{
			oss << "final" << separator;
		}
		if( (stateMoc & STATE_SYNC_MOC) != 0 )
		{
			oss << "sync" << separator;
		}

		return( oss.str() );
	}

	return "<state:undef>";
}


/**
 * PSEUDOSTATE MOC to STRING
 */
std::string Specifier::strPseudostateMoc(
		bit_field_t pseudostateMoc, const std::string & separator)
{
	switch( pseudostateMoc )
	{
		case PSEUDOSTATE_UNDEFINED_MOC:
			return( "" );
//			return( "<pseudostate:undef>" + separator );

		case PSEUDOSTATE_INITIAL_MOC:
			return( "initial" + separator );
		case PSEUDOSTATE_TERMINAL_MOC:
			return( "terminal" + separator );

		case PSEUDOSTATE_RETURN_MOC:
			return( "return" + separator );

		case PSEUDOSTATE_JUNCTION_MOC:
			return( "junction" + separator );
		case PSEUDOSTATE_CHOICE_MOC:
			return( "choice" + separator );

		case PSEUDOSTATE_ENTRY_POINT_MOC:
			return( "entryPoint" + separator );
		case PSEUDOSTATE_EXIT_POINT_MOC:
			return( "exitPoint" + separator );

		case PSEUDOSTATE_FORK_MOC:
			return( "fork" + separator );
		case PSEUDOSTATE_JOIN_MOC:
			return( "join" + separator );

		case PSEUDOSTATE_DEEP_HISTORY_MOC:
			return( "dhistory" + separator );
		case PSEUDOSTATE_SHALLOW_HISTORY_MOC:
			return( "shistory" + separator );

		default:
			return( xstrPseudostateMoc(pseudostateMoc, separator) );
	}
}


std::string Specifier::xstrPseudostateMoc(
		bit_field_t pseudostateMoc, const std::string & separator)
{
	if( pseudostateMoc != PSEUDOSTATE_UNDEFINED_MOC)
	{
		std::ostringstream oss;

		if( (pseudostateMoc & PSEUDOSTATE_INITIAL_MOC) != 0 )
		{
			oss << "initial" << separator;
		}
		if( (pseudostateMoc & PSEUDOSTATE_TERMINAL_MOC) != 0 )
		{
			oss << "terminal" << separator;
		}

		if( (pseudostateMoc & PSEUDOSTATE_RETURN_MOC) != 0 )
		{
			oss << "return" << separator;
		}

		if( (pseudostateMoc & PSEUDOSTATE_JUNCTION_MOC) != 0 )
		{
			oss << "junction" << separator;
		}
		if( (pseudostateMoc & PSEUDOSTATE_CHOICE_MOC) != 0 )
		{
			oss << "choice" << separator;
		}

		if( (pseudostateMoc & PSEUDOSTATE_ENTRY_POINT_MOC) != 0 )
		{
			oss << "entryPoint" << separator;
		}
		if( (pseudostateMoc & PSEUDOSTATE_EXIT_POINT_MOC) != 0 )
		{
			oss << "exitPoint" << separator;
		}

		if( (pseudostateMoc & PSEUDOSTATE_FORK_MOC) != 0 )
		{
			oss << "fork" << separator;
		}
		if( (pseudostateMoc & PSEUDOSTATE_JOIN_MOC) != 0 )
		{
			oss << "join" << separator;
		}

		if( (pseudostateMoc & PSEUDOSTATE_DEEP_HISTORY_MOC) != 0 )
		{
			oss << "dhistory" << separator;
		}
		if( (pseudostateMoc & PSEUDOSTATE_SHALLOW_HISTORY_MOC) != 0 )
		{
			oss << "shistory" << separator;
		}

			return( oss.str() );
	}

	return "<pseudostate:undef>";
}


/**
 * DESIGN KIND to STRING
 */
std::string Specifier::strFeature(
		bit_field_t featureKind, const std::string & separator)
{
	if( (featureKind != FEATURE_UNDEFINED_KIND) )
	{
		std::ostringstream oss;

		if( (featureKind & FEATURE_TIMED_KIND) != 0 )
		{
			oss << "timed" << separator;
		}
		if( (featureKind & FEATURE_INPUT_ENABLED_KIND) != 0 )
		{
			oss << "input_enabled" << separator;
		}
		if( (featureKind & FEATURE_LIFELINE_KIND) != 0 )
		{
			oss << "lifeline" << separator;
		}

		return( oss.str() );
	}

	return( "" /*"<feature:undef>"*/ );
}


/**
 * DESIGN KIND to STRING
 */
std::string Specifier::strDesign_not(
		DESIGN_KIND designKind, const std::string & separator) const
{
	if( isDesignKind(designKind) )
	{
		return( "" );
	}
	else if( isDesignPrototypeStatic() )
	{
		return( strDesign(this->design, separator) );
	}
	else
	{
		switch( designKind )
		{
			case DESIGN_MODEL_KIND:
			case DESIGN_INSTANCE_KIND:
			case DESIGN_DYNAMIC_KIND:
			case DESIGN_STATIC_KIND:
			case DESIGN_RUNTIME_KIND:
			{
				return( strDesign(this->design & (~ designKind), separator) );
			}
			default:
			{
				return( strDesign(this->design, separator) );
			}
		}
	}
}


std::string Specifier::strDesign(
		bit_field_t designKind, const std::string & separator)
{
	switch( designKind )
	{
		case DESIGN_UNDEFINED_KIND:
			return( "" );
//			return( "<design:undef>" + separator );
//			case DESIGN_META_KIND:
//				return( "#meta" + separator );

		case DESIGN_MODEL_KIND:
			return( "#model" + separator );
		case DESIGN_INSTANCE_KIND:
			return( "#instance" + separator );
		case DESIGN_STATIC_KIND:
			return( "#static" + separator );
		case DESIGN_DYNAMIC_KIND:
			return( "#dynamic" + separator );
		case DESIGN_RUNTIME_KIND:
			return( "#runtime" + separator );

		case DESIGN_INSTANCE_STATIC_KIND:
			return( "#static#instance" + separator );
		case DESIGN_INSTANCE_DYNAMIC_KIND:
			return( "#dynamic#instance" + separator );

		case DESIGN_PROTOTYPE_STATIC_KIND:
//			return( "#static #prototype" + separator );
			return( "#prototype" + separator );
		case DESIGN_PROTOTYPE_DYNAMIC_KIND:
			return( "#dynamic #prototype" + separator );

		default:
			return( xstrDesign(designKind, separator) );
	}
}


std::string Specifier::xstrDesign(
		bit_field_t designKind, const std::string & separator)
{
	if( (designKind != DESIGN_UNDEFINED_KIND) )
//		&& (designKind != DESIGN_META_KIND) )
	{
		std::ostringstream oss;

		if( (designKind & DESIGN_MODEL_KIND) != 0 )
		{
			oss << "#model" << separator;
		}
		else if( (designKind & DESIGN_INSTANCE_KIND) != 0 )
		{
			oss << "#instance" << separator;
		}
		else if( (designKind & DESIGN_STATIC_KIND) != 0 )
		{
			oss << "#static" << separator;
		}
		else if( (designKind & DESIGN_DYNAMIC_KIND) != 0 )
		{
			oss << "#dynamic" << separator;
		}
		if( (designKind & DESIGN_RUNTIME_KIND) != 0 )
		{
			oss << "#runtime" << separator;
		}

		return( oss.str() );
	}

	return( "<design:undef>" );
}


/**
 * Serialization
 */
std::string Specifier::SEPARATOR = " % ";


std::string Specifier::toString(bit_field_t enabledFields,
		const std::string & separator) const
{
	std::ostringstream oss;

	if( (enabledFields & FIELD_FEATURE_POSITION) != 0 )
	{
		oss << Specifier::strFeature( feature , separator );
	}

	if( (enabledFields & FIELD_PSEUDOSTATE_POSITION) != 0 )
	{
		oss << Specifier::strPseudostateMoc( pseudostate , separator );
	}
	if( (enabledFields & FIELD_STATE_POSITION) != 0 )
	{
		oss << Specifier::strStateMoc( state , separator );
	}

	if( (enabledFields & FIELD_COMPUTATION_POSITION) != 0 )
	{
		oss << Specifier::strModelOfComputation( computation , separator );
	}

	if( (enabledFields & FIELD_DESIGN_POSITION) != 0 )
	{
		oss << Specifier::strDesign( design , separator);
	}

	if( (enabledFields & FIELD_GROUP_POSITION) != 0 )
	{
		oss << Specifier::strGroup   ( group , separator );
	}

	if( (enabledFields & FIELD_COMPONENT_POSITION) != 0 )
	{
		oss << Specifier::strComponent( component , separator );
	}

	return( oss.str() );
}


} /* namespace sep */
