/*
 * 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.Corrida;
import com.rjconsultores.ventaboletos.entidad.Corrida.Id;
import com.rjconsultores.ventaboletos.entidad.DiagramaAutobus;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Estado;
import com.rjconsultores.ventaboletos.entidad.Marca;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.vo.corrida.CorridaVO;

/**
 * 
 * @author rodrigo
 */
public interface CorridaDAO extends GenericDAO<Corrida, Corrida.Id> {

	/**
	 * Indica si existe una corrida de acuerdo el id
	 * 
	 * No lleva en consideracion el campo activo
	 * 
	 * @param id
	 * @param dataGeracao
	 * @return
	 */
	public Boolean existe(Id id);
	
	public Boolean existeActivo(Id id);

	public List<Corrida> buscarPorAutobusCorridasFuturas(DiagramaAutobus diagramaAutobus);

	public List<Corrida> buscarPorRolOperativoCorridasFuturas(DiagramaAutobus diagramaAutobus);

	public List<Corrida> buscarPorFecCorrida(Date value);

	public Corrida buscarPorId(Id id);

	public Long count(Ruta ruta);

	public List<Corrida> verificarCorridaId(Integer corridaId);

	public List<Corrida> buscarPorId(Integer idCorrida);

	public List<Corrida> buscarFiltro(Parada ori, Parada des, Date hora, ClaseServicio cs);

	/**
	 * Hace la busqueda de corridas con distinct para: origen, destino, claseServicio,hora
	 * 
	 * @param ori
	 * @param des
	 * @param horaSalidaInicio
	 * @param horaSalidaFin
	 * @param cs
	 * @param corridaId
	 * @return
	 */
	public List<Corrida> buscarDistinct(Parada ori, Parada des, Date horaSalidaInicio,
			Date horaSalidaFin, ClaseServicio cs, Integer corridaId);

	public boolean existe(Ruta ruta, Date dataGeracao, Date horario, ClaseServicio claseServicio,
			Marca marca, boolean pisoExtra);

	public boolean count(Parada origem, Parada destino, Date feccorrida, ClaseServicio claseServicio,
			boolean pisoExtra);

	/**
	 * Regresa la cantidad de corridas que fue generada hoy.
	 * 
	 * @return
	 */
	public Long cantCorridaGeneradasHoy();

	public List<Corrida> buscarGroupCorrridaId(Integer corridaId, Date dateInicio, Date dateFin);

	public List<Corrida> buscarGroupCorrridaId(Integer corridaId, Integer origem, Integer destino,
			Integer ruta, Integer numRuta, Date dateInicio, Date dateFin);

	public void actualizaFecHusoFecVerano(Corrida corrida);

	public void actualizaFecHusoFecVerano(List<Corrida> corridas);

	Boolean editarCorridaPorOutraCorrida(List<Corrida> corridas, Corrida corrida);

	public List<Corrida> buscarPorEstado(Estado estado, Date dataInicial);

	List<Corrida> buscarPorEstado(Estado estado, Date dataInicial, Integer corridaId);

	public Corrida buscaCorrridaFutura(Ruta ruta, Date fecInicio);

	List<Corrida> buscarCorridaRelAproveitamento(Parada origem, Parada destino, Date feccorrida, Integer corridaId);

	public Boolean existeCorrida(Long id);

	public Integer atualizaCorridasIntegracaoTotvs(Marca marca, Date dataIncial, Date dataFinal, Integer corridaId) throws BusinessException;

	public List<CorridaVO> buscarListaPorIds(List<Id> corridaIds);

	public CorridaVO buscarVOPorId(Id corridaId);

	public Integer buscarOcupacaoCorrida(Corrida corrida);
	
	public List<Corrida> buscarCorridas(Parada ori, Parada des, Date dataInicio, Date dataFinal, ClaseServicio cs,
			Ruta linha, Empresa empresa);
	
	public Corrida buscarCorridaAtivaPorId(Id id);
}