package es.recursoscatolicos; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import es.recursoscatolicos.model.CalendarioLiturgico; import es.recursoscatolicos.model.Grupo; import es.recursoscatolicos.model.Parroquia; import es.recursoscatolicos.model.SantoDelDia; import es.recursoscatolicos.model.VersoBiblico; import es.recursoscatolicos.repository.CalendarioLiturgicoRepository; import es.recursoscatolicos.repository.GrupoRepository; import es.recursoscatolicos.repository.ParroquiaRepository; import es.recursoscatolicos.repository.SantoDelDiaRepository; import es.recursoscatolicos.repository.VersoBiblicoRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.CommandLineRunner; import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Component; import java.time.LocalDate; import java.util.List; @Component @RequiredArgsConstructor @Slf4j public class DataInitializer implements CommandLineRunner { private final ParroquiaRepository parroquiaRepository; private final GrupoRepository grupoRepository; private final CalendarioLiturgicoRepository calendarioRepository; private final VersoBiblicoRepository versoBiblicoRepository; private final SantoDelDiaRepository santoDelDiaRepository; @Override public void run(String... args) throws Exception { cargarParroquias(); cargarCalendario(); cargarVersosBiblicos(); cargarSantoDelDia(); } private void cargarVersosBiblicos() throws Exception { if (versoBiblicoRepository.count() > 0) return; log.info("Cargando versos bíblicos (Salmos + Proverbios)..."); ObjectMapper mapper = new ObjectMapper(); List todos = new java.util.ArrayList<>(); cargarFuente(mapper, "salmos.json", "Salmos", todos); cargarFuente(mapper, "proverbios.json", "Proverbios", todos); versoBiblicoRepository.saveAll(todos); log.info("Versos bíblicos cargados: {} en total.", todos.size()); } private void cargarFuente(ObjectMapper mapper, String recurso, String fuente, List destino) throws Exception { List> items = mapper.readValue( new ClassPathResource(recurso).getInputStream(), new TypeReference<>() {} ); items.forEach(s -> { VersoBiblico v = new VersoBiblico(); v.setFuente(fuente); v.setNumero(((Number) s.get("numero")).intValue()); v.setTexto((String) s.get("texto")); destino.add(v); }); } private void cargarParroquias() { if (parroquiaRepository.count() > 0) return; log.info("Cargando datos de ejemplo..."); Parroquia p1 = saveParroquia("San José Obrero", "Calle Mayor, 12, Madrid"); Parroquia p2 = saveParroquia("Nuestra Señora del Pilar", "Avda. de la Paz, 5, Zaragoza"); Parroquia p3 = saveParroquia("Santa María de la Asunción", "Plaza de la Iglesia, 1, Sevilla"); saveGrupo("Catequesis infantil", p1); saveGrupo("Catequesis de adultos", p1); saveGrupo("Hogar de Misiones", p1); saveGrupo("Cáritas parroquial", p1); saveGrupo("Grupo de jóvenes", p1); saveGrupo("Catequesis infantil", p2); saveGrupo("Grupo de jóvenes", p2); saveGrupo("Cáritas parroquial", p3); log.info("Datos de ejemplo cargados correctamente."); } private void cargarCalendario() throws Exception { if (calendarioRepository.count() > 0) return; log.info("Cargando calendario litúrgico..."); ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new JavaTimeModule()); List entradas = mapper.readValue( new ClassPathResource("calendario-liturgico.json").getInputStream(), new TypeReference<>() {} ); calendarioRepository.saveAll(entradas); log.info("Calendario litúrgico cargado: {} entradas.", entradas.size()); } private Parroquia saveParroquia(String nombre, String direccion) { Parroquia p = new Parroquia(); p.setNombre(nombre); p.setDireccion(direccion); return parroquiaRepository.save(p); } private void saveGrupo(String nombre, Parroquia parroquia) { Grupo g = new Grupo(); g.setNombre(nombre); g.setParroquia(parroquia); grupoRepository.save(g); } private void cargarSantoDelDia() { if (santoDelDiaRepository.count() > 0) return; log.info("Cargando Santos del Día para 2026..."); // Datos esenciales: el santo del día hoy (29 de junio de 2026) y algunos días cercanos agregarSanto(LocalDate.of(2026, 6, 28), "San Ireneo", "obispo y mártir", "rojo"); agregarSanto(LocalDate.of(2026, 6, 29), "San Pedro y San Pablo", "apóstoles", "rojo"); agregarSanto(LocalDate.of(2026, 6, 30), "San Justo de Alcalá", null, "rojo"); agregarSanto(LocalDate.of(2026, 7, 1), "Santa María Goretti", null, "rojo"); // Días especiales del año agregarSanto(LocalDate.of(2026, 1, 1), "Santa María, Madre de Dios", null, "rosa"); agregarSanto(LocalDate.of(2026, 12, 25), "Natividad del Señor", "Solemnidad", "blanco"); agregarSanto(LocalDate.of(2026, 8, 15), "Asunción de la Virgen María", null, "blanco"); agregarSanto(LocalDate.of(2026, 11, 1), "Todos los Santos", "Solemnidad nacional", "blanco"); agregarSanto(LocalDate.of(2026, 12, 8), "Inmaculada Concepción", "Patrona de España", "azul"); log.info("Santos del Día cargados correctamente."); } private void agregarSanto(LocalDate fecha, String santo, String descripcion, String color) { SantoDelDia s = new SantoDelDia(); s.setFecha(fecha); s.setSanto(santo); s.setDescripcion(descripcion); s.setColor(color); try { santoDelDiaRepository.save(s); } catch (Exception e) { // Si ya existe, ignorar el error (por la unicidad de fecha) log.debug("Santo del día {} ya existe", fecha); } } }