
/**
 * @(#)MinoidsHtmlReporter.java
 * @author JLMJ
 * @date 2001-10-12
 */
package minoids1.controls;

import netscape.javascript.*;
import minoids1.Box;
import minoids1.counter.MinoidsCounterMotor;
import minoids1.counter.MinoidsCounterEvent;
import java.applet.Applet;
import java.util.Date;

public class MinoidsHtmlReporter
{
    private CounterControlDialog dialog;
    private JSObject javaScript;
    
    private int minoidsOrder;
    private Box[] boxes;
    private String minoidsType;
    private MinoidsCounterMotor minoidsCounterMotor;
    
    public MinoidsHtmlReporter(Applet applet, CounterControlDialog dialog) {
        this.dialog = dialog;
        try {
            javaScript = JSObject.getWindow(applet);
        } catch (Exception ex) {
            
        }
    }

    private String getReportContents(String message) {
        minoidsOrder = dialog.getMinoidsOrder();
        boxes = dialog.getBoxes();
        minoidsType = dialog.getMinoidsType();
        minoidsCounterMotor = dialog.getMinoidsCounterMotor();
        
        StringBuffer sb = new StringBuffer();
        String title = minoidsOrder +
            "-minoids Counting Applet Automatic Report" + message;
        
        sb.append("<html>\n<head><title>" + title + "</title></head>\n");
        sb.append("<body><font face='Verdana'>" +
            "<p align='center'><big>" + title + "</big></p><small>\n");
        if (minoidsType.equals(MinoidsCounterMotor.POLYOMINOIDS_TYPE_STRING)) {
            sb.append(getPolyominoidsTableDataHTMLCode());
        } else if (minoidsType.equals(MinoidsCounterMotor.POLYOMINOES_TYPE_STRING)) {
            sb.append(getPolyominoesTableDataHTMLCode());
        }
        sb.append(getStatisticsHTMLCode());
        sb.append("</small></font>");
        sb.append("</body>\n</html>\n");
        return sb.toString();
    }
    
    public void popupWindow() {
        if (javaScript == null)
            return;
        try {
            javaScript.eval("alert('Counting Finished');");
        } catch (Exception e) {
            
        }
    }
    
    public void updateJavaScriptReport(String message) {
        if (javaScript != null)
            javaScript.call("applet", new Object[] { getReportContents(message) });
    }

    
    private String getPolyominoidsTableDataHTMLCode() {
        if (boxes == null)
            return "There were not selected boxes!!! (order = 0)<p>\n";
        StringBuffer sb = new StringBuffer();
        sb.append("<table align='center' border='1'>\n");
        sb.append("<tr><th colspan='7'>Translations Polyominoids</th></tr>\n");
        sb.append("<tr><th>Order " + minoidsOrder + "</th>" +
            "<th colspan='2'>" + MinoidsCounterMotor.ANY_CONNECTIONS_TYPE_STRING + "</th>" +
            "<th colspan='2'>" + MinoidsCounterMotor.HARD_CONNECTIONS_TYPE_STRING + "</th>" +
            "<th colspan='2'>" + MinoidsCounterMotor.SOFT_CONNECTIONS_TYPE_STRING + "</th></tr>\n");
        
        String rot;
        MinoidsCounterEvent mce;
        String count;
        Box onlyThisBox = minoidsCounterMotor.getOnlyThisBox();
        for (int i=0; i < boxes.length; i++) {
            if (onlyThisBox != null && onlyThisBox != boxes[i])
                continue;
            
            sb.append("<tr><td><small>" + boxes[i] + "</small></td>");
            rot = "<sup>" + boxes[i].getNumberOfRotations() +
                "x</sup></td><td align='right'>";
            
            mce = minoidsCounterMotor.getAnyMinoidsCounterEvent(i);
            count = (mce == null) ? "?" : "" + mce.getNumberOfMinoids();
            sb.append("<td align='right'>" + rot + count + "</td>");
            
            if (boxes[i].getX() != 0) {
                mce = minoidsCounterMotor.getHardMinoidsCounterEvent(i);
                count = (mce == null) ? "?" : "" + mce.getNumberOfMinoids();
                sb.append("<td align='right'>" + rot + count + "</td>");
            } else {
                sb.append("<td align='right' colspan='2'>0</td>");
            }
            
            if (boxes[i].getX() == 0) {
                mce = minoidsCounterMotor.getSoftMinoidsCounterEvent(i);
                count = (mce == null) ? "?" : "" + mce.getNumberOfMinoids();
                sb.append("<td align='right'>" + rot + count + "</td></tr>\n");
            } else {
                sb.append("<td align='right' colspan='2'>0</td></tr>");
            }
        }
        if (onlyThisBox == null) {
            sb.append("<tr><td><small>Total of Polyominoids</small></td>");
            sb.append("<td colspan='2' align='right'>" + minoidsCounterMotor.getAnyMinoidsTotalCount() + "</td>");
            sb.append("<td colspan='2' align='right'>" + minoidsCounterMotor.getHardMinoidsTotalCount() + "</td>");
            sb.append("<td colspan='2' align='right'>" + minoidsCounterMotor.getSoftMinoidsTotalCount() + "</td>");
        }
        sb.append("</table><p>\n");
        return sb.toString();
    }
    
