package tableDefinition;

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


public class PrintTablesInSchema
{
	public PrintTablesInSchema(TableList tableList, String outputDirectory, LogFile logFile)
	{
		
		ListIterator<TableElement> iterator;
		TableElement tableElement;
		
		int maxLengthDatabaseName;
		int maxLengthEncoding;
		int maxLengthSchemaName;
		int maxLengthTableName;
		int maxLengthType;
		int maxLengthRemarks;
		
		String previousDatabaseName = "";
		String databaseName = "";
		int databaseNameCount = 0;
		String previousSchemaName = "";
		String schemaName = "";
		int schemaNameCount = 0;

		maxLengthDatabaseName = 8;		// length of title "Database"
		maxLengthEncoding = 8;			// length of title "Encoding"
		maxLengthSchemaName = 6;		// length of title "Schema"
		maxLengthTableName = 5;			// length of title "Table"
		maxLengthType = 4;				// length of title "Type"
		maxLengthRemarks = 7;			// length of title "Remarks"
		
		DashboardFile schemaListFile;

		
		for (iterator = tableList.listIterator(); iterator.hasNext();)
		{
			tableElement = (TableElement) iterator.next();
			
			if (tableElement.getDatabaseName().length() > maxLengthDatabaseName)
				maxLengthDatabaseName = tableElement.getDatabaseName().length();
		    if (tableElement.getDatabaseEncoding().length() > maxLengthEncoding)
		    	maxLengthEncoding = tableElement.getDatabaseEncoding().length();
		    if (tableElement.getSchemaName().length() > maxLengthSchemaName)
		    	maxLengthSchemaName = tableElement.getSchemaName().length();
			if (tableElement.getTableName().length() > maxLengthTableName)
				maxLengthTableName = tableElement.getTableName().length();
			if (tableElement.getTableType().length() > maxLengthType)
				maxLengthType = tableElement.getTableType().length();
			if (tableElement.getRemarks().length() > maxLengthRemarks)
				maxLengthRemarks = tableElement.getRemarks().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(tableElement.getDatabaseName());
			if (!databaseName.equals(previousDatabaseName))
			{
				databaseNameCount++;
			    previousDatabaseName = databaseName;
			}
			
			schemaName = new String(tableElement.getSchemaName());
			if (!schemaName.equals(previousSchemaName))
			{
				schemaNameCount++;
			    previousSchemaName = schemaName;
			}
		}


		if (schemaNameCount > 1)
			logFile.logMessage("At schema level expect one database, got " + databaseNameCount);

		if (schemaNameCount > 1)
			logFile.logMessage("At schema level expect one schema, got " + schemaNameCount);

	
		schemaListFile = new DashboardFile
		(
			outputDirectory + 
			databaseName + "_" + schemaName + "_tables.txt"
		);
		
		schemaListFile.PutLine
        (
        	" " +
			pad("Database", maxLengthDatabaseName) + " | " +
			pad("Schema", maxLengthSchemaName)     + " | " +
//			pad("Encoding", maxLengthEncoding)     + " | " +
			pad("Table", maxLengthTableName)       + " | " +
//			pad("Table Type", maxLengthType)       + " | " +
//			pad("Remarks", maxLengthRemarks)       + " | " + 
			"Row Count"
		);
		
		schemaListFile.PutLine
        (
        	"-" +
			pad("-", maxLengthDatabaseName, '-') + "-+-" +
			pad("-", maxLengthSchemaName,   '-') + "-+-" +
//			pad("-", maxLengthEncoding,     '-') + "-+-" +
			pad("-", maxLengthTableName,    '-') + "-+-" +
//			pad("-", maxLengthType,         '-') + "-+-" +
//			pad("-", maxLengthRemarks,      '-') + "-+-" + 
			"---------"
		);
	    
		for (iterator = tableList.listIterator(); iterator.hasNext();)
		{
			tableElement = (TableElement) iterator.next();
			
			schemaListFile.PutLine
	        (
	        	" " +
				pad(tableElement.getDatabaseName(), maxLengthDatabaseName) + " | " +
				pad(tableElement.getSchemaName(), maxLengthSchemaName) + " | " +
//				pad(tableElement.getDatabaseEncoding(), maxLengthEncoding) + " | " +
				pad(tableElement.getTableName(), maxLengthTableName) + " | " + 
//				pad(tableElement.getTableType(), maxLengthType) + " | " + 
//				pad(tableElement.getRemarks(), maxLengthRemarks) + " | " + 
				tableElement.getRowCount()
	        );
		}
		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();
	}
}
