package page.example;

import java.text.ParseException;

import org.wikiwebserver.core.WareHouse;
import org.wikiwebserver.handler.http.HTTPException;
import org.wikiwebserver.handler.http.interfaces.HTTPResponder;
import org.wikiwebserver.html.HTMLHelper.ContainerType;

import page.config.SiteTemplatedPage;
import org.wikiwebserver.util.IPToCountry;
import org.wikiwebserver.util.IPToCountry.IPToCountryBlock;

import static org.wikiwebserver.html.HTMLHelper.*;

public class IPToCountryLookup extends SiteTemplatedPage implements HTTPResponder {
	
    public void generate() throws HTTPException {
        
        String ip = getHandler().getSourceAddress();   
        
        if (getFormData() != null) {
            ip = getFormData().getFirst("ip");
        }
        
        setTitle("IP to country lookup - WikiWebServer.org");
        addResourceRoot("/templates/default/management/");
        addCSSLink("country.css"); 
        
        append(h(1, "IP to country lookup"));
        append(form(h(2, "IP Address") + textfield("ip", ip) + br() +
                    submitbutton("action", "lookup")));
        
        append(h(2, "IP Range block details"));
        try {
            long startTime = System.nanoTime();
            IPToCountryBlock b = IPToCountry.getIPToCountryBlock(ip);
            long period = System.nanoTime() - startTime;            
            if (b != null) {
                append(getDetailDisplay("IP from:", IPToCountry.getIPFromLong(b.from)));
                append(getDetailDisplay("IP to:", IPToCountry.getIPFromLong(b.to)));
                append(getDetailDisplay("Registry:", b.registry));
                append(getDetailDisplay("Assigned:", WareHouse.formatStandardDate(b.timeAssigned)));
                append(getDetailDisplay("Country:", b.countryName + 
                                        " (" + b.countryCode2 + ", " + b.countryCode3 + ")"));
            } else {
                append(p("No details found"));
            }
            append(p("Lookup took " + WareHouse.formatNumber((double)period/1000000) + "ms"));
        } catch (ParseException ex) {
            throw new HTTPException(500, "Invalid IP address", ex);
        }
    }   
    
    private String getDetailDisplay(String name, String value) {

        return div(ContainerType.CLASS, "entry", 
                   div(ContainerType.CLASS, "key", name) +
                   div(ContainerType.CLASS, "value", value)
                   ) + cleardiv();
    }    
}
