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.ConexionRutaTramoCtrlDAO;
import com.rjconsultores.ventaboletos.entidad.ConexionRutaCtrl;
import com.rjconsultores.ventaboletos.entidad.ConexionRutaTramoCtrl;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.service.ConexionRutaTramoCtrlService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;

/**
 * @author valdevir.silva
 *
 */
@Service("conexionRutaTramoCtrlService")
public class ConexionRutaTramoCtrlServiceImpl implements ConexionRutaTramoCtrlService {

	private static final char EIXO_C = 'C';
	private static final char EIXO_B = 'B';
	private static final char EIXO_A = 'A';
	@Autowired
	private ConexionRutaTramoCtrlDAO conexionRutaTramoCtrlDAO;
	
	@Override
	@Transactional
	public ConexionRutaTramoCtrl suscribir(ConexionRutaTramoCtrl conexionRutaTramoCtrl) {
		
		conexionRutaTramoCtrl.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		conexionRutaTramoCtrl.setFecmodif(Calendar.getInstance().getTime());
		conexionRutaTramoCtrl.setActivo(Boolean.TRUE);
		
		return conexionRutaTramoCtrlDAO.suscribir(conexionRutaTramoCtrl);
	}

	@Override
	public ConexionRutaTramoCtrl actualizacion(ConexionRutaTramoCtrl conexion) {
		// TODO Auto-generated method stub
		return null;
	}

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

		conexionRutaTramoCtrlDAO.actualizacion(conexionRutaTramoCtrl);

	}

	@Override
	public List<ConexionRutaTramoCtrl> buscarPorConexionRutaCtrl(ConexionRutaCtrl conexionRutaCtrl, Integer rutaId) {
		return conexionRutaTramoCtrlDAO.buscarPorConexionRutaCtrl(conexionRutaCtrl, rutaId);
	}

	@Transactional
	@Override
	public void borrar(List<ConexionRutaTramoCtrl> lsConexionRutaTramoCtrl) {
		for (ConexionRutaTramoCtrl conexion : lsConexionRutaTramoCtrl) {
			borrar(conexion);
		}
	}

	@Override
	@Transactional
	public void suscribirTodos(List<ConexionRutaTramoCtrl> lsConexionRutaTramoCtrl) {
		for (ConexionRutaTramoCtrl conexion : lsConexionRutaTramoCtrl) {
			suscribir(conexion);
		}
	}

	@Override
	public ConexionRutaTramoCtrl buscarPorId(Long conexionRutaTramoId) {
		return conexionRutaTramoCtrlDAO.obtenerID(conexionRutaTramoId);
	}

	@Override
	public boolean validarConexioneRutasExistentes(Integer rutaOrigenId, Integer rutaDestinoId, Integer rutaDestinoCId, Integer paradaOrigenId, Integer paradaDestinoId, Integer origemTrechoId, Integer destinoTrechoId) {
		return conexionRutaTramoCtrlDAO.validarConexioneRutasExistentes(rutaOrigenId, rutaDestinoId, rutaDestinoCId,  paradaOrigenId, paradaDestinoId, origemTrechoId, destinoTrechoId);
	}

	/**
	 *Busca localidades cadastradas para Eixo A
	 */
	@Override
	public List<Parada> buscarLocalidadesEixoA(Integer conexionRutaConfId) {
		return validaAgrupamentoLocalidade(conexionRutaTramoCtrlDAO.buscarLocalidadesPorConexionRutaConfAndEixo(conexionRutaConfId, EIXO_A));
		
	}
	
	public List<Parada> validaAgrupamentoLocalidade(List<Parada> localidadesList){
		for (Parada parada : localidadesList) {
			if(parada.getAgrupamentoParada()!=null) {
				parada.setDescparada(parada.getAgrupamentoParada().getDescAgrupamentoParada());
				parada.setCveparada(parada.getAgrupamentoParada().getCveAgrupamentoParada());
			}
		}
		 return localidadesList;
	}

	
	/**
	 *Busca localidades castradas para Eixo B
	 */
	@Override
	public List<Parada> buscarLocalidadeEixoB(Integer conexionRutaConfId) {
		return validaAgrupamentoLocalidade(conexionRutaTramoCtrlDAO.buscarLocalidadesPorConexionRutaConfAndEixo(conexionRutaConfId, EIXO_B));
	}

	/**
	 *Busca localidades cadastradas para Eixo C
	 */
	@Override
	public List<Parada> buscarLocalidadesEixoC(Integer conexionRutaConfId) {
		return validaAgrupamentoLocalidade(conexionRutaTramoCtrlDAO.buscarLocalidadesPorConexionRutaConfAndEixo(conexionRutaConfId, EIXO_C));
	}

	@Override
	public List<Parada> buscarTodasLocalidadesOrigem(Integer conexionRutaConfId) {
		return conexionRutaTramoCtrlDAO.buscarTodasLocalidadesOrigem(conexionRutaConfId);
	}

	@Override
	public List<Parada> buscarTodasLocalidadesDestino(Integer conexionRutaConfId) {
		return conexionRutaTramoCtrlDAO.buscarTodasLocalidadesDestino(conexionRutaConfId);
	}

	@Override
	public List<Parada> buscarTodasLocalidadesDestinoC(Integer conexionRutaConfId) {
		return conexionRutaTramoCtrlDAO.buscarTodasLocalidadesDestinoC(conexionRutaConfId);
	}

}
