package com.fp.viaticos.rules.consulta.solicitud;

import java.math.BigDecimal;
import java.util.Calendar;
import java.util.List;

import com.fp.bpm.query.QueryJsf;
import com.fp.dto.Response;
import com.fp.dto.query.QueryRequest;
import com.fp.dto.rules.QueryRule;
import com.fp.persistence.commondb.PersistenceHelper;
import com.fp.persistence.pviaticos.hra.Empleado;
import com.fp.persistence.pviaticos.hra.EmpleadoJpql;
import com.fp.persistence.pviaticos.param.ViaDiasAcumulados;
import com.fp.persistence.pviaticos.param.ViaDiasAcumuladosKey;
import com.fp.persistence.pviaticos.solicitud.ViaSolicitud;
import com.fp.persistence.pviaticos.solicitud.ViaSolicitudIntegrantes;
import com.fp.viaticos.rules.query.destino.DestinoQuery;

public class ConsultaSolicitud extends QueryRule{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Override
	public QueryRequest process(QueryRequest pQrequest) throws Exception {
		Response response = pQrequest.getResponse();
		QueryJsf query = new QueryJsf();
        query.execute(pQrequest);
        Object solicitud = (Object) response.get("SOLICITUD");
        List<Object> integrantes = (List<Object>)response.get("SOLICITUDINTEGRANTES"); 
        this.completeInfoSolicitud(solicitud);
        this.completeInfoIntegrantes(integrantes);
		return pQrequest;
	}
	
	/**
	 * Completa los datos de la solicitud
	 * @param object Objeto ViaSolicitud
	 * @throws Exception
	 */
	public void completeInfoSolicitud(Object object) throws Exception{
		if(object==null){
			return;
		}
		ViaSolicitud solicitud = (ViaSolicitud)object;
		Empleado emp = null;
		EmpleadoJpql e = new EmpleadoJpql();
		DestinoQuery qry = new DestinoQuery();
		
		//Funcionario ingresa
		emp = e.findPorUsuarioWeb(solicitud.getCod_usuario().toLowerCase());
		if(emp!=null){
			solicitud.modifiedData.put("cod_ingreso", emp.getCodigo());
			solicitud.modifiedData.put("nom_ingreso", emp.getNombre());
		}
		//jefe
		if(solicitud.getCod_jefe()!=null){
			emp = e.find(solicitud.getCod_jefe());
			if(emp!=null){
				solicitud.modifiedData.put("nombrejefe", emp.getNombre());
				solicitud.modifiedData.put("cargojefe", emp.getNombreCargo());
			}
		}
		//Responsable
		if(solicitud.getCod_responsable()!=null){
			emp = e.find(solicitud.getCod_responsable());
			if(emp!=null){
				solicitud.modifiedData.put("nombreresponsable", emp.getNombre());
				solicitud.modifiedData.put("cargoresponsable", emp.getNombreCargo());
			}
		}
		//Destino
		Object obj = qry.find(solicitud.getCod_destino());
		if(obj!=null){
			Object[] destino = (Object[])obj;
			solicitud.modifiedData.put("destinoname", destino[1]);
		}
		//Dias acumulados por destino
		Calendar calendar = Calendar.getInstance();
        calendar.setTime(solicitud.getFec_creacion());
		BigDecimal dias = this.diasPorDestino(solicitud.getCod_empleado(), solicitud.getCod_destino(),calendar.get(Calendar.YEAR));
		solicitud.modifiedData.put("comisionciudad", solicitud.getNum_dias().add(dias));
	}
	
	/**
	 * Completa la informacion de los integrantes
	 * @param objeto
	 */
	public void completeInfoIntegrantes(List<Object> objetos)throws Exception{
		if(objetos==null || objetos.isEmpty()){
			return;
		}
		for(Object obj:objetos){
			ViaSolicitudIntegrantes integrante = (ViaSolicitudIntegrantes)obj;
			EmpleadoJpql e = new EmpleadoJpql();
			Empleado emp = e.find(integrante.getPk().getCod_empleado());
			if(emp!=null){
				integrante.modifiedData.put("empleado", emp.getNombre());
			}
		}
		
	}
	
	/**
	 * Entrega los dias acumulados por ciudad
	 * @param codEmpleado
	 * @param codDestino
	 * @param periodo
	 * @return
	 * @throws Exception
	 */
	private BigDecimal diasPorDestino(String codEmpleado, String codDestino, Integer periodo)throws Exception{
		BigDecimal valor = new BigDecimal("0.0");
		ViaDiasAcumuladosKey key = new ViaDiasAcumuladosKey();
		key.setCod_empleado(codEmpleado);
		key.setCod_destino(codDestino);
		key.setCod_ejercicio(periodo);
		ViaDiasAcumulados acumulados = ViaDiasAcumulados.find(PersistenceHelper.getEntityManager(), key);
		if(acumulados!=null){
			valor.add(acumulados.getNum_dias());
		}
		return valor;
	}
}
