package com.rjconsultores.ventaboletos.service.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
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.ComissaoLogDAO;
import com.rjconsultores.ventaboletos.dao.ComissaoReceitaDAO;
import com.rjconsultores.ventaboletos.entidad.ComissaoReceita;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.service.ComissaoReceitaService;
import com.rjconsultores.ventaboletos.utilerias.MoneyHelper;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;

@Service("comissaoReceitaService")
public class ComissaoReceitaServiceImpl implements ComissaoReceitaService {
	
	private static final Logger log = LogManager.getLogger(CalculoComissaoServiceImpl.class);
	
	@Autowired
	private ComissaoReceitaDAO comissaoReceitaDAO;
	
	@Autowired
	private ComissaoLogDAO comissaoLogDAO; 

	@Override
	public List<ComissaoReceita> obtenerTodos() {
		return comissaoReceitaDAO.obtenerTodos();
	}

	@Override
	public ComissaoReceita obtenerID(Integer id) {
		return comissaoReceitaDAO.obtenerID(id);
	}

	@Override
	@Transactional
	public ComissaoReceita suscribir(ComissaoReceita entidad) {
		entidad.setActivo(Boolean.TRUE);
		entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		entidad.setFecmodif(Calendar.getInstance().getTime());
		return comissaoReceitaDAO.suscribir(entidad);
	}

	@Override
	@Transactional
	public ComissaoReceita actualizacion(ComissaoReceita entidad) {
		entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		entidad.setFecmodif(Calendar.getInstance().getTime());
		return comissaoReceitaDAO.actualizacion(entidad);
	}

	@Override
	@Transactional
	public void borrar(ComissaoReceita entidad) {
		entidad.setActivo(Boolean.TRUE);
		entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		entidad.setFecmodif(Calendar.getInstance().getTime());
		comissaoReceitaDAO.actualizacion(entidad);
	}

	@Override
	@Transactional
	public void reterComissaoReceitaDiaria(Integer empresaId, Integer puntoVentaId, Integer usuarioId, List<com.rjconsultores.ventaboletos.vo.comissao.ComissaoReceita> receitas) throws BusinessException {
		try {
			Empresa empresa = new Empresa(empresaId);
			PuntoVenta puntoVenta = new PuntoVenta(puntoVentaId);
			for (com.rjconsultores.ventaboletos.vo.comissao.ComissaoReceita comissaoReceitaVO : receitas) {
				ComissaoReceita comissaoReceita = new ComissaoReceita(comissaoReceitaVO);
				comissaoReceita.setEmpresa(empresa);
				comissaoReceita.setPuntoVenta(puntoVenta);
				comissaoReceita.setUsuarioId(usuarioId);
				comissaoReceitaDAO.suscribir(comissaoReceita);
				comissaoLogDAO.suscribirTodos(comissaoReceitaVO.getLsComissaoLog());
			}
		} catch (Exception e) {
			log.error(e.getMessage(), e);
			throw new BusinessException(e.getMessage(), e);
		}		
	}

