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

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

import javax.persistence.Query;

import com.fp.armas.rules.query.webservices.util.InstitucionSnapEnum;
import com.fp.common.logger.APPLogger;
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.DatosSnapDto;
import com.fp.persistence.parmas.dto.ws.InfoGuardiaDto;
import com.fp.persistence.parmas.dto.ws.TramiteDto;
import com.fp.persistence.parmas.dto.ws.DatosArmaDto;
import com.fp.persistence.parmas.eval.TarmEvaluacion;
import com.fp.persistence.parmas.soli.TarmArmaPruebas;
import com.fp.persistence.parmas.soli.TarmArmas;
import com.fp.persistence.parmas.soli.TarmDocumentoHabilitante;
import com.fp.persistence.parmas.soli.TarmGuardias;
import com.fp.persistence.pcustomer.gene.TcustPersonAddress;
import com.fp.persistence.pcustomer.gene.TcustPersonDetail;
import com.fp.persistence.pcustomer.gene.TcustPersonPhone;
import com.fp.persistence.pgeneral.gene.TgeneCatalogDetail;
import com.fp.persistence.pgeneral.gene.TgeneParameters;

/**
 * Componente que realiza la b&uacute;squedas de los datos de necesarios para el WS de la SNAP
 * @author Manuel Cepeda 
 *
 */
public class DatosPerson extends QueryRule{

	private static final long serialVersionUID = -3993166768741911053L;

