package com.sc.sicanet.migracion_sicanet.service;

import com.sc.sicanet.migracion_sicanet.DTO.SocioeconomicosDTO;
import com.sc.sicanet.migracion_sicanet.entity.*;
import com.sc.sicanet.migracion_sicanet.repository.*;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.Optional;

@Service
public class SocioeconomicosServiceImpl implements SocioeconomicosService {
    @Autowired
    private PersonaRepository personaRepository;
    @Autowired
    private PldCatPersonasRecursoDestinoRepository pldCatPersonasRecursoDestinoRepository;
    @Autowired
    private PldCatPersonasRecursoOrigenRepository pldCatPersonasRecursoOrigenRepository;
    @Autowired
    private CatDestinoRecursoRepository catDestinoRecursoRepository;
    @Autowired
    private CatOrigenRecursoRepository catOrigenRecursoRepository;

    @PersistenceContext
    private EntityManager entityManager;

    public PldCatPersonasRecursoDestino guardarDestinoRecurso(PldCatPersonasRecursoDestino pldCatPersonasRecursoDestino) {
        return pldCatPersonasRecursoDestinoRepository.save(pldCatPersonasRecursoDestino);
    }

    public PldCatPersonasRecursoOrigen guardarOrigenRecurso(PldCatPersonasRecursoOrigen pldCatPersonasRecursoOrigen) {
        return pldCatPersonasRecursoOrigenRepository.save(pldCatPersonasRecursoOrigen);
    }

    @Override
    public Optional<PldCatPersonasRecursoDestino> consultarRecursoDestino(Persona persona) {
        return pldCatPersonasRecursoDestinoRepository.findByPersonaAndEstatus(persona, "A");
    }

    @Override
    public Optional<PldCatPersonasRecursoOrigen> consultarRecursoOrigen(Persona persona) {
        return pldCatPersonasRecursoOrigenRepository.findByPersonaAndEstatus(persona, "A");
    }

    public PldCatPersonasRecursoDestino convertirDatosDeRecursosDestino(SocioeconomicosDTO pldCatPersonasRecursoDestinoDTO, Persona persona) {
        LocalDateTime fechaActual = LocalDateTime.now();
        Optional<CatDestinos> catDestinos = catDestinoRecursoRepository
                .findByDestino(pldCatPersonasRecursoDestinoDTO.getDestino_recurso());
        PldCatPersonasRecursoDestino pldCatPersonasRecursoDestino = new PldCatPersonasRecursoDestino(
                fechaActual, catDestinos.isPresent() ? catDestinos.get().getPkCatDestino() : 0, "",
                0, "API Migracion", "A", 1,"");

        pldCatPersonasRecursoDestino.setFechaControl(fechaActual);
        pldCatPersonasRecursoDestino.setFechaRegistro(fechaActual);

        if(persona.getPkPersona() != 0){
            Optional<PldCatPersonasRecursoDestino> recursoDestinoExistente = consultarRecursoDestino(persona);
            if(recursoDestinoExistente.isPresent()) {
                pldCatPersonasRecursoDestino.setPkPldCatPersonasRecursoDestino(recursoDestinoExistente.get().getPkPldCatPersonasRecursoDestino());
                pldCatPersonasRecursoDestino.setFechaControl(recursoDestinoExistente.get().getFechaControl());
                pldCatPersonasRecursoDestino.setFechaRegistro(recursoDestinoExistente.get().getFechaRegistro());
            }
        }

        return pldCatPersonasRecursoDestino;
    }

    public PldCatPersonasRecursoOrigen convertirDatosDeRecursosOrigen(SocioeconomicosDTO pldCatPersonasRecursoOrigenDTO, Persona persona) {
        LocalDateTime fechaActual = LocalDateTime.now();
        Optional<CatOrigenRecurso> catOrigenRecurso = catOrigenRecursoRepository
                .findByDescripcion(pldCatPersonasRecursoOrigenDTO.getOrigen_recurso());
        PldCatPersonasRecursoOrigen pldCatPersonasRecursoOrigen = new PldCatPersonasRecursoOrigen(
                fechaActual, catOrigenRecurso.isPresent() ? catOrigenRecurso.get().getPkCatOrigenRecurso() : 0, "",
                0, "API Migracion", "A", 1,"");

        pldCatPersonasRecursoOrigen.setFechaControl(fechaActual);
        pldCatPersonasRecursoOrigen.setFechaRegistro(fechaActual);

        if(persona.getPkPersona() != 0){
            Optional<PldCatPersonasRecursoOrigen> recursoOrigenExistente = consultarRecursoOrigen(persona);
            if(recursoOrigenExistente.isPresent()) {
                pldCatPersonasRecursoOrigen.setPkPldCatPersonasRecursoOrigen(recursoOrigenExistente.get().getPkPldCatPersonasRecursoOrigen());
                pldCatPersonasRecursoOrigen.setFechaControl(recursoOrigenExistente.get().getFechaControl());
                pldCatPersonasRecursoOrigen.setFechaRegistro(recursoOrigenExistente.get().getFechaRegistro());
            }
        }

        return pldCatPersonasRecursoOrigen;
    }
}
