package com.fp.armas.rules.query.webservices;


import java.util.List;

import javax.persistence.Query;

import com.fp.armas.rules.query.webservices.util.CatalogoUtil;
import com.fp.armas.rules.query.webservices.util.PersonaUtil;
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.parmas.dto.ws.JefeCentroControlDto;
import com.fp.persistence.parmas.param.TarmCentroControl;
import com.fp.persistence.parmas.soli.TarmDocumentoHabilitante;
import com.fp.persistence.parmas.soli.TarmSolicitud;
import com.fp.persistence.parmas.soli.TarmSolicitudDocumento;
import com.fp.persistence.pcustomer.gene.TcustPersonDetail;
import com.fp.persistence.pcustomer.gene.TcustPersonDetailKey;

public class JefeCentroImpresion extends QueryRule {

	private static final long serialVersionUID = 8341638596202085693L;
	private static final String QUERY_DOCUMENTO_NUM = "SELECT o FROM TarmDocumentoHabilitante o WHERE o.numerodocumento=:numerodocumento";
	private static final String QUERY_SOLICITUD_DOCUMENTO_NUM = "SELECT sd.csolicitud FROM tarmsolicituddocumento sd WHERE sd.cdocumento=:cDocumento and "
			+ " sd.csolicitud = (SELECT max(sd2.csolicitud) FROM tarmsolicituddocumento sd2 inner join tarmsolicitud sol on sol.csolicitud = sd2.csolicitud "
			+ " WHERE sd2.cdocumento=:cDocumento and sol.estado!='ANU')";
	/**
	 * Busca el jefe del centro de control de la solicitud asociada al documento expedido
	 */
	@SuppressWarnings("unchecked")
	@Override
	public QueryRequest process(QueryRequest pRequest) throws Exception {
		try {
			JefeCentroControlDto jefeCentroControl = null;
			String numerodocumento = (String) pRequest.get("NUMERODOCUMENTO");
			Query query = PersistenceHelper.getEntityManager().createQuery(QUERY_DOCUMENTO_NUM);
			query.setParameter("numerodocumento", numerodocumento);
			List<TarmDocumentoHabilitante> ltarmDocumentoHabilitantes = query.getResultList();
			if(ltarmDocumentoHabilitantes != null && !ltarmDocumentoHabilitantes.isEmpty()){
				TarmDocumentoHabilitante documentoHabilitante = ltarmDocumentoHabilitantes.iterator().next();
				TarmSolicitud solicitud = null;
				if(documentoHabilitante.getCsolicitud() != null){
					solicitud = TarmSolicitud.find(PersistenceHelper.getEntityManager(), documentoHabilitante.getCsolicitud());
				}else{
					Query querySolicitud = PersistenceHelper.getEntityManager().createNativeQuery(QUERY_SOLICITUD_DOCUMENTO_NUM);
					querySolicitud.setParameter("cDocumento", documentoHabilitante.getPk());
					String codigoSolicitud = querySolicitud.getSingleResult().toString();
					if(codigoSolicitud!=null){
						solicitud = TarmSolicitud.find(PersistenceHelper.getEntityManager(),codigoSolicitud);
					}
				}				
				if(solicitud != null && solicitud.getCcentrocontrol() != null){
					TarmCentroControl tarmCentroControl = TarmCentroControl.find(PersistenceHelper.getEntityManager(), solicitud.getCcentrocontrol());
					TcustPersonDetail tcustPersonDetail = TcustPersonDetail.find(PersistenceHelper.getEntityManager(), new TcustPersonDetailKey(tarmCentroControl.getPersoncode(), FormatDates.getDefaultExpiryTimestamp()));
					jefeCentroControl = new JefeCentroControlDto();
					jefeCentroControl.setNombre(tcustPersonDetail.getName());
					jefeCentroControl.setFirma(tcustPersonDetail.getSign());
					jefeCentroControl.setUbicacion(PersonaUtil.getInstancia().obtenerLocacionPersona(tcustPersonDetail.getPk().getPersoncode()));
					jefeCentroControl.setRangoJefe(CatalogoUtil.getInstancia().getDescripcion(tarmCentroControl.getGrado(), tarmCentroControl.getGradocodigo()));
					pRequest.getResponse().put("JEFECENTRO", jefeCentroControl);
				}				
			}
		} catch (Throwable e) {
			throw new Exception(e);
		}
		return pRequest;
	}

}
