package page.tools.management;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.wikiwebserver.core.Privilege;
import org.wikiwebserver.core.WareHouse;
import org.wikiwebserver.core.WikiMap;
import org.wikiwebserver.handler.http.interfaces.*;
import page.config.SiteTemplatedPage;
import page.tools.entity.User;

import static org.wikiwebserver.html.HTMLHelper.*;

public class PersistentStorageBrowser extends SiteTemplatedPage implements HTTPResponder {
	
    public void generate() {
        
        setTitle("Persistent storage browser - WikiWebServer.org");
        
        User u = getUser();
        if (u == null || u.getPrivilege().isBelow(Privilege.ADMIN)) {
            throw new SecurityException("Only administrators can view persistent storage");
        }
        
        List<String> heirarchy = new ArrayList<String>();

        if (getFormData() != null) {
            for (int i=0;;i++) {
                String storeName = getFormData().getFirst("level" + i);
                if (storeName == null || storeName.length() == 0) {
                    break;
                }
                heirarchy.add(storeName);
            } 
        }
        
        StringBuilder form = new StringBuilder();
        
        String selected = (heirarchy.size() > 0) ? heirarchy.get(0) : null;

        WikiMap store = WareHouse.getWikiMap();       
        form.append("Root -&gt; " + getMapChooser(store, 0, selected));
        
        for (int i=0; i<heirarchy.size(); i++) {
            store = (WikiMap) store.get(heirarchy.get(i));
            if (store == null) break;
            selected = (heirarchy.size() > i+1) ? heirarchy.get(i+1) : null;
            String chooser = getMapChooser(store, i+1, selected);
            if (chooser != null) form.append(" -&gt; " + chooser);
        }
        
        append("<h1>Persistent storage browser:</h1>"); 
        
        append(form(form.toString()));
        
        if (getFormData() != null) {
  
            append("<table width='700'>");
            append("<tr><th>Key</th><th>Value</th></tr>");        
            if (store != null && store.size() > 0) {
                int count = 0;
    
                for (Map.Entry<String, Object> entry : store.entrySet()) {
                    if (!(entry.getValue() instanceof WikiMap)) {
                        String key = WareHouse.escapeHTMLEntities(entry.getKey().toString());
                        String value = WareHouse.escapeHTMLEntities(entry.getValue().toString());
                        append("<tr><td>" + key + "</td>");
                        append("<td>" + value + "</td></tr>");
                        count++;
                    }
                }
                if (count == 0) {
                    append("<tr><td colspan='2'>Map only contains child Maps</td></tr>");
                }          
            } else {
                append("<tr><td colspan='2'>Empty Map</td></tr>");
            }
            append("</table>");     
        }
    }  
    
    public String getMapChooser(WikiMap map, int idx, String selected) {
        
        List<String> names = new ArrayList<String>();
        

        for (Object obj : map.values()) {
            if (obj instanceof WikiMap) {
                names.add(((WikiMap)obj).getName());
            }
        }
        if (names.size() == 0) return "";
        
        names.add(0, "");        
        String handler = "onchange='this.form.submit();'";
        
        return select("level" + idx, names, selected, handler);
    }
}
