package com.rjconsultores.ventaboletos.service;

import java.util.List;

import com.rjconsultores.ventaboletos.constantes.TipoSeguro;
import com.rjconsultores.ventaboletos.dao.TarifaOficialDAO;
import com.rjconsultores.ventaboletos.entidad.CasetaPeaje;
import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Marca;
import com.rjconsultores.ventaboletos.entidad.Moneda;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.entidad.TarifaOficial;
import com.rjconsultores.ventaboletos.entidad.VigenciaTarifa;
import com.rjconsultores.ventaboletos.exception.BusinessException;


public interface TarifaOficialService {

	/**
	 * Gera as tarifas de acordo o cálculo do coeficiente tarifário.<br/>
	 * 
	 * Fórmula: (KM * Coeficiente Tarifário)
	 * 
	 * Se o parametro ruta não for informado, será gerado tarifas para todas as
	 * rutas. <br/>
	 * 
	 * Se o parametro orgaoConcedenteId não for informado, será gerado tarifas para todos os
	 * órgãos. <br/>
	 * 
	 * Obs.: Essa operação apenas gera tarifas que ainda não estão geradas<br/>
	 * 
	 * @param rutaId
	 * @param orgaoConcedenteId 
	 * @return A quantidade de registros afetadas
	 */
	public Integer gerarTarifaPorCoeficiente(Integer rutaId, OrgaoConcedente orgaoConcedente, List<Integer> idsEmpresas,Integer[] lsCasetaPeaje);

	
	/**
	 * Atualiza as tarifas de acordo o cálculo do coeficiente tarifário.<br/>
	 * 
	 * Fórmula: (KM * Coeficiente Tarifário)
	 * 
	 * Se o parametro ruta não for informado, será atualizado as tarifas para
	 * todas as rutas.<br/>
	 * 
	 * 
	 * Se o parametro orgaoConcedenteId não for informado, será atualizado as tarifas para
	 * todos as órgãos.<br/>
	 * 
	 * @param rutaId
	 * @param orgaoConcedenteId
	 * @return - Quantidade de tarifas atualizadas
	 */
	public Integer atualizarTarifaPorCoeficiente(Integer rutaId, OrgaoConcedente orgaoConcedente);

	
	/**
	 * Gera o calculo de preço utilizando calculo por coeficiente ou pela kilometragem da ARTESP 
	 * 
	 *  
	 * @param rudaId
	 * @param orgaoConcedenteId
	 * @param empresaId
	 * @throws BusinessException
	 */
	public void gerarAtualizarTarifa(List<Ruta> lsRuta, OrgaoConcedente orgaoConcedenteId, List<Empresa> lsEmpresaSelected, Integer[] lsCasetaPeaje) throws BusinessException;

	/**
	 * Copia a tarifa oficial para a tabela de tarifa de acordo com a vigencia especificada.<br/>
	 * 
	 * Se a tarifa não existe, ela é inserida. Se existe, a tarifa e os componentes do preços são atualizados<br/>
	 * 
	 * @param vigenciaTarifa
	 */
	public void copiarParaTarifa(VigenciaTarifa vigenciaTarifa,  Boolean calculaPegagio, Boolean calculaTarifa, Boolean calculaTaxaEmbarque, Boolean calculaSeguro, Boolean calculaTPP, Boolean calculaEmbarcada, Empresa empresa, OrgaoConcedente orgaoConcedente);
	
