package prolog;

import java.io.*;
import prolog.*;
import prolog.model.*;
import prolog.util.*;
import prolog.syntax.*;
import prolog.implementation.*;

public class MProlog
{
	public static final int MAJOR = 1;
	public static final int MINOR = 1;

	public MProlog( Options options )
		throws
			FileNotFoundException,
			SyntaxError,
			ParameterMatchingError
	{
		prolog.model.SingletonFactory.getInstance().registerBuilder(
			new ProgramBuilder() );

		ILogger logger = new StdOutLogger();

		Program programm = new Program();

		Scanner s = new Scanner( programm.getSymbolTable() );
		s.openDocument( options.input );

		Parser parser = new Parser( s, programm, null );
		parser.parse();

		ISymbolTable symbolTable = programm.getSymbolTable();
		if( options.traceSymbols )
			logger.msg(
				symbolTable.toString() );
		if( options.traceFacts )
			logger.msg(
				programm.getFacts().toString( symbolTable ) );
		if( options.traceConstraints )
			logger.msg(
				programm.getStatements().toString( symbolTable ) );
		if( options.traceQuery )
			logger.msg(
				programm.getQuerys().toString( symbolTable ) );

		if( options.xmlParseOutFile != null )
			try
			{
				FileWriter out = new FileWriter( options.xmlParseOutFile );
				programm.genXml( out );
				out.close();
			}
			catch( Exception ae )
			{
				ae.printStackTrace();
			}

		programm.run();
	}

	public static void main( String[] args )
	{
		Options options = new Options();
		for( int i=0;i<args.length;i++ )
		{
			if( args[i].equals( "/?" ) )
			{
				StringBuffer out = new StringBuffer();

				out.append( "MProlog v." );
				out.append( MAJOR );
				out.append( "." );
				out.append( MINOR );
				out.append( "\n" );
				out.append( "java MProlog /tsymbols /? \"FILENAME\"\n\n" );
				out.append( "\"FILENAME\"                : the complete path to the prolog file\n" );
				out.append( "/tsymbols                 : trace symbol map\n" );
				out.append( "/tfacts                   : trace facts\n" );
				out.append( "/tconstraints             : trace constraints map\n" );
				out.append( "/tquery                   : trace queries list\n" );
				out.append( "/?                        : shows this help ;-)\n" );

				System.out.println( out.toString() );
			}
			else if( args[i].equals( "/tconstraints" ) )
				options.traceConstraints = true;
			else if( args[i].equals( "/tsymbols" ) )
				options.traceSymbols = true;
			else if( args[i].equals( "/tquery" ) )
				options.traceQuery = true;
			else if( args[i].equals( "/tfacts" ) )
				options.traceFacts = true;
			else if( ! (options.input=new File( args[i] )).exists() )
				System.out.println( "unknown parameter: " + args[i] );
		}
		if( options.input != null && options.input.exists() )
		{
			try
			{
				MProlog p = new MProlog( options );
			}
			catch( ParameterMatchingError ae )
			{
				ae.printStackTrace();
			}
			catch( FileNotFoundException ae )
			{
				ae.printStackTrace();
			}
			catch( SyntaxError ae )
			{
				ae.printStackTrace();
			}
			catch( Throwable t )
			{
				t.printStackTrace();
			}
		}
	}
}
