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.DetAbastoBoletoDAO;
import com.rjconsultores.ventaboletos.entidad.AbastoBoleto;
import com.rjconsultores.ventaboletos.entidad.Aidf;
import com.rjconsultores.ventaboletos.entidad.DetAbastoBoleto;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Estacion;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.service.DetAbastoBoletoService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;

@Service("detAbastoBoletoService")
public class DetAbastoBoletoServiceImpl implements DetAbastoBoletoService {

	@Autowired
	private DetAbastoBoletoDAO detAbastoBoletoDAO;

	@Override
	public List<DetAbastoBoleto> obtenerTodos() {
		return detAbastoBoletoDAO.obtenerTodos();
	}

	@Override
	public DetAbastoBoleto obtenerID(Integer id) {
		return detAbastoBoletoDAO.obtenerID(id);
	}

	@Transactional
	public DetAbastoBoleto suscribir(DetAbastoBoleto entidad) {
		entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		entidad.setFecmodif(Calendar.getInstance().getTime());
		entidad.setActivo(Boolean.TRUE);

		return detAbastoBoletoDAO.suscribir(entidad);
	}

	@Transactional
	public DetAbastoBoleto actualizacion(DetAbastoBoleto entidad) {
		entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		entidad.setFecmodif(Calendar.getInstance().getTime());
		entidad.setActivo(Boolean.TRUE);

		return detAbastoBoletoDAO.actualizacion(entidad);
	}

	@Transactional
	public void borrar(DetAbastoBoleto entidad) {
		entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		entidad.setFecmodif(Calendar.getInstance().getTime());
		entidad.setActivo(Boolean.FALSE);

		detAbastoBoletoDAO.actualizacion(entidad);
	}

	@Override
	public Long getSecuencia() {
		return detAbastoBoletoDAO.getSecuencia();
	}

	@Override
	public void desabilitaDetAbastos(Estacion origem, String numfolioinicial, String numfoliofinal, String numseriepreimpresa) {

		List<DetAbastoBoleto> detAbastoBoletos = detAbastoBoletoDAO.buscaDetAbastoBoletos(origem, numfolioinicial, numfoliofinal, numseriepreimpresa);

		if (!detAbastoBoletos.isEmpty()) {
			detAbastoBoletoDAO.desativaDetAbastos(detAbastoBoletos);

			DetAbastoBoleto detAbastoBoletoInicial = detAbastoBoletos.get(0);
			detAbastoBoletoInicial.setNumfoliofinal(numfolioinicial);
			detAbastoBoletoInicial.setActivo(Boolean.TRUE);
			detAbastoBoletoDAO.actualizacion(detAbastoBoletoInicial);

			DetAbastoBoleto detAbastoBoletoFinal = detAbastoBoletos.get(detAbastoBoletos.size() - 1);
			detAbastoBoletoFinal.setNumfolioinicial(numfoliofinal);
			detAbastoBoletoFinal.setActivo(Boolean.TRUE);
			detAbastoBoletoDAO.actualizacion(detAbastoBoletoFinal);
		}
	}

	@Override
	public List<DetAbastoBoleto> buscabDetAbastoBoletoAutomatico(Estacion estacion, String numseriepreimpresa) {
		return detAbastoBoletoDAO.buscabDetAbastoBoletoAutomatico(estacion, numseriepreimpresa);
	}
	
	@Override
	public List<Object> buscabDetAbastoBoletoToVerifyIfAidfCanBeEditable(Aidf aidf) {
		return detAbastoBoletoDAO.buscabDetAbastoBoletoToVerifyIfAidfCanBeEditable(aidf);
	}

	@Override
	public DetAbastoBoleto movimentaDetAbasto(
			DetAbastoBoleto detAbasto,
			AbastoBoleto abasto,
			String folioInicial,
			String folioFinal) throws BusinessException {
		
		if( detAbasto == null ) {
			throw new BusinessException("movimentacionBilhetesController.MSG.origemNaoEncontrada");
		}
		
		try {
			DetAbastoBoleto novo = new DetAbastoBoleto();
			
			novo.setAidf(detAbasto.getAidf());
			novo.setIndinutiliza(detAbasto.getIndinutiliza());
			novo.setNummovimiento(detAbasto.getNummovimiento());
			novo.setNumseriepreimpresa(detAbasto.getNumseriepreimpresa());
			novo.setStatusenvio(detAbasto.getStatusenvio());
			novo.setStatusfirma(detAbasto.getStatusfirma());
			novo.setStatusoperacion(detAbasto.getStatusoperacion());			
			novo.setAbastoBoleto(abasto);
			novo.setNumfolioinicial(folioInicial);
			novo.setNumfoliofinal(folioFinal);
			return novo;
		}catch (Exception e) {
			throw new BusinessException(e.getMessage());
		}
		
	}

	@Override
	public DetAbastoBoleto buscarPorAidf(Long aidfId, Integer puntoVenta, String folioInicial, String folioFinal) {
		return detAbastoBoletoDAO.buscarPorAidf(aidfId, puntoVenta, folioInicial, folioFinal);
	}
	
	@Override
	public List<Aidf> buscarAidfsPorEmpresaAgencia(Empresa empresa, PuntoVenta origem) {
		return detAbastoBoletoDAO.buscarAidfsPorEmpresaAgencia(empresa, origem);
	}


}
