package com.sc.sicanet.migracion_sicanet.service;

import com.sc.sicanet.migracion_sicanet.DTO.PersonaDTO;
import com.sc.sicanet.migracion_sicanet.entity.*;
import com.sc.sicanet.migracion_sicanet.repository.PersonaRepository;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

import jakarta.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MigracionServiceImpl implements MigracionService {
    final private PersonaRepository personaRepository;

    public MigracionServiceImpl(PersonaRepository personaRepository) {
        this.personaRepository = personaRepository;
    }

    @Override
    public List<Persona> findAll() {
        return  (List<Persona>) personaRepository.findAll();
    }

    @Override
    public Optional<Persona> findById(int id) {
        return personaRepository.findById(id);
    }

    @Autowired
    private PersonaService personaService;
    @Autowired
    private LaboralService laboralService;
    @Autowired
    private SocioService socioService;
    @Autowired
    private DomicilioService domicilioService;
    @Autowired
    private PerfilTransaccionalService perfilTransaccionalService;
    @Autowired
    private InformacionPepsService informacionPepsService;
    @Autowired
    RepresentanteLegalService representanteLegalService;
    @Autowired
    private ContactoService contactoService;
    @Autowired
    private SocioeconomicosService socioeconomicosService;

    @Transactional
    public Map<String, String> guardarActualizarPersona(Persona persona, Laboral laboral, Domicilio domicilio, Domicilio domicilioLaboral,
                                                        PerfilTransaccional perfilTransaccional, InformacionPEPS informacionPEPS,
                                                        RepresentanteLegal representanteLegal, Persona personaRepresentante,
                                                        Domicilio domicilioRepresentante, CatContacto catContacto,
                                                        PldCatPersonasRecursoOrigen pldCatPersonasRecursoOrigen,
                                                        PldCatPersonasRecursoDestino pldCatPersonasRecursoDestino) {
        boolean actualizacion = true;
        String mensaje = "Actualizado";
        String code = "201";
        Map<String, String> personaGuardadaActualizada = new HashMap<>();
        if (persona.getPkPersona() == 0) {
            actualizacion = false;
            mensaje = "Guardado";
            code = "200";
        }
        guardarPersona(persona, laboral, domicilio, domicilioLaboral, perfilTransaccional, informacionPEPS,
                representanteLegal, personaRepresentante, domicilioRepresentante, catContacto, pldCatPersonasRecursoOrigen,
                pldCatPersonasRecursoDestino, actualizacion);
        personaGuardadaActualizada = socioService.recuperarSocio(persona);
        personaGuardadaActualizada.put("referenciaAcreditado", personaGuardadaActualizada.get("referenciaSocio"));
        personaGuardadaActualizada.put("nombreAcreditado", personaGuardadaActualizada.get("nombreSocio"));
        personaGuardadaActualizada.put("uuidDomicilioPersonal", domicilio.getUuid());
        personaGuardadaActualizada.put("uuidDomicilioLaboral", domicilioLaboral.getUuid());
        personaGuardadaActualizada.put("mensaje", mensaje);
        personaGuardadaActualizada.put("code", code);
        return personaGuardadaActualizada;
    }

    public Map<String, String> migracion(PersonaDTO personaDTO) {
        Persona persona = personaService.convertirADatosDePersona(personaDTO);
        Domicilio domicilio = domicilioService.convertirDatosDeDomicilio(personaDTO.getDomicilio_personal(), persona, true);
        Domicilio domicilio_laboral = domicilioService.convertirDatosDeDomicilio(personaDTO.getLaboral().getDomicilio_laboral(), persona, false);
        Laboral laboral = laboralService.convertirADatosDeLaboral(personaDTO.getLaboral(), persona, domicilio_laboral);
        PerfilTransaccional perfilTransaccional = perfilTransaccionalService.convertirDatosDePerfilTransaccional(personaDTO.getPerfil_transaccional(), persona);
        InformacionPEPS informacionPEPS = informacionPepsService.convertirDatosDeInformacionPeps(personaDTO.getInformacion_peps(), persona);
        CatContacto catContacto = contactoService.convertirDatosDeContacto(personaDTO.getContacto(), persona);
        PldCatPersonasRecursoDestino pldCatPersonasRecursoDestino = socioeconomicosService.convertirDatosDeRecursosDestino(personaDTO.getSocioeconomicos(), persona);
        PldCatPersonasRecursoOrigen pldCatPersonasRecursoOrigen = socioeconomicosService.convertirDatosDeRecursosOrigen(personaDTO.getSocioeconomicos(), persona);
        RepresentanteLegal representanteLegal = new RepresentanteLegal();
        Persona personaRepresentante = new Persona();
        Domicilio domicilioRepresentante = new Domicilio();
        if(personaDTO.getTipo_persona().equals("M")) {
          representanteLegal = representanteLegalService.convertirDatos(personaDTO.getRepresentante_legal(), persona);
          personaRepresentante = representanteLegal.getRepresentante();
          domicilioRepresentante = domicilioService.convertirDatosDeDomicilio(personaDTO.getRepresentante_legal().getDomicilio_personal(), personaRepresentante, true);
        }
        return guardarActualizarPersona(persona, laboral, domicilio, domicilio_laboral, perfilTransaccional, informacionPEPS, representanteLegal, personaRepresentante,
                domicilioRepresentante, catContacto, pldCatPersonasRecursoOrigen, pldCatPersonasRecursoDestino);
    }

    @Override
    public void guardarDomicilio(Domicilio domicilio, Persona persona) {
        domicilio.setPersona(persona);
        domicilioService.guardarDomicilio(domicilio);
    }

    @Override
    public void guardarLaboral(Laboral laboral, Domicilio domicilioLaboral, Persona persona) {
        laboral.setDomicilio(domicilioLaboral);
        laboral.setPersona(persona);
        laboralService.guardarLaboral(laboral);
    }

    @Override
    public void guardarInformacionPEPS(InformacionPEPS informacionPEPS, Persona persona) {
        informacionPEPS.setPersona(persona);
        informacionPepsService.guardarInformacionPeps(informacionPEPS);
    }

    @Override
    public void guardarPerfilTransaccional(PerfilTransaccional perfilTransaccional, Persona persona) {
        perfilTransaccional.setPersona(persona);
        perfilTransaccionalService.guardarPerfilTransaccional(perfilTransaccional);
    }

    @Override
    public void guardarCatContacto(CatContacto catContacto, Persona persona) {
        catContacto.setPersona(persona);
        contactoService.guardarContacto(catContacto);
    }

    @Override
    public void guardarSocieconomicos(PldCatPersonasRecursoOrigen pldCatPersonasRecursoOrigen,
                                      PldCatPersonasRecursoDestino pldCatPersonasRecursoDestino, Persona persona) {
        pldCatPersonasRecursoOrigen.setPersona(persona);
        pldCatPersonasRecursoDestino.setPersona(persona);
        socioeconomicosService.guardarOrigenRecurso(pldCatPersonasRecursoOrigen);
        socioeconomicosService.guardarDestinoRecurso(pldCatPersonasRecursoDestino);
    }

    @Transactional
    public void guardarPersona(Persona persona, Laboral laboral, Domicilio domicilio, Domicilio domicilioLaboral,
                                    PerfilTransaccional perfilTransaccional, InformacionPEPS informacionPEPS, RepresentanteLegal representanteLegal,
                                    Persona personaRepresentante, Domicilio domicilioRepresentante, CatContacto catContacto, PldCatPersonasRecursoOrigen pldCatPersonasRecursoOrigen,
                                    PldCatPersonasRecursoDestino pldCatPersonasRecursoDestino, boolean actualizar) {

        if(!actualizar){
            Socio socio = new Socio();
            socio.setFkPersona(persona); // Asocia la persona al socio
            socioService.guardarSocio(socio);
        } else {
            personaService.guardarPersonas(persona);
        }

        if(persona.getTipoPersona().equals("M")){
            Optional<Persona> representanteExistente = personaService.consultaPersonas(personaRepresentante);
            if (representanteExistente.isPresent()) {
                personaRepresentante = representanteExistente.get();
                representanteLegalService.guardarRepresentante(representanteLegal);
                domicilioRepresentante.setPersona(personaRepresentante);
                domicilioService.guardarDomicilio(domicilioRepresentante);
            } else {
                personaRepresentante = personaService.guardarPersonas(personaRepresentante);
                representanteLegalService.guardarRepresentante(representanteLegal);
                domicilioRepresentante.setPersona(personaRepresentante);
                domicilioService.guardarDomicilio(domicilioRepresentante);
            }
            representanteLegal.setPersona(persona);
            representanteLegal.setRepresentante(personaRepresentante);
        }

        guardarDomicilio(domicilio, persona);
        guardarDomicilio(domicilioLaboral, persona);
        guardarLaboral(laboral, domicilioLaboral, persona);
        guardarPerfilTransaccional(perfilTransaccional, persona);
        guardarInformacionPEPS(informacionPEPS, persona);
        guardarCatContacto(catContacto, persona);
        guardarSocieconomicos(pldCatPersonasRecursoOrigen, pldCatPersonasRecursoDestino, persona);
    }
}