package com.escolapios.fctmongo.service;

import com.escolapios.fctmongo.entity.Convenio;
import com.escolapios.fctmongo.repository.ConvenioRepository;
import org.springframework.stereotype.Service;
import java.util.List;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;

@Service
public class ConvenioService {

    private final ConvenioRepository convenioRepository;
    private final MongoTemplate mongoTemplate;

    public ConvenioService(ConvenioRepository convenioRepository, MongoTemplate mongoTemplate) {
        this.convenioRepository = convenioRepository;
        this.mongoTemplate = mongoTemplate;
    }

    public Convenio guardar(Convenio convenio) {
        return convenioRepository.save(convenio);
    }

    public Convenio obtenerPorId(String id) {
        return convenioRepository.findById(id)
                .orElseThrow(() -> new RuntimeException("Convenio no encontrado con ID: " + id));
    }

    public List<Convenio> obtenerTodos() {
        return convenioRepository.findAll();
    }

    public Page<Convenio> obtenerConveniosPaginados(int pagina) {
        // Fijamos el tamaño de la página a 20 elementos
        Pageable pageable = PageRequest.of(pagina, 10);
        return convenioRepository.findAll(pageable);
    }

    public void eliminar(String id) {
        convenioRepository.deleteById(id);
    }

    /**
     * 🚀 INDIVIDUAL (Convenio / Anexo 4): Obtiene un único convenio auto-contenido directamente por su ID
     */
    public Convenio obtenerConvenioConDetallesPorId(String convenioId) {
        // Al estar la información incrustada nativamente, un findById() resuelve todo en microsegundos
        return convenioRepository.findById(convenioId).orElse(null);
    }

    /**
     * 📊 RECOPILATORIO (Anexo 5): Obtiene todos los convenios con sus datos integrados en NoSQL
     */
    public List<Convenio> obtenerConveniosConDetalles() {
        // Al estar los datos auto-contenidos, un findAll() es ultrarrápido y trae todo de golpe
        return convenioRepository.findAll();
    }
    /**
     * 🚀 ANEXO 6: Obtiene un convenio por su ID con su plan de formación ya incrustado en NoSQL
     */
    public Convenio obtenerConvenioConPlanFormacionAnexo6(String convenioId) {
        // Al estar los Resultados de Aprendizaje (RA) auto-contenidos en la entidad, un findById() resuelve todo
        return convenioRepository.findById(convenioId).orElse(null);
    }

    /**
     * 🔍 OBTENER CONVENIO POR ALUMNO EMBEBIDO
     * Localiza el convenio completo buscando dentro del array de alumnos embebidos de MongoDB
     */
    public Convenio obtenerConvenioPorAlumnoEmbebido(String alumnoId) {
        System.out.println("🔍 [MONGO] Buscando acuerdo directo en el array de alumnos para ID: " + alumnoId);       
        
        // Convertimos el ID de búsqueda a ObjectId si es válido para evitar fallos de tipos en Mongo
        Object idAlumnoBusqueda = org.bson.types.ObjectId.isValid(alumnoId) 
                ? new org.bson.types.ObjectId(alumnoId) 
                : alumnoId;

        // ⚡ Solución limpia: Construimos una query nativa sobre la propiedad "alumnos._id"
        org.springframework.data.mongodb.core.query.Query query = 
            org.springframework.data.mongodb.core.query.Query.query(
                org.springframework.data.mongodb.core.query.Criteria.where("alumnos._id").is(idAlumnoBusqueda)
            );

        // Retornamos la entidad Convenio unificada con todos sus snapshots incrustados de un solo golpe
        return mongoTemplate.findOne(query, Convenio.class, "convenios");
    }

    /**
     * 📋 Recorre todos los documentos de la colección de convenios de MongoDB, 
     * extrae los arrays embebidos de estudiantes y devuelve una lista unificada.
     */
    public List extraerAlumnosDeTodosLosConvenios() {
        List todosLosAlumnos = new java.util.ArrayList<>();
        
        // 1. Buscamos todos los convenios físicos que hay en MongoDB
        List<Convenio> todosLosConvenios = convenioRepository.findAll();
        
        // 2. Vaciamos y unificamos los arrays embebidos de estudiantes
        for (Convenio conv : todosLosConvenios) {
            if (conv.getAlumnos() != null && !conv.getAlumnos().isEmpty()) {
                todosLosAlumnos.addAll(conv.getAlumnos());
            }
        }
        
        return todosLosAlumnos;
    }

}
