class Umplificator {

static Logger logger = Logger.getLogger(Umplificator.class);

public boolean umplify(List<File> srcFiles) {
    FileHelper.printFilesToUmplify(srcFiles);
    for (File aFile : srcFiles){
    	 umplifyElement(aFile);
    }
    // Generates a MasterFile if we have processed more than one file
   FileHelper.writeMasterFile(filesUmplified, outputFolder, needSubDirectories);
    return true;
}

public boolean umplifyElement(File file){
    String language = FileHelper.getFileExtension(file);
    boolean result=false;
    logger.debug("Input language is: " + language);
	switch(language)
	{	
		case ".java": result = umplifyJava(file);
			break;
		case ".ump":  result = umplifyUmple(file);
			break;
		case ".cpp": result =  umplifyCPP(file);
			break;
	}
	return result;
}

public boolean umplifyUmple(File file)
{
    try {
			UmpleFile umpleFile = new UmpleFile(file);
    	    UmpleModel inputUmpleModel = new UmpleModel(umpleFile);
    	    inputUmpleModel.run();
    	    UmpleClass uClass=  inputUmpleModel.getUmpleClass(0);
    		// Use the Java Parser for extra code 
 		   	JavaParser javaParser =new JavaParser();
		    String content =  IOUtils.toString(file.toURI());
		    logger.debug("---Input---");
		    logger.debug(content);
		    javaParser.parseBodyDeclarations(uClass.getExtraCode());
		    // initialize drools engine
		    RuleRunner ruleRunner = new RuleRunner();
		    RuleService ruleService = new RuleService (ruleRunner);
			ruleService.startRuleEngine(currentLevel);
			//UmpleClass uClass = new UmpleClass(compilationUnitName);
			//ruleRunner.insertUmpleClass(uClass);
			ruleRunner.insertJavaElements(javaParser.getJavaVisitor());
			ruleRunner.fireAllRules();
			// generate Umple Code
			outputModel = new UmpleModel(umpleFile);
			outputModel.addUmpleClass(uClass);
			filesUmplified.add(umpleFile.getSimpleFileName());
			// generate Umple Code
			FileHelper.writeFile(outputModel, outputFolder,needSubDirectories,testMode);
		} catch (IOException e) {
			logger.error("IOException in Umplificator.umplifyUmpleFile");
			logger.error(e.getStackTrace());
			return false;
		} 
	logger.info("Umplification process completed!");
	return true;
}

public boolean umplifyJava(File file)
{
		try {
			// GetContent from file
			// Parse File
			// The visitor is automatically assigned to the Parser
 		   	JavaParser javaParser =new JavaParser();
		    String content =  IOUtils.toString(file.toURI());;
   			logger.debug("---Input---");
		    logger.debug(content);
		    javaParser.parseUnit(content);
			// initialize drools engine
		    RuleRunner ruleRunner = new RuleRunner();
		    RuleService ruleService = new RuleService (ruleRunner);
			ruleService.startRuleEngine(currentLevel);
			// Insert Elements in Working Memory
			String compilationUnitName= javaParser.getJavaVisitor().getName();
			String classBody = javaParser.getJavaVisitor().getClassBody();
			boolean isInterface = javaParser.getJavaVisitor().getIsInterface();

			UmpleInterface uInterface=null;
			UmpleClass uClass=null;
			if (isInterface)
			{
			    uInterface = new UmpleInterface(compilationUnitName);
			    // Insert uInterface into Working Memory
			    ruleRunner.insertUmpleInterface(uInterface);
			    uInterface.appendExtraCode(classBody);
			}
			else {
				// Insert uClass into Working Memory
				uClass = new UmpleClass(compilationUnitName);
				ruleRunner.insertUmpleClass(uClass);
				uClass.appendExtraCode(classBody);
			}
			// Insert Java Elements
			ruleRunner.insertJavaElements(javaParser.getJavaVisitor());
			ruleRunner.fireAllRules();

			// generate Umple Code
			UmpleFile umpleFile = new UmpleFile(file);
			outputModel = new UmpleModel(umpleFile);
			
		    if (isInterface) { outputModel.addUmpleInterface(uInterface);} else {  outputModel.addUmpleClass(uClass);};
		    filesUmplified.add(umpleFile.getSimpleFileName());
			// generate Umple Code
			FileHelper.writeFile(outputModel, outputFolder,needSubDirectories,testMode);
		} catch (IOException e) {
			logger.error("IOException in Umplificator.umplifyUmpleFile");
			logger.error(e.getStackTrace());
			return false;
		} 
     logger.info("Umplification process completed!");
	 return true;
}


public boolean umplifyCPP(File file)
{
	logger.error("Not Implemented yet");
    throw new UnsupportedOperationException( "CPP Reverse Eng. will be implemented soon");
}


}