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

import java.sql.Timestamp;
import java.util.List;

import javax.persistence.Query;

import com.fp.common.logger.APPLogger;
import com.fp.dto.rules.TransactionRule;
import com.fp.dto.save.SaveRequest;
import com.fp.persistence.commondb.PersistenceHelper;
import com.fp.persistence.parmas.inte.TarmTagArma;
import com.fp.persistence.parmas.inte.TarmTagArmaKey;

/**
 * Vinculo un arma con un tag, respondo con un mensaje de validaci&oacute;n para mostrar el estado de la petici&oacute;n 
 * @author dcruz
 *
 */
public class VinculaTagArma extends TransactionRule {

	private static final long serialVersionUID = 7380264973023057406L;
	private static final String QUERY_TAGARMA = "SELECT o FROM TarmTagArma o WHERE o.pk.carma=:carma";

	/**
	 * Respondo con 0 es correcto, 1 el arma ya esta registrada con otro tag, 2 el arma ya ha sido registrada, 3 existi&oacute; un error
	 */
	@SuppressWarnings("unchecked")
	@Override
	public SaveRequest normalProcess(SaveRequest pRequest) throws Exception {
		String respuesta;
		try {
			String carma = (String) pRequest.get("CODIGOARMA");
			String tagArma = (String) pRequest.get("CODIGOTAG");
			TarmTagArma tarmTagArma = PersistenceHelper.getEntityManager().find(TarmTagArma.class, new TarmTagArmaKey(carma, tagArma));
			Query query = PersistenceHelper.getEntityManager().createQuery(QUERY_TAGARMA);
			query.setParameter("carma", carma);
			List<TarmTagArma> ltarmTagArmas = query.getResultList();
			if(tarmTagArma != null){
				respuesta = "2";
			} else if(!ltarmTagArmas.isEmpty()){
				respuesta = "1";
			} else{
				TarmTagArma ptagArma = new TarmTagArma(new TarmTagArmaKey(carma, tagArma));
				ptagArma.setFecha(new Timestamp(System.currentTimeMillis()));
				PersistenceHelper.getEntityManager().persist(ptagArma);
				PersistenceHelper.getEntityManager().flush();
				respuesta = "0";
			}
		} catch (Throwable e) {
			APPLogger.getLogger().error(e.getMessage(), e);
			respuesta = "3";
		}
		pRequest.getResponse().put("RESPONSESTATUS", respuesta);
		return pRequest;
	}

	/**
	 * M&eacute;todo que se realiza al hacer rollback la transacci&oacute;n
	 */
	@Override
	public SaveRequest reverseProcess(SaveRequest pRequest) throws Exception {
		return pRequest;
	}

}
