package cat.aoc.pci.test;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.util.Scanner;

import org.openuri.ProcesaResponse;
import org.w3c.dom.Document;

import cat.aoc.pci.PCIInvoker;
import cat.aoc.pci.PCIPeticio;
import cat.aoc.pci.utils.Util;

public class Test {

	/**
	 * Testeja el client de la PCI amb attachments i sense
	 * @param arg
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {

		String id_attachment = "12321";
		
		/* valor mode --> Seleccionar si es vol fer la petició:
		  1) Via Standard, sense attachments i signant la petició XML amb WSS
		  2) Via capçaleres MTOM/XOP, amb attachments i autenticació SSL de forma síncrona (sense WSS)
		  3) Via capçaleres MTOM/XOP, amb attachments i autenticació SSL de forma asíncrona (sense WSS)
		*/
		System.out.println("RECORDEU: canviar la URL del tag <wsdl:port> dels fitxers Sincron/Asincron.wsdl segons la modalitat de consum");
		System.out.println();
		System.out.println("Seleccionar si es vol fer la petició:");
		System.out.println("1) Via Standard, sense attachments i signant la petició XML amb WSS");
		System.out.println("2) Via capçaleres MTOM/XOP, amb attachments i autenticació SSL de forma síncrona (sense WSS)");
		System.out.println("3) Via capçaleres MTOM/XOP, amb attachments i autenticació SSL de forma asíncrona (sense WSS)");
		
		Scanner entradaEscaner = new Scanner (System.in);
        String mode = entradaEscaner.nextLine ();
        
		
		/* valor servei --> Seleccionar quina modalitat es vol consumir
		*/
        
        System.out.println("valor servei --> Seleccionar quina modalitat es vol consumir:");
				
		switch (Integer.parseInt(mode)){
        	case 1: System.out.println("1) ENOTUM");
        			System.out.println("2) MUX_CONSULTA");
    				System.out.println("3) MUX_DESCARREGA");
    				System.out.println("4) TFN");
    				System.out.println("5) ICASS");
    				System.out.println("6) OVER_CONSULTA");
					System.out.println("7) OVER_CONTEXT");
					System.out.println("8) OVER_FORMULARI");
    			break;
        	case 2: System.out.println("1) ENOTUM");
					System.out.println("2) BOE");
					System.out.println("3) ETAULER");
					System.out.println("4) OVER_TRAMITACIO");
					System.out.println("5) DOGC");
					System.out.println("6) PSCP");
        		break;
        	default: System.out.println("1) ENOTUM");
        			 System.out.println("2) BOE");
        			 System.out.println("3) ETAULER");
        			 System.out.println("4) TFN_MASSIU");
        			 System.out.println("5) SCT-DEV");
				break;
        }

		String modalitat = entradaEscaner.nextLine ();
		
		if(Integer.parseInt(mode)!=1){
			/* valor id attachment --> Seleccionar quin valor volem que prengui el id del attachment MTOM
			*/
			System.out.println("valor id attachment --> Seleccionar quin valor volem pel id del attachment MTOM:");
			id_attachment = entradaEscaner.nextLine ();
		}
		
		entradaEscaner.close();
		
