package com.rjconsultores.ventaboletos.service.impl;

import java.util.Calendar;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.rjconsultores.ventaboletos.dao.FiscalImpressoraDAO;
import com.rjconsultores.ventaboletos.entidad.FiscalFormapagoEmpresa;
import com.rjconsultores.ventaboletos.entidad.FiscalImpressora;
import com.rjconsultores.ventaboletos.entidad.FiscalRelgerencialEmpresa;
import com.rjconsultores.ventaboletos.entidad.FiscalTotnaofiscalEmpresa;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.service.FiscalImpressoraService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;

@Service("fiscalImpressoraService")
public class FiscalImpressoraServiceImpl implements FiscalImpressoraService {
	
	public enum TipoTotalizadorNaoFiscal {

		CancImpPost(false),
		CartaoCredDeb(false),
		CanPassagem(false),
		VendaManual(false),
		ImpressaoPost(false),
		SeguroOpcional(true),
		CancSeguroOpcional(true),
		Multa(true),
		DiferencaMaior(true),
		DiferencaMenor(true),
		CUSTOM(true);
		
		private final boolean temEE;
		private TipoTotalizadorNaoFiscal(boolean pTemEE) { temEE = pTemEE; }
		public boolean isTemEE() {
			return temEE;
		}
	}
	
	public enum TipoFormaPagamento {
		TotalCartao,
		PtaAtendido,
		TrocaPassagem,
		Gratuidade,
		CUSTOM;
	}
	public enum TipoRelatorioGerencial {
		RelatorioGeral,
		CupomEmbarque,
		CupomEmbGratuidade,
		IdentificacaoPafECF,
		ManifestoFiscal,
		ParametrosConfiguracao,
		IdentificacaoIdaVolta,
		RelatorioDavDiv
		/*CUSTOM*/;
	}
	
	@Autowired
	FiscalImpressoraDAO fiscalImpressoraDAO;
	
	@Override
	public List<FiscalImpressora> obtenerTodos() {
		return fiscalImpressoraDAO.obtenerTodos();
	}

	@Override
	public FiscalImpressora obtenerID(Integer id) {
		return fiscalImpressoraDAO.obtenerID(id);
	}

	@Override
	@Transactional
	public FiscalImpressora suscribir(FiscalImpressora entidad) {
		return fiscalImpressoraDAO.suscribir(entidad);
	}

	@Override
	@Transactional
	public FiscalImpressora actualizacion(FiscalImpressora entidad) {
		return fiscalImpressoraDAO.actualizacion(entidad);
	}

	@Override
	public List<FiscalTotnaofiscalEmpresa> buscarTotsNaoFiscaisEmpresa(Integer empresaEcfId) {		
		return fiscalImpressoraDAO.buscarTotsNaoFiscaisEmpresa(empresaEcfId);
	}

	@Override
	public List<FiscalFormapagoEmpresa> buscarFormaPagoEmpresa(Integer empresaEcfId) {
		return fiscalImpressoraDAO.buscarFormaPagoEmpresa(empresaEcfId);
	}

	@Override
	public List<FiscalRelgerencialEmpresa> buscarItensRelgerencialEmpresa(Integer empresaEcfId) {		
		return fiscalImpressoraDAO.buscarItensRelgerencialEmpresa(empresaEcfId);
	}

	@Override
	public List<FiscalTotnaofiscalEmpresa> obtenerTodosTotnaofiscalEmpresa() {		
		return fiscalImpressoraDAO.obtenerTodosTotnaofiscalEmpresa();
	}

	@Override
	public FiscalTotnaofiscalEmpresa obtenerIDTotnaofiscalEmpresa(Long id) {
		return fiscalImpressoraDAO.obtenerIDTotnaofiscalEmpresa(id);
	}

	@Override
	@Transactional
	public void borrarTotnaofiscalEmpresa(FiscalTotnaofiscalEmpresa totnaofiscalEmpresa) {
		totnaofiscalEmpresa.setActivo(false);
    	totnaofiscalEmpresa.setFecmodif(Calendar.getInstance().getTime());
    	totnaofiscalEmpresa.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		
		fiscalImpressoraDAO.borrarTotnaofiscalEmpresa(totnaofiscalEmpresa);
	}
	
	@Override
	@Transactional(rollbackFor=BusinessException.class)
	public FiscalTotnaofiscalEmpresa suscribirActualizarTotnaofiscalEmpresa(FiscalTotnaofiscalEmpresa entidad) throws BusinessException {
		entidad.setActivo(true);
		entidad.setFecmodif(Calendar.getInstance().getTime());
		entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		
		
		FiscalTotnaofiscalEmpresa item = null;
		
		if (!TipoTotalizadorNaoFiscal.CUSTOM.toString().equals(entidad.getTipototalizador())){
			item = fiscalImpressoraDAO.buscarTotNaoFiscal(entidad.getEmpresa(), entidad.getTipototalizador());
		}else{
			if (entidad.getTipoeventoextra() == null){
				item = fiscalImpressoraDAO.buscarTotNaoFiscal(entidad.getEmpresa(), entidad.getTipototalizador(),entidad.getDescricao());
			}else{
				item = fiscalImpressoraDAO.buscarTotNaoFiscal(entidad.getEmpresa(), entidad.getTipototalizador(),entidad.getDescricao(),entidad.getTipoeventoextra());
			}
		}
		
		if ( (entidad.getFiscaltotnaofiscalId() == null) && (item != null) ){
			throw new BusinessException("editarTotnaofiscalEmpresaController.MSG.erroTipoTotalizador");
		}
		
		if ( (entidad.getFiscaltotnaofiscalId() != null) && (item != null) && (!item.getFiscaltotnaofiscalId().equals(entidad.getFiscaltotnaofiscalId())) ){
			throw new BusinessException("editarTotnaofiscalEmpresaController.MSG.erroTipoTotalizador");
		}
		if (entidad.getFiscaltotnaofiscalId() == null){
			return fiscalImpressoraDAO.suscribirTotnaofiscalEmpresa(entidad);
		}else{
			return fiscalImpressoraDAO.actualizarTotnaofiscalEmpresa(entidad);
		}
	}

