package com.izenpe.zain.cliente.xades.multiples;

import org.apache.axis.encoding.Base64;

import com.izenpe.zain.client.ZainConfig;
import com.izenpe.zain.cliente.util.Constantes;
import com.izenpe.zain.cliente.util.Propiedades;
import com.izenpe.zain.cliente.util.ZainUtil;
import com.safelayer.trustedx.client.smartwrapper.Constants;
import com.safelayer.trustedx.client.smartwrapper.SmartSignRequest;
import com.safelayer.trustedx.client.smartwrapper.SmartSignResponse;

public class GeneracionFirmaXMLEnvelopedBESSerie {
	// Nombre del fichero a utilizar para la generación de la firma XADES-BES
	// Enveloped.
	private static final String fileName = "DemoSignedEnveloped.xml";

	public static void main(String[] args) {
		try {
			ZainConfig.setCurrent(Propiedades.ZAIN_CONFIG);
			
			/*
			 * Se crea la petición a través de la URL definida en ZAIN_ENDPOINT.
			 */
			SmartSignRequest smartSignReq = new SmartSignRequest(Propiedades.ZAIN_ENDPOINT);
			
			smartSignReq.setSignaturePlacement(Constants.SignaturePlacement.ENVELOPED);
			
			/*
			 * El atributo CounterSignatureXPath indica la ruta relativa, respecto al documento, en el que se
			 * encuentre la firma que tenga que firmarse en serie . Si dicho atributo no está presente, 
			 * se firmará la primera firma que contenga el elemento del documento, el atributo sólo 
			 * puede estar ausente cuando documento sólo contenga una firma).
			 */
			smartSignReq.setXmlCounterSignatureXPath("//dsig:Signature[not(child::*//xades:CounterSignature)]");

			// Se establece el perfil de firma XML (XADES) en la petición de
			// Generación de firma.
			smartSignReq.setProfile(Constants.Profile.XADES);
			
			// Se solicita que la firma sea de tipo XAdES-BES.
			smartSignReq.setSignatureFormat(Constants.SignatureFormat.BES);

			/*
			 * Se establece el idioma de la petición en español. 2
			 * posibilidades: 1. Español: 'es' 2. Inglés: 'en'
			 */
			smartSignReq.setLanguage("es");

			// Certificado con el que realizar la firma.
			smartSignReq.setKeySubjectName(Propiedades.ZAIN_SIGNER);

			smartSignReq.setXmlCounterSignature(true);

			/*
			 * True para obtener la firma en base64 (y evitar problemas con Axis
			 * al serializar y deserializar firmas XML).
			 */
			smartSignReq.setXmlReturnBase64(true);

			// Datos a firmar.
			smartSignReq.setInputXmlBase64(Base64.encode(ZainUtil.readBinaryFile("data/output/"
					+ fileName)));

			// Envío de la petición.
			SmartSignResponse smartSignResp = smartSignReq.send();

			/*
			 * Se comprueba la validez de la respuesta y se escribe la respuesta
			 * de Generación de firma XML en un fichero en disco.
			 */
			if (Constantes.RMAJOR_SUCCESS.equals((smartSignResp.getResultMajor()))
					&& smartSignResp.getResultMinor() == null) {
				String signXMLBase64 = smartSignResp.getDocumentWithSignatureXmlBase64();
				byte[] data = Base64.decode(signXMLBase64);
				String destFilename = "data/output/" + fileName.substring(0, fileName.lastIndexOf("."))
						+ "SignedEnveloped-Serie.xml";
				ZainUtil.writeBinaryFile(destFilename, data);
				System.out.println("La firma se ha realizado con éxito.");
			} else {
				System.out.println("Error en la Generación de Firma:" + smartSignResp.getResultMessage());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}