package net.catcert.psa.test.signature;

import java.math.BigInteger;
import java.security.cert.X509Certificate;

import net.catcert.psa.services.PsaServices;
import net.catcert.psa.util.Utils;
import schema.core._0._1.dss.tc.names.oasis.InternationalStringType;
import schema.core._0._1.dss.tc.names.oasis.ResultDocument.Result;

import com.sadiel.catcert.psa.ws.client.SignatureServiceStub;
import com.sadiel.catcert.psa.ws.client.factory.PSARequestFactory;
import com.sadiel.catcert.psa.ws.signature.InitSignDocumentAtBrowserDocument;
import com.sadiel.catcert.psa.ws.signature.InitSignDocumentAtBrowserResponseDocument;
import com.sadiel.www.pdf.visiblesignature.v0_1.VisibleSignatureDataType;

import dss_signsession.profiles._0._1.psa.catcert.SignDocumentAtBrowserRSPNSDocument.SignDocumentAtBrowserRSPNS;

/**
 * Invokes method "Init Sign Document at Browser" in psa signature service
 * @author suport tècnic CATCert
 *
 */
public class SignDocumentAtBrowserSample {


	public static SignDocumentAtBrowserRSPNS signDocumentAtBrowser() throws Exception{
		
		/** Init Sign Document at Browser **/

		//política de procediment
		String functionalProcedureId = "PP-0004";

		//localització (idioma)
		String locale = "ES";

		//certificat de signatura
		String certFilePath = System.getProperty("user.dir")+"/resource/test/signature/SIGN_SegellOrgan_Ajuntament_Exemple.cer";
		X509Certificate x509Certificate = Utils.getX509Certificate(certFilePath);
		String issuerName = Utils.getIssuerForPSARequest(x509Certificate);
		BigInteger serialNumber = x509Certificate.getSerialNumber();


		//documents a signar
		String dataToSignFilePath = System.getProperty("user.dir")+"/resource/test/docs/prova.pdf";
		byte[] dataToSign = Utils.resourceAsBytes(dataToSignFilePath);
		byte[][] documents = new byte[1][dataToSign.length];
		documents[0] = dataToSign;

		//validació contra PSIS
		boolean psisValidation = false;

		//URL de retorn
		//String redirectURL = "http://www.catcert.net?UUID=";
		String redirectURL = null;

		//mostrar el UUID del document en la URL de retorn
		boolean addUUID = false;

		//mostrar els links als documents
		boolean showLinks = true;

		//missatge de finalització de procés que es mostra a l'usuari
		String finalMsg = "Procés finalitzat."; 

		//si s’ha de mostrar la plana resum a la finalització del procés de signatura
		boolean showResume = true;

		//signature visible
		boolean showVisibleSignature = false;

		//configuració de la signatura visible
		VisibleSignatureDataType visibleSignatureData = null;

		//petició
		InitSignDocumentAtBrowserDocument request =  PSARequestFactory._()
		.createInitSignDocumentAtBrowser(
				functionalProcedureId, locale, 
				issuerName, 
				serialNumber, 
				documents, 
				showVisibleSignature, 
				visibleSignatureData, 
				psisValidation, 
				redirectURL, 
				showLinks, 
				addUUID, 
				finalMsg, 
				showResume);

		SignatureServiceStub signatureServiceStub = PsaServices.getInstance().getSignatureServiceStub();
		InitSignDocumentAtBrowserResponseDocument responseDocument = signatureServiceStub.initSignDocumentAtBrowser(request);

		SignDocumentAtBrowserRSPNS response = responseDocument.getInitSignDocumentAtBrowserResponse().getSignDocumentAtBrowserRSPNS();
		
		// print response
		printResponse(response);
		
		// return response (util for continueSignDocumentAtBrowser)
		return response;

	}
	public static void main(String[] args){

		try{

			signDocumentAtBrowser();

		} catch (Throwable e) {
			e.printStackTrace();
		}

	}	

	/**
	 * Print the response
	 * @param response
	 */
	public static void printResponse(SignDocumentAtBrowserRSPNS response){

		//resultat de l'operació sol·licitada
		System.out.println("Result:");
		Result result = response.getResult();
		String major = result.getResultMajor();
		String minor = result.getResultMinor();
		InternationalStringType resultMessage = result.getResultMessage();
		System.out.println("Major: "+major);
		System.out.println("Minor: "+minor);
		if(resultMessage!=null)
			System.out.println("Message: "+resultMessage.getStringValue());

		//identificador del context de signatura iniciat, necessari per les següents peticions associades al mateix context
		String procedureContextOid = response.getProcedureContextOID();
		System.out.println("Procedure Context ID: "+procedureContextOid);

		//identificador del context de signatura
		String signatureActOid = response.getSignatureActOID();
		System.out.println("Signature Act ID: "+signatureActOid);

		//URL d'accés al frontal per a la realització de la signatura
		String accessUrl = response.getAccessUrl();
		System.out.println("URL: "+accessUrl);
	}

}
