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

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.CorridaTramo;
import com.rjconsultores.ventaboletos.entidad.DiagramaAutobus;
import com.rjconsultores.ventaboletos.entidad.EsquemaCorrida;
import com.rjconsultores.ventaboletos.entidad.Estado;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.entidad.Corrida.Id;
import com.rjconsultores.ventaboletos.exception.BusinessException;

/**
 * 
 * @author rodrigo
 */
public interface CorridaService extends GenericService<Corrida, Corrida.Id> {

	/**
	 * Genera las corridas de acuerdo con el parametro de cant dias.
	 * 
	 * 
	 * @return - Si fue generado exitosamente o no
	 */
	public boolean generarCorridaAutomatica();

	public List<Corrida> buscarPorAutobusCorridasFuturas(DiagramaAutobus diagramaAutobus);

	public List<Corrida> buscarPorRolOperativoCorridasFuturas(DiagramaAutobus diagramaAutobus);

	public List<Corrida> buscarPorFecCorrida(Date value);

	public List<Corrida> verificarCorridaId(Integer corridaId);

	public List<Corrida> buscarPorId(Integer idCorrida);

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

	/**
	 * Regresa la fecha final para el período de generacion automatica de corridas.
	 * 
	 * 
	 * @return
	 */
	public Date calcularDataFinalGeneracionCorrida();

	public List<Corrida> buscarDistinct(Parada ori, Parada des, Date horaSalidaInicio, Date horaSalidaFin, ClaseServicio cs, Integer corridaId);

	/**
	 * Gera corrida a partir dos servicos selecionados e no intervalo de dias informados. <br/>
	 * 
	 * @param lsEsquemaCorrida
	 * @param dataDe
	 * @param dataAte
	 * @return A quantidade de corridas geradas
	 * @throws BusinessException
	 */
	public Long generarCorridasSelecionadas(List<EsquemaCorrida> lsEsquemaCorrida, Date dataDe, Date dataAte) throws BusinessException;

	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 Boolean atualizarCorridaFecHusoFecVerano(Estado estado, Date dataInicial);

	Boolean atualizarCorridaFecHusoFecVerano(Estado estado, Date dataInicial, Integer corridaId);

	Boolean editarCorridaPorOutraCorrida(Estado estado, Date dataInicial, Integer corridaId, Date dataPadrao);

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

	public Corrida buscaCorrridaFutura(Ruta ruta, Date fecInicio);

	public Boolean existeCorrida(Long id);

	public Integer buscarOcupacaoCorrida(Corrida corrida);
	
	public Boolean generarCorrida(Date dataGeracao, List<EsquemaCorrida> lsEsquemaCorrida, boolean isGeracaoAutomaticaCorrida, List<CorridaTramo> corridaTramoList, boolean isValidaActivo);
	
	public Corrida buscarPorId(Corrida.Id id);
	
	public Corrida buscarCorridaAtivaPorId(Id id);
}
