package net.ihe.xcpd.init.transport;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

import javax.net.ssl.HttpsURLConnection;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.MimeHeaders;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import net.ihe.xcpd.tls.MyHostnameVerifier;
import net.ihe.xcpd.tls.TLSSecurity;

/**
 * 
 * @author abderrazek boufahja
 *
 */
public class SOAPSender {

    public static String sendMessageSoap(String url, String msgSoap){
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        MyHostnameVerifier verifier = new MyHostnameVerifier();
        if (url == null) return null;
        if (url.startsWith("https")) {
            TLSSecurity.setSecurityProperty();
            HttpsURLConnection.setDefaultHostnameVerifier(verifier);
        }
        try{
            SOAPConnectionFactory soapConnFactory = SOAPConnectionFactory.newInstance();
            SOAPConnection connection = soapConnFactory.createConnection();
       
            MessageFactory messageFactory = MessageFactory.newInstance();
            SOAPMessage message = messageFactory.createMessage();
            
            
            SOAPPart soapPart = message.getSOAPPart();
            MimeHeaders headers = message.getMimeHeaders();
            
            headers.addHeader("SOAPAction", "urn:hl7-org:v3:PRPA_IN201305UV02:CrossGatewayPatientDiscovery");
            headers.addHeader("Operation", "RespondingGateway_PRPA_IN201305UV02");
            headers.addHeader("Content-Type","application/soap+xml; charset=UTF-8;action=\"urn:hl7-org:v3:PRPA_IN201305UV02:CrossGatewayPatientDiscovery\"");
            
            //soapPart.setMimeHeader("Content-Type", "application/soap+xml;action=\"urn:hl7-org:v3:PRPA_IN201305UV02:CrossGatewayPatientDiscovery\"");
            //soapPart.setMimeHeader("SOAPAction", "urn:hl7-org:v3:PRPA_IN201305UV02:CrossGatewayPatientDiscovery");
            
            

            
            //MimeHeaders headers = new MimeHeaders();
            //soapPart.setMimeHeader("Content-Type","application/soap+xml;" ); 
           // message.setProperty("Content-Type","application/soap+xml" );
            //message.setProperty("SOAPAction", "urn:hl7-org:v3:PRPA_IN201305UV02:CrossGatewayPatientDiscovery");
            //Iterator i = soapPart.getAllMimeHeaders();
            //String[] ss = soapPart.getMimeHeader("Content-Type");
            
            //MimeHeaders mhs = message.getMimeHeaders();
            //mhs.get
            
            //System.out.println("ct = ");
            //for (String t:ss){
            //    System.out.println("t = " + t);
            //}
            
            System.out.println(soapPart.getAllMimeHeaders());
            
            StreamSource preppedMsgSrc = new StreamSource(new ByteArrayInputStream(msgSoap.getBytes()));
           soapPart.setContent(preppedMsgSrc);
           
           String destination = url;
           //javax.xml.messaging.URLEndpoint urlend = new URLEndpoint(url);
           SOAPMessage reply = connection.call(message, destination);
           
           TransformerFactory transformerFactory = TransformerFactory.newInstance();
           Transformer transformer = transformerFactory.newTransformer();
    
           Source sourceContent = reply.getSOAPPart().getContent();
    
           StreamResult result = new StreamResult(baos);
           transformer.transform(sourceContent, result);
    
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return baos.toString();
        
    }
    
    
}
