package com.sc.sicanet.migracion_sicanet.service;

import com.sc.sicanet.migracion_sicanet.DTO.PrestamosSolicitudesDTO;
import com.sc.sicanet.migracion_sicanet.entity.*;
import com.sc.sicanet.migracion_sicanet.repository.PrestamosSolicitudesRepository;
import com.sc.sicanet.migracion_sicanet.repository.SocioRepository;
import org.springframework.beans.factory.annotation.Autowired;
import jakarta.transaction.Transactional;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;

import java.util.*;

@Service
public class MigracionPrestamosSolicitudesServiceImpl implements MigracionPrestamosSolicitudesService {
    final private SocioRepository socioRepository;
    final private PersonaService personaService;
    final private SocioService socioService;
    final private PrestamosSolicitudesService prestamosSolicitudesService;

    public MigracionPrestamosSolicitudesServiceImpl(SocioRepository socioRepository, PersonaService personaService, SocioService socioService, PrestamosSolicitudesService prestamosSolicitudesService) {
        this.socioRepository = socioRepository;
        this.personaService = personaService;
        this.socioService = socioService;
        this.prestamosSolicitudesService = prestamosSolicitudesService;
    }

    @Transactional
    public Map<String, String> migrarSolicitud(PrestamosSolicitudesDTO prestamosSolicitudesDTO) {
        Optional<Socio> socio = socioRepository.findByRefenciaSocio(prestamosSolicitudesDTO.getReferencia_acreditado());
        Map<String, String> resultado = new HashMap<>();
        if(!socio.isPresent()) {
            resultado.put("msg", "Acreditado No Encontrado");
            resultado.put("code", "" + HttpStatus.BAD_REQUEST);
            return resultado;
        }
        PrestamosSolicitudes prestamosSolicitudes = prestamosSolicitudesService.convertirDatosDePrestamosSolicitudes(prestamosSolicitudesDTO, socio.get());
        return guardarActualizarSolicitud(prestamosSolicitudes, socio.get());
    }

    @Override
    public void guardarSolicitud(PrestamosSolicitudes prestamosSolicitudes, Socio socio, Boolean actualizar) {
        prestamosSolicitudes.setSocio(socio);
        prestamosSolicitudesService.guardarPrestamosSolicitudes(prestamosSolicitudes);
    }

    public Map<String, String> guardarActualizarSolicitud(PrestamosSolicitudes prestamosSolicitudes, Socio socio) {
        boolean actualizar = prestamosSolicitudes.getControl() != null && !prestamosSolicitudes.getControl().isEmpty();
        Map<String, String> respuesta = new HashMap<>();

        if (actualizar) {
            Optional<PrestamosSolicitudes> solicitudExistente = prestamosSolicitudesService.consultaSolicitudesByControlAndEstatus(prestamosSolicitudes.getControl(), "P");
            if (solicitudExistente.isPresent()) {
                PrestamosSolicitudes solicitud = solicitudExistente.get();
                if (!"P".equals(solicitud.getEstatus())) {
                    respuesta.put("mensaje", "No Se Puede Actualizar La Solicitud Ya Que No Se Encuentra En Estatus 'P'");
                    respuesta.put("code", "400");
                    return respuesta;
                }
            } else {
                actualizar = false;
            }
        } else {
            actualizar = false;
        }

        String mensaje = actualizar ? "Actualización" : "Guardado";
        String codigo = actualizar ? "201" : "200";

        guardarSolicitud(prestamosSolicitudes, socio, actualizar);
        respuesta.put("mensaje", mensaje);
        respuesta.put("code", codigo);
        respuesta.put("referencia_acreditado", socio.getReferenciaSocio());
        respuesta.put("control_solicitud", prestamosSolicitudes.getControl());
        return respuesta;
    }
}