package br.gov.servicos.servico; import br.gov.servicos.cms.PaginaEstatica; import br.gov.servicos.v3.schema.SegmentoDaSociedade; import br.gov.servicos.v3.schema.ServicoXML; import com.github.slugify.Slugify; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.view.RedirectView; import java.util.*; import static java.util.Comparator.comparing; import static java.util.Optional.ofNullable; import static java.util.stream.Collectors.groupingBy; import static java.util.stream.Collectors.toList; import static lombok.AccessLevel.PRIVATE; @Slf4j @Controller @FieldDefaults(level = PRIVATE, makeFinal = true) class PublicoAlvoController { ServicoRepository servicos; Slugify slugify; @Autowired PublicoAlvoController(ServicoRepository servicos, Slugify slugify) { this.servicos = servicos; this.slugify = slugify; } @RequestMapping({"/publico-alvo/servicos-aos-{id}", "/publico-alvo/servicos-as-{id}"}) RedirectView legado(@PathVariable String id, @RequestParam(required = false) Character letra) { return new RedirectView("/publico-alvo/" + id + ofNullable(letra).map(l -> "?letra=" + l).orElse("")); } @RequestMapping("/publico-alvo/{id}") ModelAndView publicoAlvo(@PathVariable("id") SegmentoDaSociedade segmento, @RequestParam(required = false) Character letra) { Character primeiraLetra = ofNullable(letra).map(Character::toUpperCase).orElse(null); Map<Character, List<ServicoXML>> servicosPorLetraInicial = servicosAgrupadosPorLetraInicial(segmento); List<ServicoXML> listaServicos; if (primeiraLetra != null) { listaServicos = servicosPorLetraInicial.getOrDefault(primeiraLetra, Collections.<ServicoXML>emptyList()); } else { listaServicos = servicos.findBySegmentoDaSociedade(segmento); } List<PaginaEstatica> servicos = listaServicos .stream() .sorted(comparing(ServicoXML::getNome)) .map(PaginaEstatica::fromServico) .collect(toList()); Map<String, Object> model = new HashMap<>(); model.put("letraAtiva", primeiraLetra); model.put("publicoAlvo", segmento); model.put("servicos", servicos); model.put("letras", letrasDisponiveis(servicosPorLetraInicial.keySet())); return new ModelAndView("publico-alvo", model); } private Map<Character, List<ServicoXML>> servicosAgrupadosPorLetraInicial(SegmentoDaSociedade segmento) { return servicos.findBySegmentoDaSociedade(segmento) .stream() .collect(groupingBy(s -> s.getNome().trim().toUpperCase().charAt(0))); } private List<Character> letrasDisponiveis(Set<Character> letras) { return letras .stream() .sorted() .collect(toList()); } }