package dataProfileWebSite;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import dataWarehousingTools.LogFile;
import dataWarehousingTools.Configuration;
import dataWarehousingTools.DashboardFile;

public class Patterns 
{
    public Patterns
    (
        	Configuration configuration, 
        	Connection connection, 
        	LogFile logFile,
        	int databaseLinkId,
        	String databaseName,
        	String schemaName,
        	String tableName,
        	int rowCount,
        	int tableProfileId,
        	int columnProfileId, 
        	String columnName,
        	Timestamp dateTimeStatisticsCollected
    )
    {
    	Statement statement = null;
    	ResultSet resultSet = null;
    	
		String pattern;
		int frequency;
		DashboardFile patternsFile;
		XmlElement xmlElement;
		Calendar today;
		DateFormat longDateFormat;
		DecimalFormat integerFormat;
		int rowNumber;

    	today = Calendar.getInstance();
    	longDateFormat = new SimpleDateFormat("EEE, dd-MMM-yyyy HH:mm:ss");
        longDateFormat.format(today.getTime());
		integerFormat = new DecimalFormat("###,###,###,###,###");
		
		patternsFile = new DashboardFile
		(
			configuration.getHtmlFileLocation() +
			"Pattern" + columnProfileId + ".htm"
		);
		patternsFile.PutLine("<!DOCTYPE html>");
		patternsFile.PutLine("<head>");
		patternsFile.PutLine("  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>");  
		patternsFile.PutLine
	    (
	    	"  <link rel=\"stylesheet\" type=\"text/css\" href=\"" +
	    	configuration.getLinkToStylesheets() +
	    	"style.css\"/>"
	    );
	    
	    xmlElement = new XmlElement(2, "title", "", "Patterns for Column: " + columnName);
	    patternsFile.PutLine(xmlElement.getXmlElement());

	    patternsFile.PutLine("    <table>");
	    patternsFile.PutLine("      <tr>");
	    patternsFile.PutLine("        <th>Database</th>");
	    patternsFile.PutLine("        <th>Schema</th>");
	    patternsFile.PutLine("        <th>Table</th>");
	    patternsFile.PutLine("        <th>Row Count</th>");
	    patternsFile.PutLine("        <th>Column</th>");
	    patternsFile.PutLine("        <th>Date Statistics Collected</th>");
	    patternsFile.PutLine("      </tr>");
	    patternsFile.PutLine("      <tr>");
	    patternsFile.PutLine("        <td>" + databaseName + "</td>");
	    patternsFile.PutLine("        <td>" + schemaName + "</td>");
	    patternsFile.PutLine("        <td>" + tableName + "</td>");
	    patternsFile.PutLine("        <td>" + integerFormat.format(rowCount) + "</td>");
	    patternsFile.PutLine("        <td>" + columnName + "</td>");
	    patternsFile.PutLine("        <td>" + longDateFormat.format(dateTimeStatisticsCollected.getTime()) + "</td>");
	    patternsFile.PutLine("      </tr>");
	    patternsFile.PutLine("    </table>");
    
	    xmlElement = new XmlElement
	    (
	    	6, 
	    	"a", 
	    	"href=\"" +
	    	"index.html\"",
	    	"Back to List of Databases"
	    );
	    patternsFile.PutLine("<p>" + xmlElement.getXmlElement() + "</p>");

	    xmlElement = new XmlElement
	    (
	    	6, 
	    	"a", 
	    	"href=\"" +
	    	"Schema" + databaseLinkId + ".htm\"",
	    	"Back to List of Tables"
	    );
	    patternsFile.PutLine("<p>" + xmlElement.getXmlElement() + "</p>");
    
	    xmlElement = new XmlElement
	    (
	    	6, 
	    	"a", 
	    	"href=\"" +
	    	"TableProfile" + tableProfileId + ".htm\"",
	    	"Back to List of Columns"
	    );
	    patternsFile.PutLine("<p>" + xmlElement.getXmlElement() + "</p>");

	    xmlElement = new XmlElement(4, "h4", "", "Published: " + longDateFormat.format(today.getTime()) + " GMT");
	    patternsFile.PutLine(xmlElement.getXmlElement());
		
	    patternsFile.PutLine("</head>");
	    patternsFile.PutLine("  <body>");
		
	    patternsFile.PutLine("    <table style=\"border-style:none;border-collapse:collapse;\">");
	    patternsFile.PutLine("      <tr style=\"border-style:none;border-collapse:collapse;\">");
	    patternsFile.PutLine("        <th style=\"text-align:left;padding:5px;\">Pattern</th>");
	    patternsFile.PutLine("        <th style=\"text-align:right;padding:5px;\">Frequency</th>");
	    patternsFile.PutLine("        <th style=\"text-align:left;border-style:none;\"> </th>");
	    patternsFile.PutLine("        <th colspan=\"2\" style=\"text-align:center;border-style:solid;border-width:1px;padding:5px;\">Legend</th>");	    
	    patternsFile.PutLine("      </tr>");

		try
		{
			statement = connection.createStatement();
		}
		catch(SQLException sqle)
		{
			logFile.logMessage(sqle.toString());
		}

		try
		{
			resultSet = statement.executeQuery
			(
				"select " +   	
					"id                 as pattern_id, " +
					"frequency, " +
					"pattern " +
				"from " +
                    "pattern " +
				"where " +
                    "column_profile_id = " + columnProfileId +
                "order by " +
                    "frequency desc " +
                "limit 50"
            );
		}
		catch(SQLException sqle)
		{
			logFile.logMessage(sqle.toString());
		}
		
		rowNumber = 1;
		try 
		{
			while (resultSet.next())
			{
				frequency = resultSet.getInt("frequency");
				pattern = new String(resultSet.getString("pattern"));
								
			    patternsFile.PutLine("      <tr style=\"border-collapse:collapse;\">");
			    patternsFile.PutLine("        <td style=\"text-align:left;padding:5px;\">" + pattern + "</td> ");
			    patternsFile.PutLine("        <td style=\"text-align:right;padding:5px;\">" + integerFormat.format(frequency) + "</td>");
			    patternsFile.PutLine("        <td style=\"text-align:left;border-style:none;padding-left:100px\"> </td>");

			    switch (rowNumber) 
			    {
	                case 1:
	    			    patternsFile.PutLine("        <th style=\"text-align:center;border-style:solid;border-width:1px;padding:5px;\">Code</th>");
	    			    patternsFile.PutLine("        <th style=\"text-align:left;border-style:solid;border-width:1px;padding:5px;\">Meaning</th>");
	                    break;
	                case 2:
	    			    patternsFile.PutLine("        <td style=\"text-align:center;border-style:solid;border-width:1px;padding:5px;\">A</td>");
	    			    patternsFile.PutLine("        <td style=\"text-align:left;border-style:solid;border-width:1px;padding:5px;\">An alphabetic character</td>");
	                    break;
	                case 3:
	    			    patternsFile.PutLine("        <td style=\"text-align:center;border-style:solid;border-width:1px;padding:5px;\">9</td>");
	    			    patternsFile.PutLine("        <td style=\"text-align:left;border-style:solid;border-width:1px;padding:5px;\">A numeric character</td>");
	                    break;
	                case 4:
	    			    patternsFile.PutLine("        <td style=\"text-align:center;border-style:solid;border-width:1px;padding:5px;\">s</td>");
	    			    patternsFile.PutLine("        <td style=\"text-align:left;border-style:solid;border-width:1px;padding:5px;\">A normal space (U+0020)</td>");
	                    break;
	                case 5:
	    			    patternsFile.PutLine("        <td style=\"text-align:center;border-style:solid;border-width:1px;padding:5px;\">!</td>");
	    			    patternsFile.PutLine("        <td style=\"text-align:left;border-style:solid;border-width:1px;padding:5px;\">A punctuation mark</td>");
	                    break;
	                case 6:
	    			    patternsFile.PutLine("        <td style=\"text-align:center;border-style:solid;border-width:1px;padding:5px;\">$</td>");
	    			    patternsFile.PutLine("        <td style=\"text-align:left;border-style:solid;border-width:1px;padding:5px;\">A currency symbol</td>");
	                    break;
	                case 7:
	    			    patternsFile.PutLine("        <td style=\"text-align:center;border-style:solid;border-width:1px;padding:5px;\">é</td>");
	    			    patternsFile.PutLine("        <td style=\"text-align:left;border-style:solid;border-width:1px;padding:5px;\">An accented letter</td>");
	                    break;
	                case 8:
	    			    patternsFile.PutLine("        <td style=\"text-align:center;border-style:solid;border-width:1px;padding:5px;\">+</td>");
	    			    patternsFile.PutLine("        <td style=\"text-align:left;border-style:solid;border-width:1px;padding:5px;\">A mathematical or other symbol</td>");
	                    break;
	                case 9:
	    			    patternsFile.PutLine("        <td style=\"text-align:center;border-style:solid;border-width:1px;padding:5px;\">^</td>");
	    			    patternsFile.PutLine("        <td style=\"text-align:left;border-style:solid;border-width:1px;padding:5px;\">A control character</td>");
	                    break;
	                case 10:
	    			    patternsFile.PutLine("        <td style=\"text-align:center;border-style:solid;border-width:1px;padding:5px;\">b</td>");
	    			    patternsFile.PutLine("        <td style=\"text-align:left;border-style:solid;border-width:1px;padding:5px;\">A non-breaking space (U+00a0)</td>");
	                    break;
	                default:     
	    			    patternsFile.PutLine("        <td style=\"border-style:none;\"> </td>");
	    			    patternsFile.PutLine("        <td style=\"border-style:none;\"> </td>");
	                    break;
			    }			    
			    patternsFile.PutLine("      </tr>");
			    rowNumber++;
			}
		} 
		catch (SQLException sqle) 
		{
			logFile.logMessage(sqle.toString());
		}

		for ( ; rowNumber < 11; rowNumber++)
		{
		    patternsFile.PutLine("      <tr>");
		    switch (rowNumber) 
		    {
                case 1:
    			    patternsFile.PutLine("        <th colspan=\"2\" style=\"border-style:none;\"> </th>");
    			    patternsFile.PutLine("        <th style=\"border-style:none;\"> </th>");
    			    patternsFile.PutLine("        <th style=\"text-align:center;border-style:solid;border-width:1px;padding:5px;\">Code</th>");
    			    patternsFile.PutLine("        <th style=\"text-align:left;border-style:solid;border-width:1px;padding:5px;\">Meaning</th>");
                    break;
                case 2:
    			    patternsFile.PutLine("        <td colspan=\"2\" style=\"border-style:none;\"> </td>");
    			    patternsFile.PutLine("        <td style=\"border-style:none;\"> </td>");
    			    patternsFile.PutLine("        <td style=\"text-align:center;border-style:solid;border-width:1px;padding:5px;\">A</td>");
    			    patternsFile.PutLine("        <td style=\"text-align:left;border-style:solid;border-width:1px;padding:5px;\">An alphabetic character</td>");
                    break;
                case 3:
    			    patternsFile.PutLine("        <td colspan=\"2\" style=\"border-style:none;\"> </td>");
    			    patternsFile.PutLine("        <td style=\"border-style:none;\"> </td>");
    			    patternsFile.PutLine("        <td style=\"text-align:center;border-style:solid;border-width:1px;padding:5px;\">9</td>");
    			    patternsFile.PutLine("        <td style=\"text-align:left;border-style:solid;border-width:1px;padding:5px;\">A numeric character</td>");
                    break;
                case 4:
    			    patternsFile.PutLine("        <td colspan=\"2\" style=\"border-style:none;\"> </td>");
    			    patternsFile.PutLine("        <td style=\"border-style:none;\"> </td>");
    			    patternsFile.PutLine("        <td style=\"text-align:center;border-style:solid;border-width:1px;padding:5px;\">s</td>");
    			    patternsFile.PutLine("        <td style=\"text-align:left;border-style:solid;border-width:1px;padding:5px;\">A normal space (U+0020)</td>");
                    break;
                case 5:
    			    patternsFile.PutLine("        <td colspan=\"2\" style=\"border-style:none;\"> </td>");
    			    patternsFile.PutLine("        <td style=\"border-style:none;\"> </td>");
    			    patternsFile.PutLine("        <td style=\"text-align:center;border-style:solid;border-width:1px;padding:5px;\">!</td>");
    			    patternsFile.PutLine("        <td style=\"text-align:left;border-style:solid;border-width:1px;padding:5px;\">A punctuation mark</td>");
                    break;
                case 6:
    			    patternsFile.PutLine("        <td colspan=\"2\" style=\"border-style:none;\"> </td>");
    			    patternsFile.PutLine("        <td style=\"border-style:none;\"> </td>");
    			    patternsFile.PutLine("        <td style=\"text-align:center;border-style:solid;border-width:1px;padding:5px;\">$</td>");
    			    patternsFile.PutLine("        <td style=\"text-align:left;border-style:solid;border-width:1px;padding:5px;\">A currency symbol</td>");
                    break;
                case 7:
    			    patternsFile.PutLine("        <td colspan=\"2\" style=\"border-style:none;\"> </td>");
    			    patternsFile.PutLine("        <td style=\"border-style:none;\"> </td>");
    			    patternsFile.PutLine("        <td style=\"text-align:center;border-style:solid;border-width:1px;padding:5px;\">é</td>");
    			    patternsFile.PutLine("        <td style=\"text-align:left;border-style:solid;border-width:1px;padding:5px;\">An accented letter</td>");
                    break;
                case 8:
    			    patternsFile.PutLine("        <td colspan=\"2\" style=\"border-style:none;\"> </td>");
    			    patternsFile.PutLine("        <td style=\"border-style:none;\"> </td>");
    			    patternsFile.PutLine("        <td style=\"text-align:center;border-style:solid;border-width:1px;padding:5px;\">+</td>");
    			    patternsFile.PutLine("        <td style=\"text-align:left;border-style:solid;border-width:1px;padding:5px;\">A mathematical or other symbol</td>");
                    break;
                case 9:
    			    patternsFile.PutLine("        <td colspan=\"2\" style=\"border-style:none;\"> </td>");
    			    patternsFile.PutLine("        <td style=\"border-style:none;\"> </td>");
    			    patternsFile.PutLine("        <td style=\"text-align:center;border-style:solid;border-width:1px;padding:5px;\">^</td>");
    			    patternsFile.PutLine("        <td style=\"text-align:left;border-style:solid;border-width:1px;padding:5px;\">A control character</td>");
                    break;
                case 10:
    			    patternsFile.PutLine("        <td colspan=\"2\" style=\"border-style:none;\"> </td>");
    			    patternsFile.PutLine("        <td style=\"border-style:none;\"> </td>");
    			    patternsFile.PutLine("        <td style=\"text-align:center;border-style:solid;border-width:1px;padding:5px;\">b</td>");
    			    patternsFile.PutLine("        <td style=\"text-align:left;border-style:solid;border-width:1px;padding:5px;\">A non-breaking space (U+00a0)</td>");
                    break;
		    }			    
		    patternsFile.PutLine("      </tr>");
		}
		
		patternsFile.PutLine("    </table>");

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