	@Override
	public List<com.rjconsultores.ventaboletos.vo.comissao.ComissaoReceita> recuperarComissaoReceita(Integer empresaId, Integer puntoVentaId, Date dataInicial, Date dataFinal) {
		
		List<com.rjconsultores.ventaboletos.vo.comissao.ComissaoReceita> lsComissaoReceitasVO = new ArrayList<com.rjconsultores.ventaboletos.vo.comissao.ComissaoReceita>();
		List<ComissaoReceita> lsComissaoReceitas = comissaoReceitaDAO.recuperarComissaoReceita(empresaId, puntoVentaId, dataInicial, dataFinal);
		for (ComissaoReceita comissaoReceita : lsComissaoReceitas) {
			com.rjconsultores.ventaboletos.vo.comissao.ComissaoReceita comissaoReceitaVO = new com.rjconsultores.ventaboletos.vo.comissao.ComissaoReceita();
			comissaoReceitaVO.setCancelados(comissaoReceita.getCancelados());
			comissaoReceitaVO.setCanceladosGAP(comissaoReceita.getCancelgap());
			comissaoReceitaVO.setComissaoBPRDiaria(comissaoReceita.getComissaoBpr());
			comissaoReceitaVO.setComissaoEntregaPassagemDiaria(comissaoReceita.getComissaoEntregaPassagem());
			comissaoReceitaVO.setComissaoExcessoBagagemDiaria(comissaoReceita.getComissaoExcessoBagagem());
			comissaoReceitaVO.setComissaoOutrosDiaria(comissaoReceita.getComissaoOutros());
			comissaoReceitaVO.setComissaoSegOpcionalDiaria(comissaoReceita.getComissaoSegOpcional());
			comissaoReceitaVO.setComissaoSeguroObrigatorioDiaria(comissaoReceita.getComissaoSegObrigatorio());
			comissaoReceitaVO.setContImpressa(comissaoReceita.getQtdeImpgap());
			comissaoReceitaVO.setData(comissaoReceita.getDatamovimento());
			comissaoReceitaVO.setDevolucoesOrigem(comissaoReceita.getDevolvidosOrigem());
			comissaoReceitaVO.setDevolucoesOrigemGAP(comissaoReceita.getDevolvidosOrigemGap());
			comissaoReceitaVO.setDevolvidos(comissaoReceita.getDevolvidos());
			comissaoReceitaVO.setDevolvidosGAP(comissaoReceita.getDevgap());
			comissaoReceitaVO.setGapImpressa(comissaoReceita.getImpgap());
			comissaoReceitaVO.setInternet(comissaoReceita.getInternet());
			comissaoReceitaVO.setReceitaBPR(comissaoReceita.getBpr());
			comissaoReceitaVO.setReceitaExcessoBagagem(comissaoReceita.getExcessoBagagem());
			comissaoReceitaVO.setReceitaGAP(comissaoReceita.getGap());
			comissaoReceitaVO.setReceitaSeguroOpcional(comissaoReceita.getSegOpcional());
			comissaoReceitaVO.setReceitaSeguro(comissaoReceita.getSegObrigatorio());
			comissaoReceitaVO.setReceitaSeguroOutros(comissaoReceita.getReceitaOutros());
			
			BigDecimal receitaComissao = BigDecimal.ZERO;
			receitaComissao = MoneyHelper.somar(receitaComissao,comissaoReceitaVO.getReceitaBPR());
			receitaComissao = MoneyHelper.somar(receitaComissao,comissaoReceitaVO.getReceitaSeguro());
			receitaComissao = MoneyHelper.somar(receitaComissao,comissaoReceitaVO.getReceitaGAP());

			receitaComissao = MoneyHelper.subtrair(receitaComissao,comissaoReceitaVO.getCancelados());
			receitaComissao = MoneyHelper.subtrair(receitaComissao,comissaoReceitaVO.getDevolvidos());
			receitaComissao = MoneyHelper.subtrair(receitaComissao,comissaoReceitaVO.getDevolvidosGAP());
			receitaComissao = MoneyHelper.subtrair(receitaComissao,comissaoReceitaVO.getCanceladosGAP());
			
			comissaoReceitaVO.setReceitaComissao(receitaComissao);
			
			lsComissaoReceitasVO.add(comissaoReceitaVO);
			
		}
		
		return lsComissaoReceitasVO;
	}

	@Override
	@Transactional
	public void limparComissaoReceita(Integer empresaId, Integer puntoVentaId, Date dataInicial, Date dataFinal) throws BusinessException {
		try {
			comissaoReceitaDAO.limparComissaoReceita(empresaId, puntoVentaId, dataInicial, dataFinal);
			comissaoLogDAO.limparComissaoLog(empresaId, puntoVentaId, dataInicial, dataFinal);
		} catch (Exception e) {
			log.error(e.getMessage(), e);
			throw new BusinessException(e.getMessage(), e);
		}
	}

}