		sendSampleRequest(mode,modalitat,id_attachment);

	}

	public static void sendSampleRequest(String mode, String modalitat, String id_attachment) throws Exception{
		
		String path="";
		String path2="docs/sample.pdf";
				
		switch(Integer.parseInt(modalitat)){
			case 1:
				if(Integer.parseInt(mode)==1){
					path="docs/ENOTUM/eNOTUM.xml";
				}else{
					path="docs/ENOTUM/eNOTUM_MTOM.xml";
				}
			break;
			case 2:
				if(Integer.parseInt(mode)==1){
					path="docs/MUX/MUX_CONSULTA.xml";
				}else{
					path="docs/BOE/BOE_MTOM.xml";
					path2="docs/BOE/boeB64.xml";
				}
			break;
			case 3:
				if(Integer.parseInt(mode)==1){
					path="docs/MUX/MUX_DESCARREGA.xml";
				}else{
					path="docs/ETAULER/eTAULER_MTOM.xml";
				}
			break;
			case 4:
				if(Integer.parseInt(mode)==1){
					path="docs/TFN/TFN.xml";
				}else{
					if(Integer.parseInt(mode)==2){
						path="docs/OVER/OVER_TRAMITACIO.xml";
						path2="docs/OVER/OVER.pdf";
					}else{
						path="docs/TFN/TFN_MASSIU_MTOM.xml";
						path2="docs/TFN/tfn.dat";
					}
				}
			break;
			case 5:
				if(Integer.parseInt(mode)==1){
					path="docs/ICASS/ICASS.xml";
				}else{
					if(Integer.parseInt(mode)==2){
						path="docs/DOGC/DOGC_MTOM.xml";
					}else{
						path="docs/SCT/SCT_IDENTIFICACIONS.xml";
						path2="docs/SCT/IDE08279201403261600_001.xml";
					}
				}
			break;
			case 6:
				if(Integer.parseInt(mode)==1){
					path="docs/OVER/OVER_CONSULTA.xml";
				}else{
					path="docs/PSCP/PSCP_MTOM.xml";
				}
			break;
			case 7:
				path="docs/OVER/OVER_CONTEXT.xml";
			break;
			case 8:
				path="docs/OVER/OVER_FORMULARI.xml";
			break;
		}
		
		switch (Integer.parseInt(mode)){
    		case 1: sendSampleRequestWithoutMTOM(path);
    		break;
    		
    		case 2: sendSampleRequestWithMTOM(path,path2,id_attachment);
    		break;
    		
    		case 3: sendSampleRequestWithMTOM_Asincron(path,path2,id_attachment);
    		break;
		}
	}
	
	/**
	 * Envia una peticiÃ³ sincrona de prova amb attachments MTOM
	 * @throws Exception
	 */
	public static void sendSampleRequestWithoutMTOM(String path) throws Exception{

		// creem la peticiÃ³ i afegim l'attachment
		PCIPeticio pciPeticio = new PCIPeticio(path);
		
		// fem la invocacio
		PCIInvoker pciInvoker = new PCIInvoker();
		ProcesaResponse response = pciInvoker.invoke(pciPeticio);

		// fem un marshall de la resposta per a poder-la pinta
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = dbf.newDocumentBuilder();
		Document doc = db.newDocument();
		Util.serializeXML(response, doc);
		String xmlToString = Util.xmlToString(doc.getDocumentElement());

		// printem la resposta
		System.out.println(xmlToString);
	}
	
	/**
	 * Envia una peticio sincrona de prova amb attachments MTOM
	 * @throws Exception
	 */
	public static void sendSampleRequestWithMTOM(String path, String path2, String id_attachment) throws Exception{

		// creem la peticiÃ³ i afegim l'attachment
		PCIPeticio pciPeticio = new PCIPeticio(path);
				
		pciPeticio.addAttachement(id_attachment, Test.class.getClassLoader().getResourceAsStream(path2));
	
		//Per varis attachments
//		pciPeticio.addAttachement("fitxer-2", Test.class.getClassLoader().getResourceAsStream(path2));
//		pciPeticio.addAttachement("fitxer-3", Test.class.getClassLoader().getResourceAsStream(path2));
//		pciPeticio.addAttachement("fitxer-4", Test.class.getClassLoader().getResourceAsStream(path2));
//		pciPeticio.addAttachement("fitxer-5", Test.class.getClassLoader().getResourceAsStream(path2));

		// fem la invocaciÃ³
		PCIInvoker pciInvoker = new PCIInvoker();
		ProcesaResponse response = pciInvoker.invoke(pciPeticio);

		// fem un marshall de la resposta per a poder-la pinta
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = dbf.newDocumentBuilder();
		Document doc = db.newDocument();
		Util.serializeXML(response, doc);
		String xmlToString = Util.xmlToString(doc.getDocumentElement());

		// printem la resposta
		System.out.println(xmlToString);
	}

	/**
	 * Envia una peticiÃ³ de prova amb attachments MTOM
	 * @throws Exception
	 */
	public static void sendSampleRequestWithMTOM_Asincron(String path, String path2, String id_attachment) throws Exception{

		PCIPeticio pciPeticio = new PCIPeticio(path);
		pciPeticio.addAttachement(id_attachment, Test.class.getClassLoader().getResourceAsStream(path2));

		// fem la invocaciÃ³
		PCIInvoker pciInvoker = new PCIInvoker();
		org.openuri.ProcesaResponse_ConfirmacionPeticion response = pciInvoker.invokeAsincron(pciPeticio);

		// fem un marshall de la resposta per a poder-la pinta
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = dbf.newDocumentBuilder();
		Document doc = db.newDocument();

		Util.serializeXML(response, doc);
		String xmlToString = Util.xmlToString(doc.getDocumentElement());

		// printem la resposta
		System.out.println(xmlToString);
	}
	
}