    private String getPolyominoesTableDataHTMLCode() {
        if (boxes == null)
            return "There were not selected boxes!!! (order = 0)<p>\n";
        StringBuffer sb = new StringBuffer();
        sb.append("<table align='center' border='1'>\n");
        sb.append("<tr><th colspan='3'>Translations Polyominoes</th></tr>\n");
        sb.append("<tr><th>Order " + minoidsOrder + "</th>" +
            "<th colspan='2'>Soft</th></tr>\n");
        
        String rot;
        MinoidsCounterEvent mce;
        String count;
        
        Box onlyThisBox = minoidsCounterMotor.getOnlyThisBox();
        for (int i=0; i < boxes.length; i++) {
            if (onlyThisBox != null && onlyThisBox != boxes[i])
                continue;
            
            if (boxes[i].getX() != 0)
                continue;
            sb.append("<tr><td><small>" + boxes[i] + "</small></td>");
            //TranslationsCounter tc = new TranslationsCounter(boxes[i], null);
            rot = "<sup>" + boxes[i].getNumberOfRotations() / 3 +
                "x</sup></td><td align='right'>";
            
            mce = minoidsCounterMotor.getSoftMinoidsCounterEvent(i);
            count = (mce == null) ? "?" : "" + mce.getNumberOfMinoids();
            sb.append("<td align='right'>" + rot + count + "</td></tr>\n");
        }
        if (onlyThisBox == null) {
            sb.append("<tr><td><small>Total of Polyominoes</small></td>");
            sb.append("<td colspan='2' align='right'>" +
                minoidsCounterMotor.getPolyominoesTotalCount() + "</td>");
        }
        sb.append("</table><p>\n");
        return sb.toString();
    }
    
    private String getStatisticsHTMLCode() {
        if (minoidsCounterMotor.isCountFinished()) {
            StringBuffer sb = new StringBuffer();
            sb.append("<b>Java Code Version : </b> "
                  + minoidsCounterMotor.getVersion() + "<br>\n");

            long elapsedTime = minoidsCounterMotor.getElapsedTime();
            int ms = (int)elapsedTime % 1000; elapsedTime /= 1000;
            int s = (int)elapsedTime % 60; elapsedTime /= 60;
            int m = (int)elapsedTime % 60; elapsedTime /= 60;
            int h = (int)elapsedTime % 24;
            sb.append("<b>Elapsed time : </b>" +
                h + "h " + m + "m " + s + "s " + ms + "ms<br>\n");
            
            sb.append("<b>Generated at : </b>" + new Date().toString() + "<br>\n");
            
            sb.append("<b>Java Virtual Machine: </b>" +
                          System.getProperty("java.version") + ", " +
                          System.getProperty("java.vendor") + //", " +
                          //System.getProperty("java.vendor.url") +
                          "<br>\n");
            
            sb.append("<b>Operating System : </b>" +
                          System.getProperty("os.name") + ", " +
                          System.getProperty("os.arch") + " " +
                          System.getProperty("os.version") +
                          "<br>\n");
            return sb.toString();
        } else {
            return "<i>Counting in progress...</i><br>";
        }
    }
}

