/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.rjconsultores.ventaboletos.service;

import java.util.List;

import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.ParadaSecuencia;
import com.rjconsultores.ventaboletos.entidad.ParadaSecuenciaCombinacaoLinha;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.utilerias.RegistroConDependenciaException;
import com.rjconsultores.ventaboletos.vo.ruta.RutaVO;

/**
 * 
 * @author Rafius
 */
public interface RutaService {

	/**
	 * Regresa el destino de la ruta
	 * 
	 * @param ruta
	 * @return
	 */
	public Parada getDestino(Ruta ruta);

	/**
	 * Regresa la origen de la ruta
	 * 
	 * @param ruta
	 * @return
	 */
	public Parada getOrigem(Ruta ruta);

	public List<Ruta> buscarPorClaseServicio(ClaseServicio claseServicio);
	
	public List<Ruta> buscarPorClaseServicioEmpresa(ClaseServicio claseServicio, Empresa empresa);

	public List<Ruta> buscar(String nomeRuta, ClaseServicio claseServicio, Boolean nomeObrigatorio);

	public List<Ruta> obtenerPorEmpresa(Empresa empresa);

	public List<Ruta> buscarTodosExceto(Integer... idRuta);

	public List<Ruta> buscarNumRuta(String numRuta);

	public void borrar(Ruta entidad) throws RegistroConDependenciaException;

	/**
	 * Verifica se la parada informadad existe en la ruta informada
	 * 
	 * @param parada
	 * @param ruta
	 * @return
	 */
	public boolean paradaExisteEnLaRuta(Parada parada, Ruta ruta);

	/**
	 * Hace la actualizacion de la ruta.
	 * 
	 * Si el parametro <code>lsParadasSequencia</code> no es null, quieres decir que hube cambio en la secuencia y la nueva secuencia es la que esta en <code>lsParadasSequencia</code>.<br/>
	 * 
	 * Si el parametro <code>lsParadasSequencia</code> es null, no va a cambiar ni la secuencia ni las combinaciones<br/>
	 * 
	 * @param ruta
	 * @param lsParadasSequencia
	 * @return
	 * @throws BusinessException
	 */
	public Ruta actualizacion(Ruta ruta, List<ParadaSecuencia> lsParadasSequencia) throws BusinessException;

	public List<Ruta> obtenerTodos();

	public Ruta obtenerID(Integer id);

	public Ruta suscribir(Ruta entidad, List<ParadaSecuencia> lsParadasSequencia) throws BusinessException;

	public void generarCombinacion(Ruta ruta) throws BusinessException;

	public List<RutaVO> buscaRutaPorNumeroSemDadoRepetido(String palavraPesquisaRuta);

	public List<RutaVO> buscaRutaParadas(Integer rotaId);
	
	public List<Ruta> buscaRuta(String palavraPesquisaRuta);
	
	public List<Ruta> buscaRuta(String palavraPesquisaRuta, OrgaoConcedente orgao);
	
	public List<Ruta> buscaRutasFromOrgao(OrgaoConcedente orgao);
	public List<Ruta> buscaSomenteRutasFromOrgao(OrgaoConcedente orgao);
	
	public List<Ruta> buscarTodosEstos(Integer[] idRutas);
	
	public List<Ruta> buscarRutasPorEmpresas(List<Empresa> lsEmp);
	
	public Integer getNumSecuenciaOrigen(Integer rutaId, Integer origenId);
	public Integer getNumSecuenciaDestino(Integer rutaId, Integer destinoId);
	
	/**
	 * método verifica na listagem de sequencias quais precisam ser geradas
	 * @author Eduardo Dicarte
	 * @param ruta Ruta Ruta
	 * @param lsParadasSequencia Sequencias
	 * @param sequenciasInformadas Novas sequencias que foram inseridas pelo usuário
	 * @return Retorna a coleção de sequencias que precisam ser geradas 
	 */
	public List<ParadaSecuenciaCombinacaoLinha> verificarSeqRutaNaoGerada(Ruta ruta, List<ParadaSecuencia> lsParadasSequencia);

	public List<Ruta> buscarRutasPorEmpresaOrgaoConcedente(Empresa empresa, OrgaoConcedente orgao);

	public boolean cambiarParadaRuta(Ruta ruta, Parada paradaAntiga, Parada nuevaParada, String descripcionParada) throws Exception;

	public Parada validaParada(String descripcionParada, Parada paradaAntiga) throws Exception;

	public List<Ruta> buscaLikeComboBox(String stringConsulta);
	
	public List<Ruta> buscarPorIds(Integer[] rutaIds);
	
	public List<Ruta> buscarPorOrgaoEcasetaPeaje(OrgaoConcedente orgao, Integer[] listCasetaPeaje);
	
	public List<Ruta> buscarRutasPorEmpresaOrgaoConcedenteParadaIds(Empresa empresa, OrgaoConcedente orgao, Integer[] lsParadaIds) ;
	
	public List<Ruta> buscarPorOrgaoEcasetaPeaje(OrgaoConcedente orgao, Integer[] listCasetaPeaje, Empresa empresa);
	
	public List<Ruta> buscarRutasPorEmpresaOrgaoConcedenteClaseServicio(Empresa empresa, OrgaoConcedente orgao, ClaseServicio claseServicio);

	
}
