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

import java.util.Date;
import java.util.List;

import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.EsquemaCorrida;
import com.rjconsultores.ventaboletos.entidad.EsquemaOperacional;
import com.rjconsultores.ventaboletos.entidad.Marca;
import com.rjconsultores.ventaboletos.entidad.RolOperativo;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.entidad.Tramo;
import com.rjconsultores.ventaboletos.exception.BusinessException;

/**
 * 
 * @author Rafius
 */
public interface EsquemaCorridaDAO extends GenericDAO<EsquemaCorrida, Integer> {

	public List<EsquemaCorrida> buscarPorEsquemaOperacional(EsquemaOperacional eo);

	public List<EsquemaCorrida> buscarPorEmpresaCorrida(Empresa empresa);

	public List<EsquemaCorrida> buscar(Marca marca, RolOperativo rolOperativo, Ruta ruta, ClaseServicio claseServicio);

	public boolean buscarNumCorrida(Integer numCorrida, Integer numCorridaPisoExtra, boolean isDoublePiso);

	public EsquemaCorrida buscaEsquemaPorRuta(Ruta ruta);
	
	EsquemaCorrida buscaEsquemaPorRutaSemVigencia(Integer rutaId, Integer numCorrida);
	
	public List<EsquemaCorrida> buscarPorRuta(Ruta ruta);

	/**
	 * Indica se el esquema corrida es hijo de un esquemCorrida.
	 * 
	 * @param esquemaCorrida
	 * @return
	 */
	public boolean esHijoRebote(EsquemaCorrida esquemaCorrida);

	/**
	 * Busca los esquema corrida que tiene esquema operacional en la fecha indicada
	 * 
	 * @param dataGeracao
	 * @return
	 */
	public List<EsquemaCorrida> buscaDentroVigencia(Date dataGeracao);

	public boolean buscarEsquemaCorridaExisteTramo(Tramo tramo);

	/**
	 * Indica cul son los Id's de EsquemaCorrida que tienen la paradaId en su secuencia
	 * 
	 * @param ruta
	 * @param paradaId
	 * @return - El Id de EsquemaCorrida
	 */
	public List<Integer> existe(Ruta ruta, Integer paradaId);

	public EsquemaCorrida obtenerByEsquemaCorrida(Integer numCorrida);

	public List<EsquemaCorrida> buscaDentroVigenciaQtdeDiasNull(Date dataGeracao);

	public List<EsquemaCorrida> buscaDentroVigenciaQtdeDiasNotNull(Date dataDe);

	/**
	 * Indica se o esquema é o indicado como segundo piso nas configuações de doble piso
	 * 
	 * @param esquemaCorrida
	 * @return
	 */
	public boolean esSegundoPiso(EsquemaCorrida esquemaCorrida);

	EsquemaCorrida buscarPeloNumCorrida(Integer numCorrida);

	public Integer atualizaServicoIntegracaoTotvs(Marca marca, Integer corridaId) throws BusinessException;

	/**
	 * Buscar corrida primeiro piso, a partir do segundo
	 * 
	 * @param esquemaCorrida
	 * @return
	 */
	public EsquemaCorrida buscarPrimeiroPisoPeloSegundo(EsquemaCorrida esquemaCorrida);

	/**
	 * Indica se o esquema é o indicado como terceiro piso nas configuações de doble piso
	 * 
	 * @param esquemaCorrida
	 * @return
	 */
	public boolean esTerceiroPiso(EsquemaCorrida esquemaCorrida);
	
	/**
	 * Buscar corrida primeiro piso, a partir do terceiro
	 * 
	 * @param esquemaCorrida
	 * @return
	 */
	public EsquemaCorrida buscarPrimeiroPisoPeloTerceiro(EsquemaCorrida esquemaCorrida);

	/**
	 * Buscar corrida, a partir do HijoRebote
	 * 
	 * @param esquemaCorrida
	 * @return
	 */
	public EsquemaCorrida buscarEsquemaPeloHijoRebote(EsquemaCorrida esquemaCorrida);

	public List<EsquemaCorrida> buscarPorEmpresaCorridaAtiva(Empresa empresa, Date dataGeracaoInicial, Date dataGeracaoFinal);

}
