package br.gov.servicos.orgao;
import br.gov.servicos.servico.ServicoRepository;
import br.gov.servicos.v3.schema.OrgaoXML;
import br.gov.servicos.v3.schema.ServicoXML;
import lombok.AccessLevel;
import lombok.experimental.FieldDefaults;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Component;
import java.util.Objects;
import java.util.Optional;
import java.util.SortedSet;
import java.util.TreeSet;
import static java.util.Comparator.comparing;
import static java.util.stream.Collectors.toCollection;
@Component
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
public class OrgaoRepositoryUtil {
ServicoRepository servicos;
OrgaoRepository orgaoRepository;
Siorg siorg;
@Autowired
OrgaoRepositoryUtil(ServicoRepository servicos, OrgaoRepository orgaoRepository, Siorg siorg) {
this.servicos = servicos;
this.orgaoRepository = orgaoRepository;
this.siorg = siorg;
}
@Cacheable("orgaos")
public SortedSet<OrgaoXML> findAll() {
return servicos.findAll(new PageRequest(0, Integer.MAX_VALUE)).getContent()
.stream()
.map(ServicoXML::getOrgao)
.filter(Objects::nonNull)
.map(this::obterOrgao)
.filter(Objects::nonNull)
.collect(toCollection(() -> new TreeSet<>(comparing(OrgaoXML::getNome))));
}
public OrgaoXML obterOrgao(OrgaoXML orgao) {
return Optional.ofNullable(orgaoRepository.findOne(orgao.getId()))
.orElse(siorg.obterOrgao(orgao.getUrl()));
}
}