	/**
	 * Atualiza a taxa de embarque da entidade TarifaOficial.<br/>
	 * 
	 * Para o cálculo, é usado a seguinte lógica:<br/>
	 * 		- Atualiza de acordo a tabela TAXA_EMBARQUE_PARADA por kilometragem<br/> 
	 * 		- Atualiza de acordo a tabela TAXA_EMBARQUE por kilometragem<br/>
	 * 		- Atualiza de acordo a tabela TAXA_EMBARQUE_PARADA por valor fixo<br/>
	 * 
	 * A sequencia acima indica a ordem de atualização da taxa de embarque.<br/>
	 * 
	 * A taxa de embarque mais restritiva fica por último (TAXA_EMBARQUE_PARADA por valor fixo)
	 * 
	 * @param rutaId - Se informado, será atualizado apenas a taxa de embarque da ruta informada
	 * @param orgaoConcedenteId - Se informado, será atualizado apenas a taxa de embarque do órgão informado
	 * @param gerarTabelaZerada - Indica se uma tabela zerada será gerada. Isso para a possibilidade de gerar apenas a taxa de embarque sem preço
	 * @param empresaId - Empresa para ser filtrada
	 * @throws BusinessException 
	 */
	public void atualizarTaxaEmbarque(List<Ruta> lsRuta, Integer orgaoConcedenteId,boolean gerarTabelaZerada, List<Empresa> lsEmpresaSelected, List<Integer> lsParadaIds) throws BusinessException;
	
	/**
	 * Atualiza o seguro de acordo a kilometragem do trecho
	 * 
	 * @param rutaId - Se informado, será filtrado pela ruta
	 * @param orgaoId -Se informado, será filtrado pelo orgão
	 */
	public void atualizarSeguroPorKm(Integer rutaId,Integer orgaoId, TipoSeguro tipoSeguro) throws BusinessException;
	
	/**
	 * Atualiza o seguro de acordo o valor da tarifa
	 * 
	 * @param rutaId - Se informado, será filtrado pela ruta
	 * @param orgaoId -Se informado, será filtrado pelo orgão
	 * 
	 */
	public void atualizarSeguroPorTarifa(Integer rutaId, Integer orgaoId) throws BusinessException;
	
	
	/**
	 * Executa tanto o {@link #atualizarSeguroPorKm(Integer, Integer)} quanto {@link #atualizarSeguroPorTarifa(Integer, Integer)}
	 * 
	 * @param rutaId- Se informado, será filtrado pela ruta
	 * @param orgaoId-Se informado, será filtrado pelo orgão
	 * @throws BusinessException 
	 */
	public void atualizarSeguro(List<Ruta> lsRuta, Integer orgaoId, TipoSeguro tipoSeguro) throws BusinessException;
	
	/**
	 * See {@link TarifaOficialDAO#aplicarArredondamentoTarifa(Integer, Integer)}
	 * @param orgaoConcedenteId -Se informado, será filtrado pelo orgão
	 */
	public void aplicarArredondamentoTarifa(Integer orgaoConcedenteId, Boolean taxaEmbarque);

	public void actualizacion(TarifaOficial tarifaOficial);

	public TarifaOficial obtenerID(Integer tarifaOficialId);

	public void borrar(TarifaOficial tarifaOficial);	
	
	public void gerarAtualizarTabelaZerada(List<Ruta> lsRuta, Integer orgaoConcedenteId, List<Empresa> lsEmpresaSelected,List<Integer> lsParadaId) throws BusinessException ;
	
	public void atualizarPedagio();
	
	public void atualizarSeguroPorKmTPP(Integer rutaId, Integer orgaoId, TipoSeguro tipoSeguro) throws BusinessException;
	
	public void atualizarSeguroTPP(List<Ruta> lsRuta, Integer orgaoId, TipoSeguro tipoSeguro) throws BusinessException;
	
	public long obtenerCount(List<Empresa> lsEmpresaSelected);
	
	public List<TarifaOficial> obterTarifaOficialPorFiltro(Moneda moneda, Marca marca,List<Marca> lsMarcas,Parada origem, Parada destino, ClaseServicio claseServicio, Ruta ruta, String numRuta, Boolean vende);
	
	public void atualizarPedagioPorListaDePracaDePagio(List<CasetaPeaje> lsCasetaPeaje,Integer empresaId);
	
}

