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.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.zkoss.lang.Strings;
import org.zkoss.util.resource.Labels;

import com.rjconsultores.ventaboletos.dao.VoucherDAO;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Transportadora;
import com.rjconsultores.ventaboletos.entidad.Voucher;
import com.rjconsultores.ventaboletos.enums.SituacaoVoucher;
import com.rjconsultores.ventaboletos.service.VoucherService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.vo.configuracioneccomerciales.VoucherVO;

@Service("voucherService")
public class VoucherServiceImpl implements VoucherService {

    @Autowired
    private VoucherDAO voucherDAO;

    public List<Voucher> obtenerTodos() {
        return voucherDAO.obtenerTodos();
    }

    public Voucher obtenerID(Long id) {
        return voucherDAO.obtenerID(id);
    }

    @Transactional
    public Voucher suscribir(Voucher entidad) {
    	entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
        entidad.setFecModif(Calendar.getInstance().getTime());
        entidad.setActivo(Boolean.TRUE);
    	
        return voucherDAO.suscribir(entidad);
    }

    @Transactional
    public Voucher actualizacion(Voucher entidad) {
    	entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
        entidad.setFecModif(Calendar.getInstance().getTime());
        return voucherDAO.actualizacion(entidad);
    }

    @Transactional
    public void borrar(Voucher entidad) {
    	entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
        entidad.setFecModif(Calendar.getInstance().getTime());
        entidad.setActivo(Boolean.FALSE);
        
        voucherDAO.actualizacion(entidad);
    }

	@Override
	public List<Voucher> buscarConsulta(Long voucherId, 
										String numContrato, 
										String nit, 
										String nomeTransportadora,										
										Date dataInicial, 
										Date dataFinal, 
										Integer origemId, 
										Integer destinoId) {
		return voucherDAO.buscarConsulta(voucherId, 
											numContrato, 
											nit, 
											nomeTransportadora,										
											dataInicial, 
											dataFinal, 
											origemId, 
											destinoId);
	}
	
	@Override
	public List<Voucher> buscarListaVoucher(Long numInicial, 
											Long numFinal, 
											String numContrato, 
											Long transportadora,
											Long grupoContratoId,
											Integer status, 
											Integer origem, 
											Integer destino) {
		return voucherDAO.buscarListaVoucher(numInicial, 
											 	 numFinal, 
											 	 numContrato, 
											 	 transportadora,
											 	 grupoContratoId,
											 	 status, 
											 	 origem, 
											 	 destino);
	}

	@Override
	@Transactional
	public List<VoucherVO> legalizar(Long numInicial, 
									 Long numFinal, 
									 String numContrato, 
									 Transportadora transportadora,
									 BigDecimal valor,
									 Parada origem, 
									 Parada destino) {
		List<Voucher> dados = voucherDAO.buscarListaVoucher(numInicial,
															   numFinal,
															   null,
															   null,
															   null,
															   null,
															   null,
															   null);
		
		List<VoucherVO> retorno = new ArrayList<VoucherVO>();
		for (Voucher vou : dados) {
			VoucherVO vo;
			
			if( !vou.getContrato().getNumContrato().equals(numContrato)) {
				vo = VoucherVO.converteVoucher(vou);
				vo.setMensagem(Labels.getLabel("legalizacaoMassivaController.MSG.contratoDiferente"));
				retorno.add(vo);
				continue;
			}
			
			if( !vou.getStatus().equals(SituacaoVoucher.EMITIDO.getValor())) {
				vo = VoucherVO.converteVoucher(vou);
				vo.setMensagem(Labels.getLabel("legalizacaoMassivaController.MSG.statusDiferente"));
				retorno.add(vo);
				continue;
			}
			
			if( origem != null && !vou.getOrigenId().equals(origem.getParadaId())) {
				vo = VoucherVO.converteVoucher(vou);
				vo.setMensagem(Labels.getLabel("legalizacaoMassivaController.MSG.origemDiferente"));
				retorno.add(vo);
				continue;
			}
			
			if( destino != null && !vou.getDestinoId().equals(destino.getParadaId())) {
				vo = VoucherVO.converteVoucher(vou);
				vo.setMensagem(Labels.getLabel("legalizacaoMassivaController.MSG.destinoDiferente"));
				retorno.add(vo);
				continue;
			}
			
			try {
				vou.setValorLegalizado(valor);
				vou.setTransportadora(transportadora);
				vou.setStatus(SituacaoVoucher.LEGALIZADO.getValor());
				vou.setDataLegaliza(Calendar.getInstance().getTime());

				vou = voucherDAO.actualizacion(vou);
				vo = VoucherVO.converteVoucher(vou);
				vo.setMensagem(Labels.getLabel("label.sucesso"));
			}catch (Exception e) {
				vo = VoucherVO.converteVoucher(vou);
				vo.setMensagem(e.getMessage());
			}
			
			retorno.add(vo);
		}
		
		return retorno;
	}

	@Override
	@Transactional
	public List<Voucher> faturar(List<Voucher> lista, Long numFatura, Date datCorte) {
		for (Voucher vou : lista) {
			if( Strings.isBlank(vou.getNumFatura()) ) {
				if(numFatura != null) {
					vou.setNumFatura(numFatura.toString());
				}else {
					continue;
				}
			}
			
			if( vou.getDataCorte() == null ) {
				if(datCorte != null) {
					vou.setDataCorte(datCorte);
				}else {
					continue;
				}
			}
			
			vou.setStatus(SituacaoVoucher.FATURADO.getValor());
			vou.setDataFatura(Calendar.getInstance().getTime());
			voucherDAO.actualizacion(vou);
		}

		return lista;
	}
}
