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

import java.util.List;

import javax.persistence.Query;

import com.fp.common.logger.APPLogger;
import com.fp.persistence.commondb.PersistenceHelper;
import com.fp.persistence.parmas.dto.ws.ArmaDto;
import com.fp.persistence.parmas.inte.TarmTagArma;
import com.fp.persistence.parmas.param.TarmTipoArmaExplosivo;
import com.fp.persistence.parmas.soli.TarmArmas;
import com.fp.persistence.pgeneral.gene.TgeneCatalogDetail;
import com.fp.persistence.pgeneral.gene.TgeneCatalogDetailKey;

/**
 * Clase de funcionalidades que trabajan con {@link ArmaDto}
 * @author dcruz
 *
 */
public class ArmaUtil {

	private static ArmaUtil INSTANCIA = new ArmaUtil();
	private static final String QUERY_ARMA_TAG = "SELECT o FROM TarmTagArma o WHERE o.pk.carma=:carma";
	private static final String QUERY_ARMA_TAG_ARMA = "SELECT o FROM TarmTagArma o WHERE o.pk.ctag=:ctag";
	
	private ArmaUtil(){}
	
	public static ArmaUtil getInstancia() {
		return INSTANCIA;
	}
	
	public ArmaDto obtenerArmaId(String carma) {
		ArmaDto arma = null;
		try {
			TarmArmas tarmArmas = PersistenceHelper.getEntityManager().find(TarmArmas.class, carma);
			if(tarmArmas != null){
				arma = new ArmaDto();
				arma.setIdArma(tarmArmas.getPk());
				arma.setCantidad(tarmArmas.getCantidad());
				arma.setSerie(tarmArmas.getLote());
				if(tarmArmas.getMarca()!=null && tarmArmas.getMarcacodigo()!=null){
					TgeneCatalogDetail marca=TgeneCatalogDetail.
							find(PersistenceHelper.getEntityManager(),new TgeneCatalogDetailKey(tarmArmas.getMarca(), tarmArmas.getMarcacodigo()));
					if(marca!=null){
						arma.setMarca(marca.getDescription());
					}
				}
				
				arma.setModelo(tarmArmas.getModelo());
				TgeneCatalogDetail estado;
			
				estado = TgeneCatalogDetail.find(PersistenceHelper.getEntityManager(), new TgeneCatalogDetailKey(tarmArmas.getEstado() != null ? tarmArmas.getEstado() : "", tarmArmas.getEstadocodigo() != null ? tarmArmas.getEstadocodigo() : ""));
				arma.setEstado(estado != null ? estado.getDescription() : "");
				arma.setTagAsociado(obtenerTag(arma.getIdArma()));
				TarmTipoArmaExplosivo tipoArmaExplosivo = TarmTipoArmaExplosivo.find(PersistenceHelper.getEntityManager(), tarmArmas.getCtipoarmaexplosivo());
				if(tipoArmaExplosivo != null){
					TgeneCatalogDetail clase= TgeneCatalogDetail.find(PersistenceHelper.getEntityManager(), new TgeneCatalogDetailKey(tipoArmaExplosivo.getClase() != null ? tipoArmaExplosivo.getClase() : "", tipoArmaExplosivo.getClasecodigo() != null ? tipoArmaExplosivo.getClasecodigo() : ""));
					arma.setClase(clase != null ? clase.getDescription():null);
					TgeneCatalogDetail tipoArma= TgeneCatalogDetail.find(PersistenceHelper.getEntityManager(), new TgeneCatalogDetailKey(tipoArmaExplosivo.getTipoarmaexplosivo() != null ? tipoArmaExplosivo.getTipoarmaexplosivo() : "", tipoArmaExplosivo.getTipoarmaexplosivocodigo() != null ? tipoArmaExplosivo.getTipoarmaexplosivocodigo() : ""));
					arma.setTipo(tipoArma != null ? tipoArma.getDescription():null);
					TgeneCatalogDetail unidadMedida= TgeneCatalogDetail.find(PersistenceHelper.getEntityManager(), new TgeneCatalogDetailKey(tipoArmaExplosivo.getUnidadmedidapeso() != null ? tipoArmaExplosivo.getUnidadmedidapeso():"", tipoArmaExplosivo.getUnidadmedidapesocodigo() != null ? tipoArmaExplosivo.getUnidadmedidapesocodigo() : ""));
					arma.setUnidadMedidaPeso(unidadMedida != null ? unidadMedida.getDescription():null);
					TgeneCatalogDetail calibre= TgeneCatalogDetail.find(PersistenceHelper.getEntityManager(), new TgeneCatalogDetailKey(tipoArmaExplosivo.getCalibre() != null ? tipoArmaExplosivo.getCalibre() : "", tipoArmaExplosivo.getCalibrecodigo() != null ? tipoArmaExplosivo.getCalibrecodigo() : ""));
					arma.setCalibre(calibre != null ? calibre.getDescription() : null);
					TgeneCatalogDetail longitud= TgeneCatalogDetail.find(PersistenceHelper.getEntityManager(), new TgeneCatalogDetailKey(tipoArmaExplosivo.getLongitud() != null ? tipoArmaExplosivo.getLongitud() : "", tipoArmaExplosivo.getLongitudcodigo() != null ? tipoArmaExplosivo.getLongitudcodigo() : ""));
					arma.setLongitud(longitud != null ? longitud.getDescription() : null);
				}
				return arma;
			}
		} catch (Exception e) {
			APPLogger.getLogger().error(e);
		}
		return null;
	}
	/**
	 * Obtiene el ArmaDto por el codigo del tag
	 * @param ctag codigo del tag
	 * @return ArmaDto
	 */
	public ArmaDto obtenerArmaIdPorTag(String ctag) {
		ArmaDto arma = null;
		try {
			String carma = obtenerTagPorId(ctag); 
			if(carma!=null && !carma.isEmpty()){
				TarmArmas tarmArmas = PersistenceHelper.getEntityManager().find(TarmArmas.class, carma);
				if(tarmArmas != null){
					arma = new ArmaDto();
					arma.setIdArma(tarmArmas.getPk());
					arma.setCantidad(tarmArmas.getCantidad());
					arma.setSerie(tarmArmas.getLote());
					if(tarmArmas.getMarca()!=null && tarmArmas.getMarcacodigo()!=null){
						TgeneCatalogDetail marca=TgeneCatalogDetail.
								find(PersistenceHelper.getEntityManager(),new TgeneCatalogDetailKey(tarmArmas.getMarca(), tarmArmas.getMarcacodigo()));
						if(marca!=null){
							arma.setMarca(marca.getDescription());
						}
					}
					
					arma.setModelo(tarmArmas.getModelo());
					TgeneCatalogDetail estado;
				
					estado = TgeneCatalogDetail.find(PersistenceHelper.getEntityManager(), new TgeneCatalogDetailKey(tarmArmas.getEstado() != null ? tarmArmas.getEstado() : "", tarmArmas.getEstadocodigo() != null ? tarmArmas.getEstadocodigo() : ""));
					arma.setEstado(estado != null ? estado.getDescription() : "");
					arma.setTagAsociado(ctag);
					TarmTipoArmaExplosivo tipoArmaExplosivo = TarmTipoArmaExplosivo.find(PersistenceHelper.getEntityManager(), tarmArmas.getCtipoarmaexplosivo());
					if(tipoArmaExplosivo != null){
						TgeneCatalogDetail clase= TgeneCatalogDetail.find(PersistenceHelper.getEntityManager(), new TgeneCatalogDetailKey(tipoArmaExplosivo.getClase() != null ? tipoArmaExplosivo.getClase() : "", tipoArmaExplosivo.getClasecodigo() != null ? tipoArmaExplosivo.getClasecodigo() : ""));
						arma.setClase(clase != null ? clase.getDescription():null);
						TgeneCatalogDetail tipoArma= TgeneCatalogDetail.find(PersistenceHelper.getEntityManager(), new TgeneCatalogDetailKey(tipoArmaExplosivo.getTipoarmaexplosivo() != null ? tipoArmaExplosivo.getTipoarmaexplosivo() : "", tipoArmaExplosivo.getTipoarmaexplosivocodigo() != null ? tipoArmaExplosivo.getTipoarmaexplosivocodigo() : ""));
						arma.setTipo(tipoArma != null ? tipoArma.getDescription():null);
						TgeneCatalogDetail unidadMedida= TgeneCatalogDetail.find(PersistenceHelper.getEntityManager(), new TgeneCatalogDetailKey(tipoArmaExplosivo.getUnidadmedidapeso() != null ? tipoArmaExplosivo.getUnidadmedidapeso():"", tipoArmaExplosivo.getUnidadmedidapesocodigo() != null ? tipoArmaExplosivo.getUnidadmedidapesocodigo() : ""));
						arma.setUnidadMedidaPeso(unidadMedida != null ? unidadMedida.getDescription():null);
						TgeneCatalogDetail calibre= TgeneCatalogDetail.find(PersistenceHelper.getEntityManager(), new TgeneCatalogDetailKey(tipoArmaExplosivo.getCalibre() != null ? tipoArmaExplosivo.getCalibre() : "", tipoArmaExplosivo.getCalibrecodigo() != null ? tipoArmaExplosivo.getCalibrecodigo() : ""));
						arma.setCalibre(calibre != null ? calibre.getDescription() : null);
						TgeneCatalogDetail longitud= TgeneCatalogDetail.find(PersistenceHelper.getEntityManager(), new TgeneCatalogDetailKey(tipoArmaExplosivo.getLongitud() != null ? tipoArmaExplosivo.getLongitud() : "", tipoArmaExplosivo.getLongitudcodigo() != null ? tipoArmaExplosivo.getLongitudcodigo() : ""));
						arma.setLongitud(longitud != null ? longitud.getDescription() : null);
					}
					return arma;
				}
			}
			
		} catch (Exception e) {
			APPLogger.getLogger().error(e);
		}
		return null;
	}
	
	/**
	 * Retorna el tag del arma asociado
	 * @param carma
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public String obtenerTag(String carma) {
		String tagArma = null;
		Query query = PersistenceHelper.getEntityManager().createQuery(QUERY_ARMA_TAG);
		query.setParameter("carma", carma);
		List<TarmTagArma> lTarmTagArmas = query.getResultList();
		if(lTarmTagArmas != null && !lTarmTagArmas.isEmpty()){
			tagArma = lTarmTagArmas.iterator().next().getPk().getCtag();
		}
		return tagArma;
	}
	
	 /** 
	  * Retorna el carma asociado al tag
	  * @param ctag
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public String obtenerTagPorId(String ctag) {
		String tagArma = null;
		Query query = PersistenceHelper.getEntityManager().createQuery(QUERY_ARMA_TAG_ARMA);
		query.setParameter("ctag", ctag);
		List<TarmTagArma> lTarmTagArmas = query.getResultList();
		if(lTarmTagArmas != null && !lTarmTagArmas.isEmpty()){
			tagArma = lTarmTagArmas.iterator().next().getPk().getCarma();
		}
		return tagArma;
	}
}
