package com.escolapios.fctmongo.service;
import com.escolapios.fctmongo.entity.*;
import com.escolapios.fctmongo.repository.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Optional;

@Slf4j
@Service
@RequiredArgsConstructor
public class ConvenioMigrationService {
    private final ConvenioRepository convenioRepository;
    @Autowired
    private final EmpresaRepository empresaRepository;
    @Autowired
    private final ProfesorRepository profesorRepository;
    @Autowired
    private final TutorEmpresaRepository tutorEmpresaRepository;
public Convenio procesarYGuardarConvenio(Convenio dto) {   
    // ==========================================
    // 🏢 1. PROCESAR / CREAR EMPRESA EN CALIENTE
    // ==========================================
    Empresa empresaGuardada = null;
    if (dto.getEmpresa() != null && dto.getEmpresa().getNombre() != null && !dto.getEmpresa().getNombre().trim().isEmpty()) {
        String nombreEmpresa = dto.getEmpresa().getNombre().trim();
        String cifEmpresa = dto.getEmpresa().getCif();
        
        Optional<Empresa> empresaExistente = Optional.empty();
        if (cifEmpresa != null && !cifEmpresa.trim().isEmpty()) {
            empresaExistente = empresaRepository.findByCif(cifEmpresa.trim());
        }
        if (empresaExistente.isEmpty()) {
            empresaExistente = empresaRepository.findByNombre(nombreEmpresa);
        }
        
        if (empresaExistente.isPresent()) {
            empresaGuardada = empresaExistente.get();
        } else {
            // SINO EXISTE: La insertamos en su colección original de MongoDB
            Empresa nuevaEmpresa = new Empresa();
            nuevaEmpresa.setNombre(nombreEmpresa);
            nuevaEmpresa.setCif(cifEmpresa);
            nuevaEmpresa.setDireccion(dto.getEmpresa().getDireccion());
            nuevaEmpresa.setCp(dto.getEmpresa().getCp());
            nuevaEmpresa.setMunicipio(dto.getEmpresa().getMunicipio());
            nuevaEmpresa.setContactos(dto.getEmpresa().getContactos()); // Mapeo seguro de multi-contactos          
            
            empresaGuardada = empresaRepository.save(nuevaEmpresa);
            log.info("Migración: Creada nueva entidad Empresa en BBDD: {}", nombreEmpresa);
        }
    }

    // ==========================================
    // 👨‍🏫 2. PROCESAR / CREAR PROFESOR EN CALIENTE
    // ==========================================
    Profesor profesorGuardado = null;
    if (dto.getProfesores() != null && !dto.getProfesores().isEmpty() && dto.getProfesores().get(0).getNombre() != null) {
        // Tomamos el profesor que viene en la migración
        Profesor profMigracion = dto.getProfesores().get(0);
        String nombreProf = profMigracion.getNombre().trim();
        String apellidosProf = profMigracion.getApellidos() != null ? profMigracion.getApellidos().trim() : "";
        
        Optional<Profesor> profExistente = profesorRepository.findByNombreAndApellidos(nombreProf, apellidosProf);      
        if (profExistente.isPresent()) {
            profesorGuardado = profExistente.get();
        } else {
            Profesor nuevoProfesor = new Profesor();
            nuevoProfesor.setNombre(nombreProf);
            nuevoProfesor.setApellidos(apellidosProf);           
            nuevoProfesor.setDni(profMigracion.getDni());
            nuevoProfesor.setEmail(profMigracion.getEmail());
            
            profesorGuardado = profesorRepository.save(nuevoProfesor);
            log.info("Migración: Creado nuevo registro de Profesor en BBDD: {} {}", apellidosProf, nombreProf);
        }
    }

    // ==========================================
    // 👔 3. PROCESAR / CREAR TUTOR EMPRESA EN CALIENTE
    // ==========================================
    TutorEmpresa tutorEmpresaGuardado = null;
    if (dto.getTutoresEmpresa() != null && !dto.getTutoresEmpresa().isEmpty() && dto.getTutoresEmpresa().get(0).getNombre() != null) {
        TutorEmpresa tutorMigracion = dto.getTutoresEmpresa().get(0);
        String nombreTutor = tutorMigracion.getNombre().trim();
        String apellidosTutor = tutorMigracion.getApellidos() != null ? tutorMigracion.getApellidos().trim() : "";
        String dniTutor = tutorMigracion.getDni();

        Optional<TutorEmpresa> tutorExistente = Optional.empty();
        if (dniTutor != null && !dniTutor.trim().isEmpty() && !dniTutor.equals("-")) {
            tutorExistente = tutorEmpresaRepository.findByDni(dniTutor.trim());
        }
        if (tutorExistente.isEmpty()) {
            tutorExistente = tutorEmpresaRepository.findByNombreAndApellidos(nombreTutor, apellidosTutor);
        }

        if (tutorExistente.isPresent()) {
            tutorEmpresaGuardado = tutorExistente.get();
        } else {
            TutorEmpresa nuevoTutor = new TutorEmpresa();
            nuevoTutor.setNombre(nombreTutor);
            nuevoTutor.setApellidos(apellidosTutor);
            nuevoTutor.setDni(dniTutor);
            nuevoTutor.setEmail(tutorMigracion.getEmail());
            
            if (empresaGuardada != null) {
                nuevoTutor.setEmpresaId(empresaGuardada.getId());
            }

            tutorEmpresaGuardado = tutorEmpresaRepository.save(nuevoTutor);
            log.info("Migración: Creado nuevo registro de Tutor Empresa en BBDD: {} {}", apellidosTutor, nombreTutor);
        }
    }

    // ==========================================
    // 📄 4. ENLAZAR E INCRUSTAR EN EL CONVENIO FINAL
    // ==========================================
    Convenio convenioEntidad = new Convenio();
    convenioEntidad.setNumeroAcuerdo(dto.getNumeroAcuerdo());
    convenioEntidad.setFechaFirma(dto.getFechaFirma());
    convenioEntidad.setEstado(dto.getEstado());
    convenioEntidad.setCursoAcademico(dto.getCursoAcademico());
    convenioEntidad.setObservaciones(dto.getObservaciones());
    convenioEntidad.setAsumeSeguridadSocial(dto.getAsumeSeguridadSocial());
    
    // Copiamos las listas básicas de alumnos y valoraciones que viajen en la migración
    if (dto.getAlumnos() != null) convenioEntidad.setAlumnos(new ArrayList<>(dto.getAlumnos()));
    if (dto.getValoraciones() != null) convenioEntidad.setValoraciones(new ArrayList<>(dto.getValoraciones()));
    if (dto.getFamiliasProfesionales() != null) convenioEntidad.setFamiliasProfesionales(new ArrayList<>(dto.getFamiliasProfesionales()));
    
    // 🟢 ENFOQUE NOSQL: Guardamos el objeto completo o lo inyectamos en su array correspondiente
    if (empresaGuardada != null) {
        convenioEntidad.setEmpresa(empresaGuardada); // Foto del documento completo
    }

    if (profesorGuardado != null) {
        convenioEntidad.getProfesores().add(profesorGuardado); // Se añade al array NoSQL
    }

    if (tutorEmpresaGuardado != null) {
        convenioEntidad.getTutoresEmpresa().add(tutorEmpresaGuardado); // Se añade al array NoSQL
    }

    // Guardamos el Convenio definitivo en MongoDB conteniendo las fotos incrustadas completas
    return convenioRepository.save(convenioEntidad);
}

}
