package com.rjconsultores.ventaboletos.vo.busquedapacotes.transformer;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.hibernate.transform.ResultTransformer;

import com.rjconsultores.ventaboletos.enums.SituacaoVendaPacote;
import com.rjconsultores.ventaboletos.vo.busquedapacotes.PacoteVO;

public class DatosTicketResultTransformer implements ResultTransformer {
	
	private static final long serialVersionUID = 1L;

	@Override
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public List<PacoteVO> transformList(List mapList) {
		
		Map<Long, PacoteVO> pacotes = new HashMap<Long, PacoteVO>();
		
		for(Object objmap : mapList ){
			
			Map<String, Object> tupleMap = (Map<String, Object>) objmap;
			Long vendapacoteId = (Long) tupleMap.get("VENDAPACOTE_ID");
			
			if(!pacotes.containsKey(vendapacoteId)){
				PacoteVO pacote = new PacoteVO();
				pacote.setVendapacoteId(vendapacoteId);
				setDatosPacote(pacote, tupleMap);
				pacotes.put(vendapacoteId, pacote);				
			}
		}
				
		List<PacoteVO> pacotesList = new ArrayList<PacoteVO>();
		pacotesList.addAll(pacotes.values());
		
		return pacotesList;
	}

	@Override
	public Object transformTuple(Object[] data, String[] aliases) {
		
		Map<String,Object> row = new HashMap<String,Object>();
		
		for(int index = 0; index < aliases.length; index++){
			row.put(aliases[index], data[index]);
		}
		
		return row;
	}

	private void setDatosPacote(PacoteVO pacote, Map<String, Object> tupleMap){
		pacote.setNumoperacao((String) tupleMap.get("NUMOPERACION"));
		pacote.setUsuariovenda((Integer) tupleMap.get("USUARIO_ID"));
		pacote.setDatavenda((Date) tupleMap.get("DATAVENDA"));
		pacote.setDatapacote((Date) tupleMap.get("DATAPACOTE"));
		
		if(tupleMap.get("SITUACAO") != null) {
			SituacaoVendaPacote situacaoVendaPacote = SituacaoVendaPacote.getSituacaoVendaPacote((Integer) tupleMap.get("SITUACAO"));
			if(situacaoVendaPacote != null) {
				pacote.setStatus(situacaoVendaPacote.toString());
			}
		}
		
		pacote.setPacoteId((Long) tupleMap.get("PACOTE_ID"));
		pacote.setDescpacote((String) tupleMap.get("DESCPACOTE"));
		pacote.setNompacote((String) tupleMap.get("NOMPACOTE"));
		pacote.setPontoVenda((String) tupleMap.get("NOMBPUNTOVENTA"));
		pacote.setEmpresa((String) tupleMap.get("NOMBEMPRESA"));
		pacote.setQuantidade((Integer) tupleMap.get("QTDEPASSAGEIRO"));
		pacote.setTotalTarifa((BigDecimal) tupleMap.get("TOTALTARIFA"));
		pacote.setTotalTaxaEmbarque((BigDecimal) tupleMap.get("TOTALTAXAEMBARQUE"));
		pacote.setTotalPedagio((BigDecimal) tupleMap.get("TOTALPEDAGIO"));
		pacote.setTotalOutros((BigDecimal) tupleMap.get("TOTALOUTROS"));
		pacote.setTotalSeguro((BigDecimal) tupleMap.get("TOTALSEGURO"));
		pacote.setValorsubtotal((BigDecimal) tupleMap.get("SUBTOTAL"));
		pacote.setValortotal((BigDecimal) tupleMap.get("TOTAL"));
		pacote.setValordesconto((BigDecimal) tupleMap.get("DESCONTO"));
		pacote.setQtdePacoteFormaspago((Integer) tupleMap.get("QTDEPACOTEFORMAPAGO"));
		pacote.setDataalteracao((Date) tupleMap.get("FECMODIF"));
		pacote.setDatacancelamento((Date) tupleMap.get("DATACANCELAMENTO"));
		pacote.setEmpresaId((Integer) tupleMap.get("EMPRESA_ID"));
		pacote.setIndEncargoVenta((Boolean) tupleMap.get("INDENCARGOVENTA"));
		
		if(StringUtils.isNotBlank(pacote.getDescpacote())){
			pacote.setDescpacote(StringEscapeUtils.unescapeHtml(pacote.getDescpacote().replaceAll("&nbsp;", " ").replaceAll("\\<.*?\\>", " ")).replaceAll("\\s+", " "));
		}
		
	}
	
}
