package com.imprimelibros.erp.paises; import java.text.Collator; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; import org.springframework.context.MessageSource; import org.springframework.stereotype.Service; @Service public class PaisesService { protected final PaisesRepository repo; protected final MessageSource messageSource; public PaisesService(PaisesRepository repo, MessageSource messageSource) { this.repo = repo; this.messageSource = messageSource; } public Map getForSelect(String q1, String q2, Locale locale) { try { // Termino de búsqueda (Select2 usa 'q' o 'term' según versión/config) String search = Optional.ofNullable(q1).orElse(q2); if (search != null) { search = search.trim(); } final String q = (search == null || search.isEmpty()) ? null : search.toLowerCase(locale); List all = repo.findAll(); // Mapear a opciones id/text con i18n y filtrar por búsqueda si llega List> options = all.stream() .map(cc -> { String key = cc.getKeyword(); String id = cc.getCode3(); String text = messageSource.getMessage("paises." + key, null, key, locale); Map m = new HashMap<>(); m.put("id", id); // lo normal en Select2: id = valor que guardarás (code3) m.put("text", text); // texto mostrado, i18n con fallback a keyword return m; }) .filter(opt -> { if (q == null || q.isEmpty()) return true; String text = opt.get("text").toLowerCase(locale); String id = opt.get("id").toLowerCase(locale); return text.contains(q) || id.contains(q); }) .sorted(Comparator.comparing(m -> m.get("text"), Collator.getInstance(locale))) .collect(Collectors.toList()); // Estructura Select2 Map resp = new HashMap<>(); resp.put("results", options); return resp; } catch (Exception e) { e.printStackTrace(); return Map.of("results", List.of()); } } public String getPaisNombrePorCode3(String code3, Locale locale) { if (code3 == null || code3.isEmpty()) { return ""; } Optional opt = repo.findByCode3(code3); if (opt.isPresent()) { Paises pais = opt.get(); String key = pais.getKeyword(); return messageSource.getMessage("paises." + key, null, key, locale); } else { return ""; } } }