package br.gov.mj.sislegis.app.service;
import java.io.IOException;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.ejb.Local;
import br.gov.mj.sislegis.app.enumerated.Origem;
import br.gov.mj.sislegis.app.model.PosicionamentoProposicao;
import br.gov.mj.sislegis.app.model.Proposicao;
import br.gov.mj.sislegis.app.model.Reuniao;
import br.gov.mj.sislegis.app.model.Usuario;
import br.gov.mj.sislegis.app.model.pautacomissao.PautaReuniaoComissao;
import br.gov.mj.sislegis.app.parser.TipoProposicao;
@Local
public interface ProposicaoService extends Service<Proposicao> {
Set<PautaReuniaoComissao> buscarProposicoesPautaCamaraWS(Map parametros) throws Exception;
Set<PautaReuniaoComissao> buscarProposicoesPautaSenadoWS(Map parametros) throws Exception;
Proposicao detalharProposicaoCamaraWS(Long id) throws Exception;
Proposicao detalharProposicaoSenadoWS(Long id) throws Exception;
List<Proposicao> listarTodos();
Proposicao buscarPorId(Integer id);
/**
* Adicionados filtros
*
* @param dataReuniao
* @param comissao
* @param idResponsavel
* @param origem
* @param isFavorita
* @param idPosicionameto
* @param limit
* @param offset
* @param idsProposicoes
* @return
*/
Collection<Proposicao> buscarProposicoesPorDataReuniao(Date dataReuniao, boolean fetchAll);
Collection<Proposicao> buscarProposicoesPorDataReuniao(Date dataReuniao);
Collection<Proposicao> buscarProposicoesPorDataReuniao(Date dataReuniao, String comissao, Long idResponsavel,
String origem, String isFavorita, Long idPosicionameto, Integer limit, Integer offset,
Integer[] idsProposicoes, boolean fetchAll);
List<Proposicao> buscarPorSufixo(String sufixo);
List<Proposicao> consultar(String sigla, String autor, String ementa, String origem, String isFavorita,
Integer offset, Integer limit);
/**
* Faz buscas por proposições diretamente dos webservices da origem, não
* tendo a necessidade delas estarem no banco do sislegis.
*
* @param tipo
* @param numero
* @param ano
* @return Lista de proposicoes encontradas na origem
*/
Collection<Proposicao> buscaProposicaoIndependentePor(Origem origem, String tipo, Integer numero, Integer ano)
throws IOException;
Collection<TipoProposicao> listTipos(Origem valueOf) throws IOException;
/**
* Salva uma proposicao não relacionada a uma reuniao
*
* @param proposicaoFromBusca
* @return 1 se criou, 0 se já existia, -1 se houve erro.
*/
int salvarProposicaoIndependente(Proposicao proposicaoFromBusca);
/**
* Consulta webservices por alterações na proposição passada. Se houver
* atualiza com dados mais recentes e salva histórico.
*
* @param proposicao
* a ser consultada
* @return true se encontrou alguma mudança. Caso contrário false
* @throws IOException
* quando algum erro acontece no acesso ao webservices
*
*/
boolean syncDadosProposicao(Proposicao proposicao) throws IOException;
boolean syncDadosProposicao(Long id) throws IOException;
/**
* Adiciona proposicao na lista de proposições seguidas pelo usuário. Ele
* será notificado se houver qqer alteração nesta proposicao
*
* @param user
* @param idProposicao
*/
public void followProposicao(Usuario user, Long idProposicao);
/**
* É o inverso do metodo anterior
*
* @param user
* @param idProposicao
*/
public void unfollowProposicao(Usuario user, Long idProposicao);
/**
* Lista todas as proposicoes que tenham ao menos um seguidor.
*
* @return
*/
List<Proposicao> listProposicoesSeguidas();
PautaReuniaoComissao savePautaReuniaoComissao(PautaReuniaoComissao pautaReuniaoComissao) throws IOException;
PautaReuniaoComissao findPautaReuniao(String comissao, Date date, Integer codigoReuniao);
PautaReuniaoComissao retrievePautaReuniao(Integer codigoReuniao);
void adicionaProposicoesReuniao(Set<PautaReuniaoComissao> pautaReunioes, Reuniao reuniao) throws IOException;
Set<PautaReuniaoComissao> buscarProposicoesPautaCamaraWS(Long idComissao, Date dataInicial, Date dataFinal)
throws Exception;
Set<PautaReuniaoComissao> buscarProposicoesPautaSenadoWS(String siglaComissao, Date dataInicial, Date dataFinal)
throws Exception;
boolean syncDadosPautaProposicao(Long proposicaoLocalId) throws IOException;
boolean syncDadosPautaProposicao(Proposicao proposicaoLocal) throws IOException;
boolean syncDadosPautaReuniaoComissao(PautaReuniaoComissao prcLocal) throws IOException;
List<PautaReuniaoComissao> findPautaReuniaoPendentes();
Proposicao buscarPorIdProposicao(Integer idProposicao);
/**
* Altera o posicionamento da proposicao e salva seu historico
*
* @param id
* @param idPosicionamento
* @param usuario
*/
void alterarPosicionamento(Long id, Long idPosicionamento, boolean preliminar, Usuario usuario);
/**
* Retorna o historico de alteracoes de posicionamento por id da proposicao
*
* @param id
* @return
*/
List<PosicionamentoProposicao> listarHistoricoPosicionamentos(Long id);
/**
* Atualiza o roadmap (roteiro) completo de comissoes por onde uma proposicao deve passar
* @param idProposicao
* @param comissoes
*/
void setRoadmapComissoes(Long idProposicao, List<String> comissoes);
}