	@Override
	public List<FiscalFormapagoEmpresa> obtenerTodosFormapagoEmpresa() {		
		return fiscalImpressoraDAO.obtenerTodosFormapagoEmpresa();
	}

	@Override
	public FiscalFormapagoEmpresa obtenerIDFormapagoEmpresa(Long id) {
		return fiscalImpressoraDAO.obtenerIDFormapagoEmpresa(id);
	}

	@Override
	@Transactional(rollbackFor=BusinessException.class)
	public FiscalFormapagoEmpresa suscribirActualizarFormapagoEmpresa(FiscalFormapagoEmpresa entidad) throws BusinessException {
		
		FiscalFormapagoEmpresa item = null;
		
		if (!TipoFormaPagamento.CUSTOM.toString().equals(entidad.getTipoformapago())){
			item = fiscalImpressoraDAO.buscarFormaPago(entidad.getEmpresa(), entidad.getTipoformapago());
		}else{
			
			//para o tipo CUSTOM, é necessário informar a forma de pagammetno. Se NÃO dá problema no sco de vendas
			if (entidad.getFormaPago() == null){
				throw new BusinessException("editarFormapagoEmpresaController.MSG.formaPagoObligatoria");
			}
			
			item = fiscalImpressoraDAO.buscarFormaPago(entidad.getEmpresa(), entidad.getTipoformapago(),entidad.getDescricao());
		}
		
		if ( (entidad.getFiscalformapagoempresaId() == null) && (item != null) ){
			throw new BusinessException("editarFormapagoEmpresaController.MSG.erroTipoFormaPago");
		}
		
		if ( (entidad.getFiscalformapagoempresaId() != null) && (item != null) && (!item.getFiscalformapagoempresaId().equals(entidad.getFiscalformapagoempresaId())) ){
			throw new BusinessException("editarFormapagoEmpresaController.MSG.erroTipoFormaPago");
		}
		
		entidad.setActivo(true);
		entidad.setFecmodif(Calendar.getInstance().getTime());
		entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		if (entidad.getFiscalformapagoempresaId() == null){
			return fiscalImpressoraDAO.suscribirFormapagoEmpresa(entidad);
		}else{
			return fiscalImpressoraDAO.actualizacionFormapagoEmpresa(entidad);
		}
	}

	@Override
	@Transactional(rollbackFor=BusinessException.class)
	public FiscalFormapagoEmpresa borrarFormapagoEmpresa(FiscalFormapagoEmpresa entidad) {
		entidad.setActivo(false);
		entidad.setFecmodif(Calendar.getInstance().getTime());
		entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		
		return fiscalImpressoraDAO.actualizacionFormapagoEmpresa(entidad);
	}

	@Override
	public List<FiscalRelgerencialEmpresa> obtenerTodosRelgerencialEmpresa() {
		return fiscalImpressoraDAO.obtenerTodosRelgerencialEmpresa();
	}

	@Override
	public FiscalRelgerencialEmpresa obtenerIDRelgerencialEmpresa(Long id) {		
		return fiscalImpressoraDAO.obtenerIDRelgerencialEmpresa(id);
	}

	@Override
	@Transactional
	public FiscalRelgerencialEmpresa suscribirRelgerencialEmpresa(FiscalRelgerencialEmpresa entidad) {
		return fiscalImpressoraDAO.suscribirRelgerencialEmpresa(entidad);
	}

	
	@Override
	@Transactional(rollbackFor=BusinessException.class)
	public FiscalRelgerencialEmpresa suscribirActualizarRelgerencialEmpresa(FiscalRelgerencialEmpresa entidad) throws BusinessException {
		
		FiscalRelgerencialEmpresa item = null;
		
		item = fiscalImpressoraDAO.buscarRelGerencial(entidad.getEmpresa(), entidad.getTiporelgerencial());
		
		if ( (entidad.getFiscalrelgerencialId() == null) && (item != null) ){
			throw new BusinessException("editarRelgerencialEmpresaController.MSG.erroTipoRelgerencial");
		}
		
		if ( (entidad.getFiscalrelgerencialId() != null) && (item != null) && (!item.getFiscalrelgerencialId().equals(entidad.getFiscalrelgerencialId())) ){
			throw new BusinessException("editarRelgerencialEmpresaController.MSG.erroTipoRelgerencial");
		}
		
		entidad.setActivo(true);
		entidad.setFecmodif(Calendar.getInstance().getTime());
		entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		if (entidad.getFiscalrelgerencialId() == null){
			return fiscalImpressoraDAO.suscribirRelgerencialEmpresa(entidad);
		}else{
			return fiscalImpressoraDAO.actualizacionRelgerencialEmpresa(entidad);
		}
	}
	
	
	@Override
	@Transactional
	public FiscalRelgerencialEmpresa actualizacionRelgerencialEmpresa(FiscalRelgerencialEmpresa entidad) {
		return fiscalImpressoraDAO.actualizacionRelgerencialEmpresa(entidad);
	}	
}
