package com.fp.firmas.rules.save;

import java.io.ByteArrayInputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.List;

import com.fp.dto.rules.TransactionRule;
import com.fp.dto.save.SaveRequest;
import com.fp.firmas.rules.common.resources.FirmMessages;
import com.fp.persistence.commondb.PersistenceHelper;
import com.fp.persistence.commondb.exception.CommondbException;
import com.fp.persistence.pfirmas.param.TfirmCertificado;
import com.fp.persistence.pgeneral.gene.TgeneParameters;
import com.fp.persistence.pgeneral.gene.TgeneParametersKey;

/**
 * Clase que completa la informaci&oacute;n acerca de los certificados dentro del repositorio de certificados
 * 
 * @author dcruz
 *
 */
public class CertificadoFirma extends TransactionRule{

	private static final long serialVersionUID = 1L;

	@Override
	public SaveRequest normalProcess(SaveRequest pSaveRequest) throws Exception {
		
		List<Object> firmCertificados = pSaveRequest.getSaveBeanModifiedRecords("USUARIOCERTIFICADOS");
		String path = (String)pSaveRequest.get("path");
		for (Object object : firmCertificados) {
			if(object instanceof TfirmCertificado){
				TfirmCertificado certificado = (TfirmCertificado)object;
				guardarCertficadoRepositorio(certificado, path);
			}
		}
		return pSaveRequest;
	}

	@Override
	public SaveRequest reverseProcess(SaveRequest pSaveRequest)
			throws Exception {
		return pSaveRequest;
	}
	
	private void guardarCertficadoRepositorio(TfirmCertificado certificado, String pathCertificado) throws CommondbException, Exception{
//		String path = getPath(certificado);//obtiene la ruta a grabar el certificado
//		String path = FirmMessages.getString("dir.ruta.base.repositorio") + "/" + certificado.getPk().getIdcertificado();//cambiar por el parametro en la base
		String path = pathCertificado + "/" + certificado.getPk().getIdcertificado();
		if(!Files.exists(Paths.get(path))){
			Files.createFile(Paths.get(path));
			Files.copy(new ByteArrayInputStream((byte[])certificado.modifiedData.get("valor_certificado_bin")), Paths.get(path));
		}else{
			Files.copy(new ByteArrayInputStream((byte[])certificado.modifiedData.get("valor_certificado_bin")), Paths.get(path), StandardCopyOption.REPLACE_EXISTING);
		}
		
	}
	
	private String getPath(TfirmCertificado certificado) throws CommondbException, Exception {
		TgeneParametersKey tgeneParametersKey = new TgeneParametersKey("PATH_CERTIFICADO_BCE", 1);
        TgeneParameters tgeneParameters = TgeneParameters.find(PersistenceHelper.getEntityManager(), tgeneParametersKey);
        String path = tgeneParameters.getTextvalue() + "/" + certificado.getPk().getIdcertificado();
		return path;
	}

}