	/**
	 * Permite obtener todos los datos necesarios para el WS de SNAP
	 * @param QueryRequest pRequest
	 * @return QueryRequest
	 */
	@SuppressWarnings("unchecked")
	@Override
	public QueryRequest process(QueryRequest pRequest) throws Exception {
		Query query;

		try {
			DatosSnapDto personaSnapDto = new DatosSnapDto();

			query = PersistenceHelper.getEntityManager().createQuery("select p from TgeneParameters p where pk.code= :code and pk.companycode=:companycode");
			query.setParameter("code", "PATH.ALFRESCO.ARCHIVOS");
			query.setParameter("companycode", 1);
			List<TgeneParameters> lparametros = query.getResultList();			
			if(lparametros != null && !lparametros.isEmpty()){
				personaSnapDto.setxPathLocation(lparametros.get(0).getTextvalue());
			}
			
			String identificacion = (String) pRequest.get("identificacion");	
			String institucion = (String) pRequest.get("institucion");
			String serie = (String) pRequest.get("serie");
			query = PersistenceHelper.getEntityManager().createQuery("select pd from TcustPersonDetail pd where pd.identification= :identification and pd.pk.dateto=:dateto order by DATETO DESC");
			query.setParameter("identification", identificacion);
			query.setParameter("dateto", FormatDates.getDefaultExpiryTimestamp());
			List<TcustPersonDetail> ltsafeUserDetails = query.getResultList();			
			if(ltsafeUserDetails != null && !ltsafeUserDetails.isEmpty()){
				personaSnapDto.setCodigoPersona(ltsafeUserDetails.get(0).getPk().getPersoncode());
				personaSnapDto.setRazonSocial(ltsafeUserDetails.get(0).getName());
			}
				
			//direccion principal
			query=PersistenceHelper.getEntityManager().createQuery("select pa from TcustPersonAddress pa where pa.pk.personcode=:personcode and pa.pk.dateto=:dateto and pa.principal='Y'");
			query.setParameter("personcode", ltsafeUserDetails.get(0).getPk().getPersoncode());
			query.setParameter("dateto", FormatDates.getDefaultExpiryTimestamp());
			List<TcustPersonAddress> lcustPersonAddress = query.getResultList();
			if(lcustPersonAddress != null && !lcustPersonAddress.isEmpty()){
				personaSnapDto.setDireccion(lcustPersonAddress.get(0).getAddress());
			}
						
			//email
			query=PersistenceHelper.getEntityManager().createQuery("select pa from TcustPersonAddress pa where pa.pk.personcode=:personcode and pa.pk.dateto=:dateto and pa.addresstypecatalog=3");
			query.setParameter("personcode", ltsafeUserDetails.get(0).getPk().getPersoncode());
			query.setParameter("dateto", FormatDates.getDefaultExpiryTimestamp());
			List<TcustPersonAddress> lcustPersonEmail = query.getResultList();
			if(lcustPersonEmail != null && !lcustPersonEmail.isEmpty()){
				personaSnapDto.setEmail(lcustPersonEmail.get(0).getAddress());
			}
						
			//telefono
			query=PersistenceHelper.getEntityManager().createQuery("select pp from TcustPersonPhone pp where pp.pk.personcode=:personcode and pp.pk.dateto=:dateto and pp.phonetypecatalog=1");
			query.setParameter("personcode", ltsafeUserDetails.get(0).getPk().getPersoncode());
			query.setParameter("dateto", FormatDates.getDefaultExpiryTimestamp());
			List<TcustPersonPhone> lcustPersonTelefono = query.getResultList();
			if(lcustPersonTelefono != null && !lcustPersonTelefono.isEmpty()){
				personaSnapDto.setTelefonoFijo(lcustPersonTelefono.get(0).getPhonenumber());
			}
						
			//celular
			query=PersistenceHelper.getEntityManager().createQuery("select pp from TcustPersonPhone pp where pp.pk.personcode=:personcode and pp.pk.dateto=:dateto and pp.phonetypecatalog=2");
			query.setParameter("personcode", ltsafeUserDetails.get(0).getPk().getPersoncode());
			query.setParameter("dateto", FormatDates.getDefaultExpiryTimestamp());
			List<TcustPersonPhone> lcustPersonCelular = query.getResultList();
			if(lcustPersonCelular != null && !lcustPersonCelular.isEmpty()){
				personaSnapDto.setTelefonoCelular(lcustPersonCelular.get(0).getPhonenumber());
			}
			
			//test psocilogico
			query=PersistenceHelper.getEntityManager().createQuery("select te from TarmEvaluacion te where te.personcode=:personcode and te.tipoevaluacion = 'PSICOLOGICA' order by te.fechaexpiracion desc");
			query.setParameter("personcode", ltsafeUserDetails.get(0).getPk().getPersoncode());
			List<TarmEvaluacion> listaEvaluacion = query.getResultList();
			if(listaEvaluacion != null && !listaEvaluacion.isEmpty() && institucion.equals(InstitucionSnapEnum.COPS.getNombre())){
				personaSnapDto.setTestPsicologico(listaEvaluacion.get(0).getInformexpath());
			}
			
			//tramites
			List<TarmDocumentoHabilitante> listaTramitesHabilitantes = new ArrayList<>();
			query=PersistenceHelper.getEntityManager().createQuery("select dh from TarmDocumentoHabilitante dh where dh.pk.personcode=:personcode and dh.ctramite in(73, 179) order by dh.fechaexpiracion desc");
			query.setParameter("personcode", ltsafeUserDetails.get(0).getPk().getPersoncode());
			List<TarmDocumentoHabilitante> listaTramiteCM = query.getResultList();
			if(listaTramiteCM != null && !listaTramiteCM.isEmpty()){
				listaTramitesHabilitantes.add(listaTramiteCM.get(0));
			}
			
			query=PersistenceHelper.getEntityManager().createQuery("select dh from TarmDocumentoHabilitante dh where dh.pk.personcode=:personcode and dh.ctramite in(74, 180) order by dh.fechaexpiracion desc");
			query.setParameter("personcode", ltsafeUserDetails.get(0).getPk().getPersoncode());
			List<TarmDocumentoHabilitante> listaTramiteMA = query.getResultList();
			if(listaTramiteMA != null && !listaTramiteMA.isEmpty()){
				listaTramitesHabilitantes.add(listaTramiteMA.get(0));
			}
			
			query=PersistenceHelper.getEntityManager().createQuery("select dh from TarmDocumentoHabilitante dh where dh.pk.personcode=:personcode and dh.ctramite in(76, 182) order by dh.fechaexpiracion desc");
			query.setParameter("personcode", ltsafeUserDetails.get(0).getPk().getPersoncode());
			List<TarmDocumentoHabilitante> listaTramiteSP = query.getResultList();
			if(listaTramiteSP != null && !listaTramiteSP.isEmpty()){
				listaTramitesHabilitantes.add(listaTramiteSP.get(0));
			}
			
			List<TramiteDto> listaTramites = new ArrayList<>();
			if(listaTramitesHabilitantes != null && !listaTramitesHabilitantes.isEmpty()){
				for(TarmDocumentoHabilitante tramitesHabilitantes: listaTramitesHabilitantes){
					TramiteDto tramiteDto = new TramiteDto();
					tramiteDto.setTramite(tramitesHabilitantes.getCtramite().toString());
					tramiteDto.setFechaEmision(tramitesHabilitantes.getFechaemision());
					tramiteDto.setFechaExpiracion(tramitesHabilitantes.getFechaexpiracion());
					
					//informacion del tramite
					query=PersistenceHelper.getEntityManager().createQuery("select CONCAT(tt.description, ' - ', ta.description, ' - ', ca.description, ' - ', ua.description) from TarmTramite t,"
							+ " TgeneCatalogDetail tt, TgeneCatalogDetail ta, TgeneCatalogDetail ca, TgeneCatalogDetail ua "
							+ " where tt.pk.catalog = t.tipotramite and tt.pk.catalogcode = t.tipotramitecodigo"
							+ " and ta.pk.catalog = t.tipoautorizacion and ta.pk.catalogcode = t.tipoautorizacioncodigo"
							+ " and ca.pk.catalog = t.categoria and ca.pk.catalogcode = t.categoriacodigo"
							+ " and ua.pk.catalog = t.usoactividad and ua.pk.catalogcode = t.usoactividadcodigo"
							+ " and t.pk = :ctramite");
					query.setParameter("ctramite", tramitesHabilitantes.getCtramite());
					
					List<String> tramiteDescripcion = query.getResultList();
					if(tramiteDescripcion != null && !tramiteDescripcion.isEmpty()){
						tramiteDto.setNumeroDocumento(tramiteDescripcion.get(0).toString());
					}					
					listaTramites.add(tramiteDto);
				}
			}			
			personaSnapDto.setListaTramites(listaTramites);	
			
			if(institucion.equals(InstitucionSnapEnum.CRIMINALISTICA.getNombre()) || institucion.equals(InstitucionSnapEnum.COPS.getNombre()) || institucion.equals(InstitucionSnapEnum.FISCALIA_GENERAL.getNombre())){
				if("RUC".equals(ltsafeUserDetails.get(0).getIdentificationcatalog())){
					query=PersistenceHelper.getEntityManager().createQuery("select g from TarmGuardias g where g.cempresa=:personcode");
					query.setParameter("personcode", ltsafeUserDetails.get(0).getPk().getPersoncode());
					List<TarmGuardias> listaGuardias = query.getResultList();
					if(listaGuardias != null && !listaGuardias.isEmpty()){
						List<InfoGuardiaDto> listaInfoGuardias = new ArrayList<>();
						for(TarmGuardias tarmGuardias : listaGuardias){
							InfoGuardiaDto infoGuardiaDto = new InfoGuardiaDto();
							infoGuardiaDto.setEstado(tarmGuardias.getEstado());
							
							query=PersistenceHelper.getEntityManager().createQuery("select pd from TcustPersonDetail pd where pd.pk.personcode=:personcode");
							query.setParameter("personcode", tarmGuardias.getPk());
							List<TcustPersonDetail> listaPeson = query.getResultList();
							if(listaPeson != null && !listaPeson.isEmpty()){
								infoGuardiaDto.setNombre(listaPeson.get(0).getName());
							}
							listaInfoGuardias.add(infoGuardiaDto);
						}
						personaSnapDto.setListaGuardias(listaInfoGuardias);
					}
				}else{
					query=PersistenceHelper.getEntityManager().createQuery("select g from TarmGuardias g where g.pk=:personcode");
					query.setParameter("personcode", ltsafeUserDetails.get(0).getPk().getPersoncode());
					List<TarmGuardias> listaPersonaGuardia = query.getResultList();
					if(listaPersonaGuardia != null && !listaPersonaGuardia.isEmpty() && listaPersonaGuardia.get(0).getCempresa() != null){
						List<InfoGuardiaDto> listaInfoGuardias = new ArrayList<>();
						InfoGuardiaDto infoGuardiaDto = new InfoGuardiaDto();
						infoGuardiaDto.setEstado(listaPersonaGuardia.get(0).getEstado());
						
						query=PersistenceHelper.getEntityManager().createQuery("select pd from TcustPersonDetail pd where pd.pk.personcode=:personcode");
						query.setParameter("personcode", listaPersonaGuardia.get(0).getCempresa());
						List<TcustPersonDetail> listaEmpresa = query.getResultList();
						if(listaEmpresa != null && !listaEmpresa.isEmpty()){
							infoGuardiaDto.setEmpresa(listaEmpresa.get(0).getName());
						}
						listaInfoGuardias.add(infoGuardiaDto);
						personaSnapDto.setListaGuardias(listaInfoGuardias);
					}
					
				}
				
				//datos del arma
				query=PersistenceHelper.getEntityManager().createQuery("select ta from TarmArmas ta, TarmRegistroArmas regarm, TcustPersonDetail pd "
						+ " where ta.cregistro = regarm.pk and pd.pk.personcode = regarm.personcode and pd.pk.dateto = :dateto"
						+ " and ta.lote = :lote and ta.ctipoarmaexplosivo in (select te.pk from TarmTipoArmaExplosivo te where te.clase = '0010000001')"
						+ " and pd.pk.personcode = :personcode");
				query.setParameter("lote", serie);
				query.setParameter("dateto", FormatDates.getDefaultExpiryTimestamp());
				query.setParameter("personcode", ltsafeUserDetails.get(0).getPk().getPersoncode());
				List<TarmArmas> listaArma = query.getResultList();
				if(listaArma != null && !listaArma.isEmpty()){
					List<DatosArmaDto> listaDatosArma = new ArrayList<>();
					for(TarmArmas tarmArmas : listaArma){
						DatosArmaDto datosArmaDto = new DatosArmaDto();
						datosArmaDto.setLote(tarmArmas.getLote());
						datosArmaDto.setTipoFabricacion(tarmArmas.getTipofabricacion());
						
						//marca
						query=PersistenceHelper.getEntityManager().createQuery("select cat from TgeneCatalogDetail cat, TarmArmas arm "
								+ "where cat.pk.catalog = arm.marca and cat.pk.catalogcode = arm.marcacodigo and arm.pk = :carma");
						query.setParameter("carma", tarmArmas.getPk());
						List<TgeneCatalogDetail> listaCatalogoMarca = query.getResultList();
						if(listaCatalogoMarca != null && !listaCatalogoMarca.isEmpty()){
							datosArmaDto.setMarca(listaCatalogoMarca.get(0).getDescription());
						}
						
						//datosArmaDto.setMarca(tarmArmas.getMarca());
						datosArmaDto.setModelo(tarmArmas.getModelo());
						datosArmaDto.setEstadoArma(tarmArmas.getEstado());
						
						query=PersistenceHelper.getEntityManager().createQuery("select a from TarmArmaPruebas a where a.personcode = :personcode and a.carma = :carma");
						query.setParameter("personcode", ltsafeUserDetails.get(0).getPk().getPersoncode());
						query.setParameter("carma", tarmArmas.getPk());
						List<TarmArmaPruebas> listaArmaPrueba = query.getResultList();
						if(listaArmaPrueba != null && !listaArmaPrueba.isEmpty()){
							if(institucion.equals(InstitucionSnapEnum.CRIMINALISTICA.getNombre())){
								datosArmaDto.setImagenImpronta(listaArmaPrueba.get(0).getXpathimpronta());
								datosArmaDto.setImagenArma(listaArmaPrueba.get(0).getXpathfotografia());
							}
							datosArmaDto.setFichaTecnicaArma(listaArmaPrueba.get(0).getXpathfichatecarmas());
						}
						
						//clase
						query=PersistenceHelper.getEntityManager().createQuery("select cat from TarmTipoArmaExplosivo tae, TgeneCatalogDetail cat, TarmArmas arm where cat.pk.catalog = tae.clase and cat.pk.catalogcode = tae.clasecodigo"
								+ " and tae.pk = arm.ctipoarmaexplosivo and tae.pk = :ctipoarmaexplosivo and arm.pk = :carma");
						query.setParameter("ctipoarmaexplosivo", tarmArmas.getCtipoarmaexplosivo());
						query.setParameter("carma", tarmArmas.getPk());
						List<TgeneCatalogDetail> listaCatalogoClase = query.getResultList();
						if(listaCatalogoClase != null && !listaCatalogoClase.isEmpty()){
							datosArmaDto.setDescripcionClase(listaCatalogoClase.get(0).getDescription());
						}
						
						//tipo
						query=PersistenceHelper.getEntityManager().createQuery("select cat from TarmTipoArmaExplosivo tae, TgeneCatalogDetail cat, TarmArmas arm where cat.pk.catalog = tae.tipoarmaexplosivo and cat.pk.catalogcode = tae.tipoarmaexplosivocodigo"
								+ " and tae.pk = arm.ctipoarmaexplosivo and tae.pk = :ctipoarmaexplosivo and arm.pk = :carma");
						query.setParameter("ctipoarmaexplosivo", tarmArmas.getCtipoarmaexplosivo());
						query.setParameter("carma", tarmArmas.getPk());
						List<TgeneCatalogDetail> listaCatalogoTipo = query.getResultList();
						if(listaCatalogoTipo != null && !listaCatalogoTipo.isEmpty()){
							datosArmaDto.setDescripcionTipo(listaCatalogoTipo.get(0).getDescription());
						}
						
						//calibre
						query=PersistenceHelper.getEntityManager().createQuery("select cat from TarmTipoArmaExplosivo tae, TgeneCatalogDetail cat, TarmArmas arm where cat.pk.catalog = tae.calibre and cat.pk.catalogcode = tae.calibrecodigo"
								+ " and tae.pk = arm.ctipoarmaexplosivo and tae.pk = :ctipoarmaexplosivo and arm.pk = :carma");
						query.setParameter("ctipoarmaexplosivo", tarmArmas.getCtipoarmaexplosivo());
						query.setParameter("carma", tarmArmas.getPk());
						List<TgeneCatalogDetail> listaCatalogoCalibre = query.getResultList();
						if(listaCatalogoCalibre != null && !listaCatalogoCalibre.isEmpty()){
							datosArmaDto.setCalibre(listaCatalogoCalibre.get(0).getDescription());
						}
						listaDatosArma.add(datosArmaDto);
					}
					personaSnapDto.setListaDatosArma(listaDatosArma);
				}
			}
			
			
			
			pRequest.getResponse().put("DATOSPERSONSNAP", personaSnapDto);
		} catch (Throwable e) {
			APPLogger.getLogger().error(e.getMessage(), e);
		}
		return pRequest;
	}
	
}
