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.ContinueSignDocumentAtBrowserDocument;
import com.sadiel.catcert.psa.ws.signature.ContinueSignDocumentAtBrowserResponseDocument;
import com.sadiel.www.pdf.visiblesignature.v0_1.VisibleSignatureDataType;

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


/**
 * Invokes Continue Sign Document at Browser in psa signature service
 * @author suport tècnic CATCert
 *
 */
public class ContinueSignDocumentAtBrowserSample {


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

			/** Continue Sign Document at Browser **/

			//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
			//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;
			
			// per a continuar amb el procediment primer aquest s'ha d'iniciar
			SignDocumentAtBrowserSample init = new SignDocumentAtBrowserSample();
			SignDocumentAtBrowserRSPNS responseInit = init.signDocumentAtBrowser();
			// identificador de procediment (obtingut en la petició d'inicialització)
			String procedureContextOID = responseInit.getProcedureContextOID();
			
			//petició
			ContinueSignDocumentAtBrowserDocument request = PSARequestFactory._().createContinueSignDocumentAtBrowser(
					procedureContextOID, 
					locale, 
					issuerName, 
					serialNumber, 
					showVisibleSignature, 
					visibleSignatureData, 
					psisValidation, 
					redirectURL, 
					showLinks, 
					addUUID, 
					finalMsg, 
					showResume);
			

			SignatureServiceStub signatureServiceStub = PsaServices.getInstance().getSignatureServiceStub();

			ContinueSignDocumentAtBrowserResponseDocument responseDocument = signatureServiceStub.continueSignDocumentAtBrowser(request);

			ContinueSignDocumentAtBrowserRSPNS response = responseDocument.getContinueSignDocumentAtBrowserResponse().getContinueSignDocumentAtBrowserRSPNS();
			//resultat de l'operació sol·licitada
			System.out.println("Result:");
			Result result = response.getResult();
			String major = result.getResultMajor();
			String minor = result.getResultMinor();
			InternationalStringType message = result.getResultMessage();
			System.out.println("Major: "+major);
			System.out.println("Minor: "+minor);
			if(message!=null)
				System.out.println("Message: "+message.getStringValue());
			
			//identificador del context de signatura
			String signatureActOid2 = response.getSignatureActOID();
			System.out.println("Signature Act ID: "+signatureActOid2);
			
			//URL d'accés al frontal per a la realització de la signatura
			String accessUrl2 = response.getAccessUrl();
			System.out.println("URL: "+accessUrl2);
			
			
		} catch (Throwable e) {
				e.printStackTrace();
		}
		
	}	
	
}
