package page.tools.admin;

import org.wikiwebserver.core.Privilege;
import org.wikiwebserver.core.SecurityMan;
import org.wikiwebserver.core.WareHouse;
import org.wikiwebserver.handler.http.HTTPException;
import org.wikiwebserver.handler.http.interfaces.HTTPResponder;
import org.wikiwebserver.html.HTMLHelper;

import page.config.SiteTemplatedPage;

import page.tools.entity.User;

import static org.wikiwebserver.html.HTMLHelper.*;

public class ManagementTools extends SiteTemplatedPage implements HTTPResponder {
    
    private final String RESOURCE_ROOT = "/templates/default/user/"; 
    
    public void generate() throws HTTPException {
        
        addResourceRoot(RESOURCE_ROOT);
        setTitle("Management Tools - WikiWebServer.org");
        addCSSLink("user.css");
        
        String reloadButton = "Purge file and class cache";
        String cacheButton = "Toggle caching mode";
        String syncButton = "Synchronize Files";
        String haltButton = "Halt Java Virtual Machine";        
        String adminButton = "Set Super Admin Privilege";
        User currentUser = getUser();
        String superPassword = null;
        String superPasswordError = null;
        String result = null;
        
        // Process form data
        if (getFormData() != null) {
            String action = getFormData().getFirst("action");
            if (action == null) {
                // No action
            }
            else if (action.equals(reloadButton)) {
                WareHouse.notifyFileChange();
                result = p("WikiCache purged. New connections will use a fresh class loader."); 
            }  
            else {
                superPassword = getFormData().getFirst("serverPassword");
                SecurityMan.checkSuperPassword(superPassword);      
               
                if (action.equals(syncButton)) {
                    String syncAction = WareHouse.getUrlPathForClass(org.wikiwebserver.sync.JNLP.class);
                    result = HTMLHelper.form(p("Click below to launch JSiteSync") +
                                             hiddenfield("serverPassword", superPassword) +
                                             submitbutton("action", "Launch JSiteSync"), syncAction);
                }
                else if (action.equals(cacheButton)) {
                    WareHouse.enableCaching(!WareHouse.isCachingEnabled());
                }
                else if (action.equals(haltButton)) {
                    try {
                        getResponse().setCode(302);
                        getResponse().getHeaders().set("Location", getServiceAddress() + "/");
                        getWriter().write("Redirecting...");
                        getWriter().flush();
                        WareHouse.halt(superPassword);                            
                    } catch (Exception ex) {}
                    // If we get here, something went wrong
                    result = p("Failed to halt WikiWebServer");
                }                   
                else if (action.equals(adminButton)) {
                    if (currentUser.getPrivilege().isAbove(Privilege.GUEST)) {
                        currentUser.setPrivilege(Privilege.SUPER_ADMIN, superPassword);
                        result = p("Privilege upgraded to super admin");
                    }
                }
            } 
        }
            

        if (result != null) {
            append(h(1, "Result"));
            append(result);
        } else {
            append(h(1, "Management Options") +
                   form(
                   h(2, "Purge file and class cache") +
                   p("Empty the HTTPOutputStream cache and reload all non-core classes with a" +
                   " fresh class loader. This button notifies WikiWebServer that changes " +
                   " have been made to files on the filing system and cached file data" +
                   " should not be used.") +
                   submitbutton("action", reloadButton)));                  
            
            append(h(1, "Advanced Options"));
            
           
            String textField = getTextField("serverPassword", superPassword, true, superPasswordError, true);
            String email = (currentUser != null) ?  currentUser.getEmail() : "UNKNOWN USER";
            String cacheToggle = WareHouse.isCachingEnabled() ? "Disable" : "Enable";
            append(form(
                    getFormRow("Server password:", textField) +
                    p("(The server password is specified in the WikiWebServer configuration.)") +
                   
                    h(2, "Synchronize WikiWebServer") +
                    p("Synchronize WikiWebServer files with a local directory.") +
                    submitbutton("action", syncButton) +
                    
                    h(2, cacheToggle + " WikiWebServer caching") +
                    p(cacheToggle + " the file and class cache used to optimise response time.") +
                    submitbutton("action", cacheButton) +                    
                   
                    h(2, "Halt WikiWebServer") +
                    p("Causes WikiWebServer to save persistent data and halt the JVM." +
                      " The service wrapper should automatically restart WikiWebServer in" +
                      " a new JVM.") +
                    submitbutton("action", haltButton) +
                   
            	    h(2, "Super admin privilege") +
            	    p("Give " + email + " super admin privilege.") +
            	    submitbutton("action", adminButton)));
        }
       
    }  
    
    private String getFormRow(String label, String field) {
        return "<div class='textFieldLabel'>" + label + "</div>" + field + 
               "<div style='clear: left; padding-bottom: 3px;'></div>";
    }      
    
    private String getTextField(String name, String def, boolean pw, 
                                String error, boolean enabled) {
        
        String fieldClass = (error == null) ? "textField" : "textFieldError";
        String value = (def != null) ? def : "";
        String type = pw ? "password" : "text";
        String errorText = (error == null) ? "" : error;
        String disabled = (!enabled) ? " disabled" : "";
        
        return "<div class='fieldBox'><input class='" + fieldClass + "' type='" + 
        type + "' name='" +  name +  "' value='" + value + "' size='30'" + 
        disabled + "></div>" +
        "<div class='fieldError'>&nbsp;" + errorText + "</div>";
    }    
}
