package com.rjconsultores.ventaboletos.dao;

import java.math.BigDecimal;
import java.util.List;

import com.rjconsultores.ventaboletos.constantes.TipoSeguro;
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.service.TarifaOficialService;
import com.rjconsultores.ventaboletos.vo.comissao.TarifaOficialComComposicaoDoPedagioVo;
import com.rjconsultores.ventaboletos.vo.comissao.TarifaOficialVO;

public interface TarifaOficialDAO extends GenericDAO<TarifaOficial, Integer> {
	/**
	 * See {@link TarifaOficialService#gerarTarifaPorCoeficiente(Integer, Integer)}
	 * @param ruta
	 * @param usuarioId TODO
	 * @param orgaoConcedenteId TODO
	 * @return TODO
	 */
	public Integer gerarTarifaPorCoeficiente(Integer ruta, Integer usuarioId, OrgaoConcedente orgaoConcedente, List<Integer> idsEmpresas,Integer[] lsCasetaPeaje);

	public Integer gerarTarifaArtesp(Integer ruta, Integer usuarioId, Integer orgaoConcedenteId, List<Integer> idsEmpresas);

	public Integer gerarTabelaZerada(Integer ruta, Integer usuarioId, Integer orgaoConcedenteId, List<Integer> idsEmpresas,List<Integer>lsParadaId);

	/**
	 * See {@link TarifaOficialService#atualizarTarifaPorCoeficiente(Integer, Integer)}
	 * @param rutaId
	 * @param usuarioId TODO
	 * @param orgaoConcedenteId
	 * @return TODO
	 */
	public Integer atualizarTarifaCoeficiente(Integer rutaId, Integer usuarioId, OrgaoConcedente orgaoConcedenteId);

	/**
	 * See {@link TarifaOficialService#copiarParaTarifa(VigenciaTarifa)}
	 * @param vigenciaTarifa
	 * @param usuarioId TODO
	 * @param calculaPegagio Boolean
	 * @param calculaTarifa Boolean
	 * @param calculaTaxaEmbarque Boolean
	 * @param empresa Empresa
	 * @param orgaoConcedente OrgaoConcedente
	 */
	public void copiarParaTarifa(VigenciaTarifa vigenciaTarifa, Integer usuarioId, Boolean calculaPegagio, Boolean calculaTarifa, Boolean calculaTaxaEmbarque, Boolean calculaSeguro, Boolean calculaTPP, Boolean calculaEmbarcada, Empresa empresa, OrgaoConcedente orgaoConcedente);

	/**
	 * See {@link TarifaOficialService#atualizarTaxaEmbarque(Integer, Integer)}
	 * @param rutaId
	 * @param usuarioId TODO
	 * @param orgaoConcedenteId TODO
	 * @param empresaId TODO
	 */
	public void atualizarTaxaEmbarque(List<Ruta> lsRuta, Integer usuarioId, Integer orgaoConcedenteId, List<Integer> idsEmpresas,List<Integer> lsParadaIds);

	/**
	 * See {@link TarifaOficialService#atualizarSeguroPorKm(Integer, Integer, Integer)}
	 * @param rutaId
	 * @param orgaoId
	 * @param usuarioId
	 */
	public void atualizarSeguroPorKm(Integer rutaId, Integer orgaoId, Integer usuarioId, TipoSeguro tipoSeguro);

	/**
	 * See {@link TarifaOficialService#atualizarSeguroPorTarifa(Integer, Integer, Integer)}
	 * @param rutaId
	 * @param orgaoId
	 * @param usuarioId
	 */
	public void atualizarSeguroPorTarifa(Integer rutaId, Integer orgaoId, Integer usuarioId);

	/**
	 * Aplica a regra de arredondamento para as tarifas do órgão concedente informado.<br/>
	 * 
	 * 
	 * após somar todos os componentes (precio,importetaxaembarque,importeseguro,importeoutros e importepedagio) obtem-se o PRECO final.<br/>
	 * 
	 * Baseado nesse valor, são aplicados as regras de arredondamento onde o componente precio pode sofrer um acréscimo os descréscimo de preço para que o arredondamento<br/>
	 * fique certo
	 * 
	 * @param orgaoConcedenteId
	 * @param usuarioId TODO
	 */
	public void aplicarArredondamentoTarifa(Integer orgaoConcedenteId, Integer usuarioId, Boolean taxaEmbarque);

    public void limparTarifasOficiais(List<Empresa> lsEmpresaSelected);
    
    public void atualizarPedagio();
    
    public void atualizarPrecioPorTPP(Integer rutaId, Integer orgaoId, Integer usuarioId, TipoSeguro tipoSeguro);
    
    public long obtenerCount(List<Empresa> lsEmpresaSelected);
    
    public List<TarifaOficialVO> obterTarifaOficialPorFiltroVO(Moneda moneda, Marca marca,List<Marca> lsMarcas,Parada origem, Parada destino, ClaseServicio claseServicio, Ruta ruta, String numRuta, Boolean vende);
    
    public List<TarifaOficialComComposicaoDoPedagioVo> oberTarifaOficialComComposicaoDoPedagioVo(Integer empresaId);
    
    public void atualizarPedagioComFiltroDePracaDePedagio(Integer tarifaOficialId, BigDecimal importePedagio, String composicaoPedagio );
    
    public void removerDuplicidadeNaTarifaOficial();
}
