package page.example;

import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.wikiwebserver.core.WareHouse;
import org.wikiwebserver.handler.http.FormData;
import org.wikiwebserver.handler.http.HTTPException;
import org.wikiwebserver.handler.http.interfaces.HTTPResponder;
import page.config.SiteTemplatedPage;

import page.tools.entity.User;

public class HTTPPoster extends SiteTemplatedPage implements HTTPResponder {
    
    private static final String LF = "\r\n";
    private static final int NUM_HEADERS = 5;
    
    private String resourcePath = "/templates/default/poster/";
	
    public void generate() throws HTTPException {

        setTitle("HTTPPoster - WikiWebServer.org");
        addResourceRoot(resourcePath);
        addCSSLink("poster.css");
        
        User user = getUser();
        String target = "";
        Map<String, String> headers = new TreeMap<String, String>();
        String content = "";
        
        Map<String, List<String>> requestHeaders = null;
        Map<String, List<String>> responseHeaders = null;
        String response = "";
        
        FormData formData = getFormData();        
        if (formData != null) {
            if (user == null) {
                throw new HTTPException(403, "User not logged in.");
            }
            
            // Read posted data
            target = formData.getFirst("target");
            for (int i=0; i<NUM_HEADERS; i++) {
                String key = formData.getFirst("headerkeys[" + i + "]");
                String value = formData.getFirst("headervalues[" + i + "]");
                if (key != null && key.length() > 0) {
                    headers.put(key, value);
                }
            }
            content = formData.getFirst("content");
            
            String action = formData.getFirst("action");
            if (action != null && action.equals("POST Request")) {
                // Connect to requested target
                HttpURLConnection remote = null;
                try {
                    remote = WareHouse.postToRemote(target, headers, content);                 
                    
                    // Read the response     
                    responseHeaders = remote.getHeaderFields();
                    Reader reader = new InputStreamReader(remote.getInputStream(), "UTF8");
                    response = WareHouse.readerToString(reader);                
                    
                } catch (Exception ex) {
                    // Failure to connect or non 200 response
                    if (remote != null) {
                        ex.printStackTrace();
                        responseHeaders = remote.getHeaderFields();
                        InputStream es = remote.getErrorStream();
                        if (es != null) {
                            try {
                                Reader reader = new InputStreamReader(es, "UTF8");
                                response = WareHouse.readerToString(reader);   
                            } catch (Exception ex2) {
                                ex2.initCause(ex);
                                ex.printStackTrace();
                                HTTPException httpe = new HTTPException(500, "Failed to read from server");
                                httpe.initCause(ex2);
                                throw httpe;
                            }
                        }
                        else response = ex.toString();
                    } 
                    else response = ex.toString();
                }
                finally {
                    //remote.disconnect();
                }
            }
        }
        
        append(LF + "<!-- REQUEST HEADERS " + requestHeaders + "-->" + LF); 
        
        if (response != null && response.length() > 0) {
            append("<h1>POST Response:</h1>");
            append("<p>The following response was recieved from " + target + "</p>");
            append(LF + "<!-- RESPONSE HEADERS " + responseHeaders + "-->" + LF);     
            append("<pre id='responsePre'>" + WareHouse.escapeHTMLEntities(response) + LF + "</pre>");     
            
            append("<div style='clear: both'></div>");
        }  
        
        
        append("<h1>POST Request:</h1>");
        
        String action = getUrl();  
        append("<form method='post' action='" + action + "' charset='UTF-8'>"); 
        append("<p>Target URL:</p>");
        String a = WareHouse.escapeHTMLEntities(target);
        append("<input id='action' type='text' name='target' size='60' value='" + a + "'/>"); 
             
        append("<p>Additional headers:</p>");
        List<String> keys = new ArrayList<String>(headers.keySet());
        for (int i=0; i<NUM_HEADERS; i++) {
            String key = "", value = "";
            if (keys.size() > i) {
                key = keys.get(i);
                value = headers.get(key);
            }
            append("<div style='padding: 2px'>");
            append("<input type='text' name='headerkeys[" + i + "]' size='15' value='" + key + "'/> "); 
            append("<input type='text' name='headervalues[" + i + "]' size='30' value='" + value + "'/>");
            append("</div>");            
        }
        
        append("<p>Content:</p>");
        append("<textarea id='content' name='content' rows='20' style='width: 100%;' cols='80' wrap='on'>");
        append(WareHouse.escapeHTMLEntities(content));
        append("</textarea>");
        
        if (user == null) {
            append("<p>You must sign in before you can post HTTP requests.</p>");
        } else {
            append("<p><input class='submit' type='submit' name='action' value='POST Request'/></p>"); 
        }
        
        append("</form>");
    }
    
    public String getCacheKey() {
        return null;
    }
  
}
