package com.rjconsultores.ventaboletos.service.impl;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.rjconsultores.ventaboletos.dao.GP_PricingHistoricoDAO;
import com.rjconsultores.ventaboletos.entidad.GP_Pricing;
import com.rjconsultores.ventaboletos.entidad.GP_PricingEspecifico;
import com.rjconsultores.ventaboletos.entidad.GP_PricingHistorico;
import com.rjconsultores.ventaboletos.service.GP_PricingHistoricoService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;

@Service("gp_pricingHistoricoService")
public class GP_PricingHistoricoServiceImpl implements GP_PricingHistoricoService {

	@Autowired
	private GP_PricingHistoricoDAO pricingHistoricoDAO;
	
	private static final Logger log = LogManager.getLogger(GP_PricingHistoricoServiceImpl.class);

	@Override
	@Transactional
	public void compararESalvar(Object original, Object novo) {

//		List<AlteracoesDoObjeto> alteracoes =  Auditador.auditar(original, novo);
//		
//		Long idPricing = null;
//		Boolean isPricingEspecifico = false;
//		
//		if(novo instanceof GP_PricingEspecifico ) {
//			idPricing = ((GP_PricingEspecifico) novo).getPricingespecificoId();
//			isPricingEspecifico = true;
//		} else {
//			idPricing = Long.parseLong(((GP_Pricing) novo).getPricingId().toString());
//			isPricingEspecifico = false;
//		}
//		
//		Date dataHoraAlteracao = Calendar.getInstance().getTime();
//		Integer usuarioId = UsuarioLogado.getUsuarioLogado().getUsuarioId();
//		
//		for(AlteracoesDoObjeto alteracao : alteracoes) {
//			GP_PricingHistorico historico = criarHistorico(alteracao.getDescricao(), alteracao.getClassePrincipal(), alteracao.getCampoAlterado(), 
//					alteracao.getClasseAlterada(), dataHoraAlteracao, idPricing, usuarioId,
//					alteracao.getValorAnterior(), alteracao.getValorNovo(), isPricingEspecifico);
//			
//			try {
//				pricingHistoricoDAO.suscribir(historico);
//			} catch (Exception e) {
//				log.error("Erro ao salvar o historico do pricing ", e);
//			}
//		}
	}
	
	@Transactional
	@Override
	public void registarExclusao(Object pricing, Boolean ativar) {
		Date dataHoraAlteracao = Calendar.getInstance().getTime();
		Integer usuarioId = UsuarioLogado.getUsuarioLogado().getUsuarioId();
		
		String nomePricing = null;
		Long pricingId = null;
		Boolean isPricingEspecifico = false;
		
		if(pricing instanceof GP_PricingEspecifico ) {
			nomePricing = ((GP_PricingEspecifico) pricing).getNombPricing();
			pricingId = ((GP_PricingEspecifico) pricing).getPricingespecificoId();
			isPricingEspecifico = true;
		} else {
			nomePricing = ((GP_Pricing) pricing).getNombPricing();
			pricingId = Long.parseLong(((GP_Pricing) pricing).getPricingId().toString());
		}

		StringBuilder descricao = new StringBuilder();
		
		descricao.append("O Pricing ").append(pricingId).append(" - ").append(nomePricing)
				 .append(" foi " + (ativar ? "ativado " : "desativado") + " pelo usuário ").append(usuarioId).append(" - ").append(UsuarioLogado.getUsuarioLogado().getNombusuario())
				 .append(" em ").append(getStringDate(dataHoraAlteracao));

		GP_PricingHistorico historico = criarHistorico(descricao.toString(), "PRICING_RAPIDO", "ATIVO", "PRICING_RAPIDO", dataHoraAlteracao, 
				pricingId, usuarioId, ativar ? "NAO" : "SIM" , ativar ? "SIM" : "NAO", isPricingEspecifico);

		try {
			pricingHistoricoDAO.suscribir(historico);
		} catch (Exception e) {
			log.error("Erro ao salvar o historico do pricing ", e);
		}
	}
	
	private String getStringDate(java.util.Date d) {
		if (d != null) {
			DateFormat df = new SimpleDateFormat("dd/MM/yyyy hh:mm");
			return df.format(d);
		}
		return null;
	}

	private GP_PricingHistorico criarHistorico(String descricao, String classePrincipal, String campoAlterado, String classeAlterada, Date dataHoraAlteracao, Long pricingId,
			Integer usuarioId, String valorAnterior, String valorNovo, Boolean isEspecifico) {
		GP_PricingHistorico historico = new GP_PricingHistorico();

		historico.setClassePrincipal(classePrincipal);
		historico.setCampoAlterado(campoAlterado);
		historico.setClasseAlterada(classeAlterada);
		historico.setFecmodif(dataHoraAlteracao);
		historico.setIsEspecifico(isEspecifico);
		historico.setPricingId(pricingId);
		historico.setUsuarioId(usuarioId);
		historico.setValorAnterior(valorAnterior);
		historico.setValorNovo(valorNovo);
		historico.setDescricao(descricao);

		return historico;
	}

	@Override
	public List<GP_PricingHistorico> obtenerTodos() {
		return pricingHistoricoDAO.obtenerTodos();
	}

	@Override
	public GP_PricingHistorico obtenerID(Long id) {
		return pricingHistoricoDAO.obtenerID(id);
	}

	@Override
	public GP_PricingHistorico suscribir(GP_PricingHistorico entidad) {
		return pricingHistoricoDAO.suscribir(entidad);
	}

	@Override
	public GP_PricingHistorico actualizacion(GP_PricingHistorico entidad) {
		return pricingHistoricoDAO.actualizacion(entidad);
	}

	@Override
	public void borrar(GP_PricingHistorico entidad) {
		pricingHistoricoDAO.borrar(entidad);
	}

}
