package tableDefinition;

import java.util.ListIterator;
import dataWarehousingTools.DashboardFile;
import dataWarehousingTools.LogFile;


public class PrintSchemasInDatabase
{
	public PrintSchemasInDatabase(SchemaList schemaList, String outputDirectory, LogFile logFile)
	{
		
		ListIterator<SchemaElement> iterator;
		SchemaElement schemaElement;
		
		int maxLengthDatabaseName;
		int maxLengthSchemaName;
		
		String previousDatabaseName = "";
		String databaseName = "";
		int databaseNameCount = 0;
		String previousSchemaName = "";
		String schemaName = "";
		int schemaNameCount = 0;

		maxLengthDatabaseName = 8;		// length of title "Database"
		maxLengthSchemaName = 6;		// length of title "Schema"
		
		DashboardFile schemaListFile;

		
		for (iterator = schemaList.listIterator(); iterator.hasNext();)
		{
			schemaElement = (SchemaElement) iterator.next();
			
			if (schemaElement.getDatabaseName().length() > maxLengthDatabaseName)
				maxLengthDatabaseName = schemaElement.getDatabaseName().length();
		    if (schemaElement.getSchemaName().length() > maxLengthSchemaName)
		    	maxLengthSchemaName = schemaElement.getSchemaName().length();
					
	//		The counts below will be accurate only if the names are in order
	//		We are only interested in where there is one or more of each, so it should be OK
	//		databaseCount should always be 1.
	
			databaseName = new String(schemaElement.getDatabaseName());
			if (!databaseName.equals(previousDatabaseName))
			{
				databaseNameCount++;
			    previousDatabaseName = databaseName;
			}
			
			schemaName = new String(schemaElement.getSchemaName());
			if (!schemaName.equals(previousSchemaName))
			{
				schemaNameCount++;
			    previousSchemaName = schemaName;
			}
		}


		if (databaseNameCount > 1)
			logFile.logMessage("At schema level expect one database, got " + databaseNameCount);
	
		schemaListFile = new DashboardFile
		(
			outputDirectory + 
			databaseName + "_schema.txt"
		);
		
		schemaListFile.PutLine
        (
        	" " +
			pad("Database", maxLengthDatabaseName) + " | " +
			pad("Schema", maxLengthSchemaName) 
		);
		
		schemaListFile.PutLine
        (
        	"-" +
			pad("-", maxLengthDatabaseName, '-') + "-+-" +
			pad("-", maxLengthSchemaName,   '-')
		);
	    
		for (iterator = schemaList.listIterator(); iterator.hasNext();)
		{
			schemaElement = (SchemaElement) iterator.next();
			
			schemaListFile.PutLine
	        (
	        	" " +
				pad(schemaElement.getDatabaseName(), maxLengthDatabaseName) + " | " +
				pad(schemaElement.getSchemaName(), maxLengthSchemaName) 
	        );
		}
		schemaListFile.close();
	}
	
	
	private String pad(String s, int length)
	{
		StringBuffer padding;
		int i;
		
		padding = new StringBuffer();
		for (i = 0; i < length - s.length(); i++)
			padding.append(" ");
		
		return s + padding.toString();
	}
	
	
	private String pad(String s, int length, char padCharacter)
	{
		StringBuffer padding;
		int i;
		
		padding = new StringBuffer();
		for (i = 0; i < length - s.length(); i++)
			padding.append(padCharacter);
		
		return s + padding.toString();
	}
}
