package profileEngine;

import java.util.LinkedList;
import java.util.ListIterator;

public class DatabaseSchemaTableList extends LinkedList<TableElement> 
{

	private static final long serialVersionUID = 1L;

	public DatabaseSchemaTableList()
	{
		;
	}
	
	public void print(String lowestLevel)
	{
		ListIterator<TableElement> iterator;
		TableElement tableElement;
		StringBuffer line;
		
		int maxLengthDatabaseName;
		int maxLengthEncoding;
		int maxLengthSchemaName;
		int maxLengthTableName;
		int maxLengthType;
		int maxLengthRemarks;
		
		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"

		System.out.println("");
		
		for (iterator = this.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();
		}
		
        line = new StringBuffer
		(
			pad("Database", maxLengthDatabaseName) + "|" +
			pad("Encoding", maxLengthEncoding)
		);
        if (!lowestLevel.equals("database"))
        {
			line.append("|" + pad("Schema", maxLengthSchemaName));
	        if (!lowestLevel.equals("schema"))
	        {
				line.append
				(
					"|" + pad("Table", maxLengthTableName) +
					"|" + pad("Type", maxLengthType) + 
					"|" + pad("Remarks", maxLengthRemarks)  + 
					"|" +"Row Count"
				);
	        }
        }
		System.out.println(line.toString());

		
		for (iterator = this.listIterator(); iterator.hasNext();)
		{
			tableElement = (TableElement) iterator.next();
			
	        line = new StringBuffer
	        (
				pad(tableElement.getDatabaseName(), maxLengthDatabaseName) + "|" +
				pad(tableElement.getDatabaseEncoding(), maxLengthEncoding)
	        );
	        if (!lowestLevel.equals("database"))
	        { 
	        	line.append("|" + pad(tableElement.getSchemaName(), maxLengthSchemaName));
		        if (!lowestLevel.equals("schema"))
		        {
					line.append
					(
						"|" + pad(tableElement.getTableName(), maxLengthTableName) + 
						"|" + pad(tableElement.getTableType(), maxLengthType) + 
						"|" + pad(tableElement.getRemarks(), maxLengthRemarks)  + 
						"|" + tableElement.getRowCount()
					);
		        }
	        }
			System.out.println(line.toString());
		}
	}
	
	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();
	}
}
