package page.example.secpay;

import java.util.Random;

import org.wikiwebserver.core.WareHouse;
import org.wikiwebserver.handler.http.FormData;
import org.wikiwebserver.handler.http.interfaces.*;

import page.config.SiteTemplatedPage;
import page.tools.entity.User;

public class SECPayRawAPITest extends SiteTemplatedPage implements HTTPResponder {
    
    public static final String LF = "\r\n";
	
    public void generate() {
        
        // Defaults
        String[] titles = { "SECPay ID", "VPN Password", "Transaction ID", 
                            "IP Address", "Name", "Card Number", "Amount", 
                            "Card Expiry", "Issue Number", "Start Date", 
                            "Order", "Shipping", "Billing", "Options" };
        
        User user = getUser();
        String transID = String.valueOf(new Random().nextInt(10000));
        String ip = getServiceAddress();
        String[] args = { "secpay", "secpay", transID, ip, 
                          "WikiWebServer Test", "4444333322221111",
                          "10", "1220", "", "", "", "", "",
                          "test_status=true,dups=false,card_type=Visa" };

        
        FormData formData = getFormData();
        if (formData != null) {
            String action = formData.getFirst("action");
            if (action != null && action.equals("Construct Raw Requests")) {
                for (int i=0; i<args.length; i++) {
                    args[i] = WareHouse.escapeHTMLEntities(formData.getFirst("arg" + (i+1)));
                    if (args[i] == null) args[i] = "";
                }
            }
        }
       
        setTitle("SECPay API Testing - WikiWebServer.org");
        
        append("<h1>SECPay API Testing</h1>");
        append("<p>Enter required details to construct API call.</p>");
        
        append("<form method='post'>");
        for (int i=0; i<args.length; i++) {
            append(getFormField(titles[i], "arg" + (i+1), args[i]));
        }
        
        append("<input type='submit' class='submit' style='margin-left: 12em;' name='action' value='Construct Raw Requests'>");
        append("</form>");          
             
        append("<h1>Make payment (XMLRPC)</h1>");   
        String action = WareHouse.getUrlPathForClass(page.example.HTTPPoster.class);
        append("<form method='post' action='" + action + "'>");
                
        append("<pre>" + WareHouse.escapeHTMLEntities(getXMLRPCTest(args)) + "</pre>");
        append("<input type='hidden' name='target' value='https://www.secpay.com/secxmlrpc/make_call'>" +        		    
        		    "<input type='hidden' name='content' value='" + getXMLRPCTest(args) + "'>" +
        		    "<input type='hidden' name='action' value='DO NOT POST Request'>");
        
        if (user != null) {
            append("<p><input type='submit' class='submit' name='testName' value='Post XMLRPC'></p>"); 
        } else {
            append("<p>You must sign in to post HTTP requests.</p>");
        }
        append("</form>");           
        
        append("<h1>Make payment (SOAP)</h1>");    
        append("<form method='post' action='" + action + "'>");
                
        append("<pre>" + WareHouse.escapeHTMLEntities(getSOAPTest(args)) + "</pre>");        
        append("<input type='hidden' name='target' value='https://www.secpay.com/java-bin/soap'>" +                  
               "<input type='hidden' name='content' value='" + getSOAPTest(args) + "'>" +
               "<input type='hidden' name='headerkeys[0]' value='SOAPAction'>" +      
               "<input type='hidden' name='headervalues[0]' value=''>" +                        
               "<input type='hidden' name='action' value='DO NOT POST Request'>");      

        if (user != null) {
            append("<p><input type='submit' class='submit' name='testName' value='Post SOAP'></p>"); 
        } else {
            append("<p>You must sign in to post HTTP requests.</p>");
        }
        append("</form>");          
    }
    
    
    
    private String getXMLRPCTest(String[] args) {
        
        StringBuilder builder = new StringBuilder();
        
        builder.append("<?xml version=\"1.0\"?>" + LF +
                       "<methodCall>" + LF +
                       "  <methodName>SECVPN.validateCardFull</methodName>" + LF +
                       "  <params>" + LF);
        
        for (int i=0; i<args.length; i++) {
            builder.append("    " + getXMLRPCParam(args[i]) + LF);
        }
        
        builder.append("  </params>" + LF +
                       "</methodCall>");
        
        return builder.toString();
    }
    
    
    private String getSOAPTest(String[] args) {
        
        StringBuilder builder = new StringBuilder();
        
        builder.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + LF +
                       "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" + LF +
                       "  <soapenv:Body>" + LF +
                       "    <ns1:validateCardFull soapenv:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:ns1=\"SECCardService\">" + LF);
        
        for (int i=0; i<args.length; i++) {
            builder.append("      " + getSOAPArg((i+1), args[i]) + LF);
        }

        
        builder.append("    </ns1:validateCardFull>" + LF +
                       "  </soapenv:Body>" + LF +
                       "</soapenv:Envelope>");
        
        return builder.toString();
    } 
    
    
    private String getFormField(String title, String name, String value) {
        return "<div style='padding: 2px;'>" +
        	   "<div style='float: left; width: 12em;'>" + title + "</div>" +
               "<input type='text' name='" + name + "' size='60' value='" + value + "'/>" +
               "</div><div class='clear: both'></div>";
    }     
    
    private String getXMLRPCParam(String value) {
        return "<param><value><string>" + value + "</string></value></param>";
    }    
    
    private String getSOAPArg(int i, String value) {
        return "<ns1:arg" + i + " xsi:type=\"xsd:string\">" + value + "</ns1:arg" + i + ">";
    }
}
