package page.plugin;

import java.io.*;

import org.wikiwebserver.core.WareHouse;
import org.wikiwebserver.handler.http.interfaces.*;
import org.wikiwebserver.html.TemplatedPage;
import org.wikiwebserver.html.plugin.Plugin;

import page.config.SiteTemplatedPage;

import static org.wikiwebserver.html.HTMLHelper.*;

import page.config.SiteMonitor;
import page.example.LineCount;

public class ClassDetails extends SiteTemplatedPage implements Plugin, HTTPResponder {
    
    public static final String pluginID = "Details";

    private String className = "page.management.ClassDetails";
    
    public String getActivationButton(TemplatedPage page) {
        String data = page.getClass().getName();
        String url = WareHouse.getUrlPathForClass(this.getClass());
        String f = "togglePlugin('" + pluginID + "', '" + data + "', '" + url + "');";
        return a("javascript:void(0);", "Class Details", "onclick=\"" + f + "\"");
    }
    
    public String getComponent() {
        return div(pluginID, "style='display: none'", ajaxLoadingBar());
    }    
    
    
    public void ajax() {
        String data = (String) getPostedData();
        if (data != null) {  
            setClassName(data);        
            append(updateHTMLScript(pluginID, getDetails()));
        }
    }
    
    public void generate() {
        setTitle("Class Details - WikiWebServer.org");
        append(getDetails()); 
    }      
    
    public void setClassName(String className) {
        this.className = className;
    }   
    
    public String getDetails() {
        
        StringBuilder body = new StringBuilder();
        File sourceFile = new File(className.replace('.', '/') + ".java");
        String sourceUrl = "/" + className.replace('.', '/') + ".java";
        File classFile = new File(className.replace('.', '/') + ".class");
        String classUrl = "/" + className.replace('.', '/') + ".class";
        
        long classAccesses = SiteMonitor.getStatisticAsLong("RequestedResponders", className);
        String compileTime = WareHouse.formatStandardDate(classFile.lastModified());
        String classLoadTime = WareHouse.formatStandardDate(WareHouse.getLastFileChangeTime());
        long classSize = classFile.length();        
        long responseTime = SiteMonitor.getStatisticAsLong("ResponderResponseTimes", className);
        long responseSize = SiteMonitor.getStatisticAsLong("ResponderResponseSizes", className);
        long totalResponseSize = SiteMonitor.getStatisticAsLong("ResponderTotalResponseSizes", className);
        
        String editorUrl = WareHouse.SOURCE_EDITOR_URL + "?path=" + sourceUrl;
        String sourceModifiedTime = WareHouse.formatStandardDate(sourceFile.lastModified());
        long sourceSize = sourceFile.length();  
        
        String sourceLineCount = lineCount(sourceFile);
        
        body.append("<h1>Class Details</h1>" +
                    "<h2>" + className + "</h2>" + 
                    "<p>Class File: <a href='" + classUrl + "'>" + classUrl + "</a><br>" + 
                    "Compiled: " + compileTime + "<br>" +
                    "Loaded: " + classLoadTime + "<br>" +   
                    "File size: " + WareHouse.formatNumber(classSize) + " bytes<br>" +
                    "Responses: " + WareHouse.formatNumber(classAccesses) + "<br>" +
                    "Avg response time: " + WareHouse.formatNumber(responseTime) + "ms<br>" +
                    "Avg response size: " + WareHouse.formatNumber(responseSize) + " bytes<br>" +
                    "Total response size: " + WareHouse.formatNumber(totalResponseSize) + " bytes</p>" +
                    "<p>Source File: <a href='" + sourceUrl + "'>" + sourceUrl + "</a>" +
                               " [<a href='" + editorUrl + "'>Edit</a>]<br>" +
                    "Modified: " + sourceModifiedTime + "<br>" +   
                    "File size: " + WareHouse.formatNumber(sourceSize) + " bytes<br>" +
                    "Lines: " + sourceLineCount + " (code)</p>");            
        
        
        body.append("<h1>Development tools</h1><ul>");
        
        String fullClassURL = getServiceAddress() + classUrl;
        body.append("<li><a href='http://validator.w3.org/check?uri=" + fullClassURL + "'>" +
                    "Validate HTML</a> - W3C Markup Validator</li>");
        
        body.append("<li><a href='http://jigsaw.w3.org/css-validator/validator?uri=" + 
                    fullClassURL + "'>Validate CSS</a> - W3C CSS Validator</li>");
        
        body.append("<li><a href='http://tools.pingdom.com/fpt/?url=" + 
                    fullClassURL + "'>Test page load time</a> - Pingdom Tools</li>");        
                    
        body.append("</ul>");
        
        return body.toString();
        
    }
    
    private String lineCount(File sourceFile) {
        LineCount lineCounter = new LineCount();
        lineCounter.setFile(sourceFile);
        
        return lineCounter.getNumLines();
    }   
}
