package com.imprimelibros.erp.direcciones; 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.stereotype.Service; import com.imprimelibros.erp.direcciones.DireccionRepository; import com.imprimelibros.erp.paises.Paises; @Service public class DireccionService { protected DireccionRepository repo; public DireccionService(DireccionRepository repo) { this.repo = repo; } public Map getForSelect(String q1, String q2, Long userId) { 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(); List all = userId != null ? repo.findByUserId(userId) : repo.findAll(); // Mapear a opciones id/text con i18n y filtrar por búsqueda si llega List> options = all.stream() .map(cc -> { String id = cc.getId().toString(); String alias = cc.getAlias(); String direccion = cc.getDireccion(); String cp = String.valueOf(cc.getCp()); String ciudad = cc.getCiudad(); String att = cc.getAtt(); Map m = new HashMap<>(); m.put("id", id); // lo normal en Select2: id = valor que guardarás (code3) m.put("text", alias); // texto mostrado, i18n con fallback a keyword m.put("cp", cp); m.put("ciudad", ciudad); m.put("att", att); m.put("alias", alias); m.put("direccion", direccion); return m; }) .filter(opt -> { if (q == null || q.isEmpty()) return true; String cp = opt.get("cp"); String ciudad = opt.get("ciudad").toLowerCase(); String att = opt.get("att").toLowerCase(); String alias = opt.get("alias").toLowerCase(); String text = opt.get("text").toLowerCase(); String direccion = opt.get("direccion").toLowerCase(); return text.contains(q) || cp.contains(q) || ciudad.contains(q) || att.contains(q) || alias.contains(q) || direccion.contains(q); }) .sorted(Comparator.comparing(m -> m.get("text"), Collator.getInstance())) .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 Optional findById(Long id) { return repo.findById(id); } }