package dataProfileWebSite;

import java.sql.Connection;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.ListIterator;
import dataWarehousingTools.LogFile;
import dataWarehousingTools.Configuration;
import dataWarehousingTools.DashboardFile;


public class DatabaseIndex 
{
	public DatabaseIndex(Configuration configuration, Connection connection, LogFile logFile, DatabaseList databaseList, String database)
	{
		XmlElement xmlElement;
		ListIterator<DatabaseElement> iterator;
		Calendar today;
		DateFormat longDateFormat;
		DecimalFormat integerFormat;
		DashboardFile databaseIndexFile;
		DatabaseElement databaseElement;
		TableList tableProfileList;
		
		databaseIndexFile = new DashboardFile
		(
			configuration.getHtmlFileLocation() +
			"index" +
			".html"
		);
		
    	today = Calendar.getInstance();
    	longDateFormat = new SimpleDateFormat("EEE dd-MMM-yyyy HH:mm:ss");
        longDateFormat.format(today.getTime());
		integerFormat = new DecimalFormat("###,###,###,###,###");

		databaseIndexFile.PutLine("<!DOCTYPE html>");
		databaseIndexFile.PutLine("<head>");

	    databaseIndexFile.PutLine("  <meta charset=\"UTF-8\"/>");
	    databaseIndexFile.PutLine("  <meta name=\"description\" content=\"Data Profiles\"/>");
		
		databaseIndexFile.PutLine
	    (
	    	"  <link rel=\"stylesheet\" type=\"text/css\" href=\"" +
	    	configuration.getLinkToStylesheets() +
	    	"style.css\"/>"
	    );
	    
	    xmlElement = new XmlElement(2, "title", "", "List of Databases Profiled");
	    databaseIndexFile.PutLine(xmlElement.getXmlElement());
		
	    databaseIndexFile.PutLine("</head>");
	    databaseIndexFile.PutLine("  <body>");

	    xmlElement = new XmlElement(4, "h1", "", "List of Databases Profiled");
	    databaseIndexFile.PutLine(xmlElement.getXmlElement());
	    xmlElement = new XmlElement(4, "h4", "", "Published: " + longDateFormat.format(today.getTime()) + " GMT");
	    databaseIndexFile.PutLine(xmlElement.getXmlElement());

	    databaseIndexFile.PutLine("    <table>");	    
	    databaseIndexFile.PutLine("      <col width=\"10%\">");
	    databaseIndexFile.PutLine("      <col width=\"10%\">");
	    databaseIndexFile.PutLine("      <col width=\"40%\">");
	    databaseIndexFile.PutLine("      <col width=\"40%\">");
	    databaseIndexFile.PutLine("      <tr>");
	    databaseIndexFile.PutLine("        <th style=\"text-align:left;\">Database</th>");
	    databaseIndexFile.PutLine("        <th style=\"text-align:left;\">Schema</th>");
	    databaseIndexFile.PutLine("        <th style=\"text-align:right;\">Number of Tables Profiled</th>");
	    databaseIndexFile.PutLine("        <th style=\"text-align:left;\">Date of Latest Profile</th>");
	    databaseIndexFile.PutLine("      </tr>");
	    
		for (iterator = databaseList.listIterator(); iterator.hasNext();)
		{
			databaseElement = (DatabaseElement) iterator.next();
		
		    databaseIndexFile.PutLine("      <tr>");
		    
		    // suppress database name if same as previous

		    databaseIndexFile.PutLine
		    (
		    	"        <td style=\"text-align:left;\">" +	
		    	databaseElement.getDatabaseName() + 
		    	"</td>"
		    );

		    xmlElement = new XmlElement
		    (
		    	6, 
		    	"a", 
		    	"href=\"" +
		    	"Schema" +
		    	databaseElement.getDatabaseLinkId() +
		    	".htm\"",
		    	databaseElement.getSchemaName()
		    );
		    databaseIndexFile.PutLine
		    (
		    	"        <td style=\"text-align:left;\">" +	
		    	xmlElement.getXmlElement() + 
		    	"</td>"
		    );

		    databaseIndexFile.PutLine
		    (
                  "        <td style=\"text-align:right;\">" +
                  integerFormat.format(databaseElement.getTableCount()) +
                  "</td>"
            );

		    databaseIndexFile.PutLine
		    (
                  "        <td style=\"text-align:left;\">" +
                  longDateFormat.format(databaseElement.getLatestProfile()) +
                  "</td>"
            );

		    databaseIndexFile.PutLine("      </tr>");

		    if (database.isEmpty() || database.equalsIgnoreCase(databaseElement.getDatabaseName()))
		    {
				tableProfileList = new TableList
			    (
			   		connection, 
			   		logFile,
			    	databaseElement.getDatabaseName(),
			    	databaseElement.getSchemaName(),
			    	databaseElement.getDatabaseLinkId()
			    );
				
				new TableIndex
				(
					configuration, 
					connection, 
					logFile, 
					tableProfileList, 
					databaseElement.getDatabaseName(), 
					databaseElement.getDatabaseLinkId()
	           ); 
		   }
		}	

	    databaseIndexFile.PutLine("    </table>");		    

	    xmlElement = new XmlElement(4, "h4", "", "Published: " + longDateFormat.format(today.getTime()) + " GMT");
	    databaseIndexFile.PutLine(xmlElement.getXmlElement());
	    
	    databaseIndexFile.PutLine("  </body>");
	    databaseIndexFile.PutLine("</html>");
		
	    databaseIndexFile.Close();
	}
}
