package com.sc.sicanet.migracion_sicanet.service;

import com.sc.sicanet.migracion_sicanet.DTO.PerfilTransaccionalDTO;
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;
import java.util.stream.Collectors;

@Service
public class PerfilTransaccionalServiceImpl implements PerfilTransaccionalService {
    @Autowired
    private PerfilTransaccionalRepository perfilTransaccionalRepository;
    @Autowired
    private PerfilTransaccionalMontosRepository perfilTransaccionalMontosRepository;
    @Autowired
    private PersonaRepository personaRepository;
    @Autowired
    private CatPeriodosRepository catPeriodosRepository;
    @Autowired
    private CatFormaPagoRepository catFormaPagoRepository;

    @PersistenceContext
    private EntityManager entityManager;

    public PerfilTransaccional guardarPerfilTransaccional(PerfilTransaccional perfilTransaccional) {
        return perfilTransaccionalRepository.save(perfilTransaccional);
    }

    @Override
    public Optional<PerfilTransaccional> consultaPerfilTransaccional(Persona persona) {
        return perfilTransaccionalRepository.findByPersonaAndEstatus(persona, "A");
    }

    public PerfilTransaccional convertirDatosDePerfilTransaccional(PerfilTransaccionalDTO perfilTransaccionalDTO, Persona persona) {
        LocalDateTime fechaHoraActual = LocalDateTime.now();
        Optional<PerfilTransaccionalMontos> perfilTransaccionalMontos = perfilTransaccionalMontosRepository
                .findByDescripcion(perfilTransaccionalDTO.getDisponibilidad_mensual());
        Optional<CatPeriodos> catPeriodos = catPeriodosRepository.findByPeriodo(perfilTransaccionalDTO.getPeriodicidad());

        //Optional<CatFormaPago> catFormaPago = catFormaPagoRepository.findByForma(perfilTransaccionalDTO.getForma_pago());
        String formasPagoConcatenadas = perfilTransaccionalDTO.getForma_pago()
                .stream()
                .distinct()
                .map(catFormaPagoRepository::findByForma)
                .filter(Optional::isPresent).map(Optional::get).map(CatFormaPago::getPkCatForma)
                .collect(Collectors.joining(", "));

        PerfilTransaccional perfilTransaccional = new PerfilTransaccional(fechaHoraActual,
                perfilTransaccionalMontos.isPresent() ? perfilTransaccionalMontos.get().getPkPerfilTransaccionalMontos() : 0,
                perfilTransaccionalDTO.getNumero_operacion_por_mes(), catPeriodos.isPresent() ? catPeriodos.get().getAcronimo() : "",
                formasPagoConcatenadas, "",0,"API Migracion","A",1,"");

        perfilTransaccional.setFechaControl(fechaHoraActual);
        perfilTransaccional.setFechaRegistro(fechaHoraActual);
        if(persona.getPkPersona() != 0){
            Optional<PerfilTransaccional> perfilTransaccionalExistente = consultaPerfilTransaccional(persona);
            if(!perfilTransaccionalExistente.isEmpty()){
                perfilTransaccional.setPkPerfilTransaccional(perfilTransaccionalExistente.get().getPkPerfilTransaccional());
                perfilTransaccional.setFechaControl(perfilTransaccionalExistente.get().getFechaControl());
                perfilTransaccional.setFechaRegistro(perfilTransaccionalExistente.get().getFechaRegistro());
            }
        }

        return perfilTransaccional;
    }
}