package com.fp.armas.rules.save.solicitud;

import java.util.List;

import org.apache.commons.lang.StringUtils;

import com.fp.dto.rules.TransactionRule;
import com.fp.dto.save.SaveRequest;
import com.fp.persistence.parmas.inte.TarmColadeImpresion;
import com.fp.persistence.parmas.soli.TarmDocumentoHabilitante;
import com.fp.persistence.parmas.soli.TarmDocumentoHabilitanteDetall;
import com.fp.sessionbeans.helper.Sequence;

/**
 * Clase transaction rule para registrar el documento habilitante
 * @author Carlos Guzman
 *
 */
public class DocumentoHabilitanteTransaccion extends TransactionRule {

	/**
	 * 
	 */
	private static final long serialVersionUID = -1840770563013500407L;

	@Override
	public SaveRequest normalProcess(SaveRequest pSaveRequest) throws Exception {

		TarmDocumentoHabilitante documentoHabilitante=(TarmDocumentoHabilitante) pSaveRequest.getSaveBeanModifiedObject("DOCUMENTOHABILITANTE");
		if(documentoHabilitante==null){
			return pSaveRequest;
		}
		
		TarmColadeImpresion colaImpresion=(TarmColadeImpresion)pSaveRequest.getSaveBeanModifiedObject("BODEGA");

		
		Long codigoGenerado = Long.parseLong(getCodigo("TARMDOCUMENTOHABILITANTE"));

		documentoHabilitante.setPk(codigoGenerado);
		documentoHabilitante.setNumerodocumento(getNumeroTransaccion("DOC",codigoGenerado.toString()));
		
		if(colaImpresion!=null){
			colaImpresion.setPk(getCodigo("TARMCOLADEIMPRESION"));
			colaImpresion.setCdocumento(codigoGenerado);			
		}
		
		TarmDocumentoHabilitanteDetall documentohabilitanteDetall=(TarmDocumentoHabilitanteDetall)pSaveRequest.getSaveBeanModifiedObject("DOCUMENTOHABILITANTEDETAIL");
		List<Object> lDocumentohabilitanteDetall = null;
		if(documentohabilitanteDetall==null){
			lDocumentohabilitanteDetall = (List<Object>)pSaveRequest.getSaveBeanModifiedRecords("DOCUMENTOHABILITANTEDETAIL");		
		}
		if(documentohabilitanteDetall!=null || (documentohabilitanteDetall==null && lDocumentohabilitanteDetall!=null)){		
			//lDocumentohabilitanteDetall = (List<Object>)pSaveRequest.getSaveBeanModifiedRecords("DOCUMENTOHABILITANTEDETAIL");
			if(documentohabilitanteDetall!=null && (lDocumentohabilitanteDetall == null ||lDocumentohabilitanteDetall.size()==0)){
				documentohabilitanteDetall.setPk(getCodigo("CODIGODETALLE"));
				documentohabilitanteDetall.setCdocumento(codigoGenerado);
			}
			else{
				if(lDocumentohabilitanteDetall!=null &&   lDocumentohabilitanteDetall.isEmpty() && documentohabilitanteDetall!=null){
					lDocumentohabilitanteDetall.add(documentohabilitanteDetall);
				}
				if(lDocumentohabilitanteDetall!=null &&   !lDocumentohabilitanteDetall.isEmpty()){

				for (Object object : lDocumentohabilitanteDetall) {
					TarmDocumentoHabilitanteDetall c=(TarmDocumentoHabilitanteDetall)object;
					c.setPk(getCodigo("CODIGODETALLE"));
					c.setCdocumento(codigoGenerado);
				}
				}

			}
		}


		return pSaveRequest;
	}
	

	@Override
	public SaveRequest reverseProcess(SaveRequest arg0) throws Exception {
		// TODO Auto-generated method stub
		return null;
	}
	
    /**
     * Metodo para obtener el numero de secuencia de la base de datos
     * @param codigoSec nombre del campo de la secuencia
     * @return la secuencia generada
     * @throws Exception
     */
	private String getCodigo(String codigoSec) throws Exception {
        Sequence sequence = new Sequence();
        Integer documento = Integer.valueOf(sequence.getNextValue(codigoSec).toString());
        return documento.toString();
    }
    
    /**
     * Metodo que arma el numero de la transaccion
     * @param prefijo prefijo a usarse pata el numero a generarse
     * @param secuencia numero de secuencia
     * @return el numero de documento generado
     */ 
	private String getNumeroTransaccion(String prefijo,String secuencia){
		return prefijo+"-"+StringUtils.leftPad(secuencia, 9, '0');
    }
		

}
