package com.fp.viaticos.rules.query.informe;

import java.util.ArrayList;
import java.util.List;

import com.fp.bpm.query.QueryJsf;
import com.fp.dto.Response;
import com.fp.dto.query.DtoQuery;
import com.fp.dto.query.Filter;
import com.fp.dto.query.QueryRequest;
import com.fp.dto.rules.QueryRule;
import com.fp.persistence.commondb.PersistenceHelper;
import com.fp.persistence.commondb.helper.FormatDates;
import com.fp.persistence.pviaticos.solicitud.ViaSolicitud;
import com.fp.persistence.pviaticos.solicitud.ViaSolicitudIntegrantes;
import com.fp.persistence.pviaticos.solicitud.ViaSolicitudKey;
import com.fp.persistence.pviaticos.solicitud.ViaSolicitudTransporte;
import com.fp.viaticos.rules.consulta.solicitud.ConsultaSolicitud;
import com.fp.viaticos.rules.enums.EnumCodigos;

public class Informe extends QueryRule{

	/**
	 * Clase que clona los objetos de la solicitud para el informe
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * Metodo sobreescrito para gestionar la respuesta de la consulta
	 */
	@SuppressWarnings("unchecked")
	@Override
    public QueryRequest process(QueryRequest pQueryRequest) throws Exception {
    
		String codSolicitud = (String)pQueryRequest.get("csolicitud");
		
		ViaSolicitud informe = ViaSolicitud.find(PersistenceHelper.getEntityManager(), new ViaSolicitudKey(codSolicitud, EnumCodigos.INFORME.getCodigo()));
		if(informe!=null){
			return pQueryRequest;
		}
		
		this.fijaFiltrosSolicitud(pQueryRequest);
		
		Response response = pQueryRequest.getResponse();
		QueryJsf query = new QueryJsf();
		query.execute(pQueryRequest);
		
		Object object=response.get("SOLICITUD");
		List<Object> objectIntegrantes=(List<Object>)response.get("SOLICITUDINTEGRANTES");
		List<Object> objectTransporte=(List<Object>)response.get("SOLICITUDTRANSPORTE");
		
		if(object == null){
			return pQueryRequest;
		}
		
		ViaSolicitud solicitud = (ViaSolicitud) object; 
		solicitud = (ViaSolicitud)solicitud.cloneMe();		
		solicitud.setIsnew(true);
		ConsultaSolicitud data = new ConsultaSolicitud();
		solicitud.setFec_creacion(FormatDates.getInstance().getDataBaseDate());
		data.completeInfoSolicitud(solicitud);
		
		response.put("SOLICITUD", solicitud);
		response.put("SOLICITUDINTEGRANTES", this.cloneIntegrantes(objectIntegrantes));
		response.put("SOLICITUDTRANSPORTE",  this.cloneTransporte(objectTransporte));
		response.put("CLONE", "Y");
		
        return pQueryRequest;
    }
	/**
	 * M&eacute;todo para cambio de filtros
	 */
	public void fijaFiltrosSolicitud(QueryRequest pQueryRequest) throws Exception{
		
		DtoQuery dtoQuery = (DtoQuery)pQueryRequest.getQueryTables().get("SOLICITUD");
		DtoQuery dtoQueryInt = (DtoQuery)pQueryRequest.getQueryTables().get("SOLICITUDINTEGRANTES");
		DtoQuery dtoQueryTra = (DtoQuery)pQueryRequest.getQueryTables().get("SOLICITUDTRANSPORTE");
		
		List<Filter> filtros = dtoQuery.getLfilter();
		List<Filter> filtrosInt = dtoQueryInt.getLfilter();
		List<Filter> filtrosTra = dtoQueryTra.getLfilter();
		
		for(Filter filtro: filtros){
			if(filtro.getField().equals("pk.cod_tipo")){
				filtro.setValue(EnumCodigos.SOLICITUD.getCodigo());
				break;
			}
		}
		for(Filter filtro: filtrosInt){
			if(filtro.getField().equals("pk.cod_tipo")){
				filtro.setValue(EnumCodigos.SOLICITUD.getCodigo());
				break;
			}
		}
		for(Filter filtro: filtrosTra){
			if(filtro.getField().equals("pk.cod_tipo")){
				filtro.setValue(EnumCodigos.SOLICITUD.getCodigo());
				break;
			}
		}
	}
	/**
	 * Método para clonar la lista de objetos ViaSolicitudIntegrantes
	 * @param object
	 */
	private List<ViaSolicitudIntegrantes> cloneIntegrantes(List<Object> objects) throws Exception {
		List<ViaSolicitudIntegrantes> listIntegrantes = new ArrayList<ViaSolicitudIntegrantes>();
		ViaSolicitudIntegrantes integrante;
		
		for(Object objeto:objects)
		{
			integrante = (ViaSolicitudIntegrantes)objeto;
			ViaSolicitudIntegrantes inte = (ViaSolicitudIntegrantes)integrante.cloneMe();
			listIntegrantes.add(inte);
		}
		ConsultaSolicitud data = new ConsultaSolicitud();
		data.completeInfoIntegrantes(objects);
		return listIntegrantes;
	}
	
	/**
	 * Método para clonar la lista de objetos ViaSolicitudTransporte
	 * @param object
	 */
	private List<ViaSolicitudTransporte>  cloneTransporte(List<Object> objects) throws Exception {
		List<ViaSolicitudTransporte> listTransporte = new ArrayList<ViaSolicitudTransporte>();
		ViaSolicitudTransporte transporte;
		
		for(Object objeto:objects)
		{
			transporte = (ViaSolicitudTransporte)objeto;
			ViaSolicitudTransporte trans = (ViaSolicitudTransporte)transporte.cloneMe();
			trans.getPk().setCod_secuencia(null);
			listTransporte.add(trans);
		}		
		return listTransporte;
	}

}
