package tableDefinition;

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


public class PrintColumnsInTable
{
	public PrintColumnsInTable(String tableName, ColumnList columnList, String outputDirectory, LogFile logFile)
	{
		
		ListIterator<ColumnElement> iterator;
		ColumnElement columnElement;
//		String postgresDataType;
		int maxLengthColumnNumber;
		int maxLengthColumnName;
		int maxLengthDataType;
		int maxLengthDataLength;
		int maxLengthScale;
		int maxLengthNullable; 
		int maxLengthColumnNumberAsString;
		int maxLengthDataLengthAsString;
		int maxLengthScaleAsString;
		
		int expectedColumnNumber;
		int columnNumber;
		String columnName;
		int dataLength;
		boolean nullable;
		int scale;
		DashboardFile tableListFile;
		NumberFormat numberFormat;
		String columnNumberAsString;
		String dataLengthAsString;
		String scaleAsString;
		String nullableAsString;
		
        maxLengthColumnNumber         = 8;	    // length of title "Column Number"
		maxLengthColumnName           = 11;		// length of title "Column Name"
		maxLengthDataType             = 9;  	// length of title "Data Type"
		maxLengthDataType             = 9;
		maxLengthDataLength           = 6;
		maxLengthScale                = 5;
		maxLengthNullable             = 8; 
		maxLengthColumnNumberAsString = 0;
		maxLengthDataLengthAsString   = 0;
		maxLengthScaleAsString        = 0;
		
		numberFormat = NumberFormat.getInstance();
					
		for (iterator = columnList.listIterator(); iterator.hasNext();)
		{
			columnElement = (ColumnElement) iterator.next();
			
			if (columnElement.getColumnName().length() > maxLengthColumnName)
				maxLengthColumnName = columnElement.getColumnName().length();

			if (columnElement.getDataType().length() > maxLengthDataType)
				maxLengthDataType = columnElement.getDataType().length();
			
			columnNumberAsString = new String(numberFormat.format(columnElement.getColumnNumber()));
			if (columnNumberAsString.length() > maxLengthColumnName)
				maxLengthColumnNumberAsString = columnNumberAsString.length();

			dataLengthAsString = new String(numberFormat.format(columnElement.getDataLength()));
			if (dataLengthAsString.length() > maxLengthColumnName)
				maxLengthDataLengthAsString = dataLengthAsString.length();

			scaleAsString = new String(numberFormat.format(columnElement.getScale()));
			if (scaleAsString.length() > maxLengthColumnName)
				maxLengthScaleAsString = scaleAsString.length();
		}

		tableListFile = new DashboardFile
		(
			outputDirectory + 
			tableName + "_columns.txt"
		);
		
		tableListFile.PutLine
        (
        	" Position"                         + " | " +
			pad("Column Name", maxLengthColumnName)  + " | " +
			pad("Data Type",   maxLengthDataType)    + " | " +
			pad("Length",      maxLengthDataLength)  + " | " +
			pad("Scale",       maxLengthScale)       + " | " +
			"Nullable"
		);
		
		tableListFile.PutLine
        (
        	"----------+-" +       	               // column number
            pad("-", maxLengthColumnName, '-') + "-+-" +
        	pad("-", maxLengthDataType,   '-') + "-+-" +
			pad("-", maxLengthDataLength, '-') + "-+-" +
			pad("-", maxLengthScale,      '-') + "-+-" +
        	"----------"                                    // nullable
		);
		
		for (iterator = columnList.listIterator(); iterator.hasNext();)
		{
			columnElement = (ColumnElement) iterator.next();
			
			columnNumberAsString = new String(numberFormat.format(columnElement.getColumnNumber()));
			if (columnElement.getDataLength() == 0)
				dataLengthAsString = new String("none");
			else
				dataLengthAsString = new String(numberFormat.format(columnElement.getDataLength()));
			if (columnElement.getScale() == -127)
				scaleAsString = new String("none");
			else
				scaleAsString = new String(numberFormat.format(columnElement.getScale()));
			
			if (columnElement.getNullable())
				nullableAsString = new String("  Yes");
			else
				nullableAsString = new String("   No");
			
   			tableListFile.PutLine
	        (
        		" " +
				pad(columnNumberAsString, maxLengthColumnNumber) + " | " +
				pad(columnElement.getColumnName(), maxLengthColumnName) + " | " +
				pad(columnElement.getDataType().toLowerCase(), maxLengthDataType) + " | " +
				pad(dataLengthAsString, maxLengthDataLength) + " | " +
				pad(scaleAsString, maxLengthScale) + " | " +
				nullableAsString
	        );
   			
		}
		tableListFile.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();
	}
}
