package com.sc.sicanet.migracion_sicanet.service;

import com.sc.sicanet.migracion_sicanet.entity.Persona;
import com.sc.sicanet.migracion_sicanet.entity.Socio;
import com.sc.sicanet.migracion_sicanet.entity.Sucursal;
import com.sc.sicanet.migracion_sicanet.repository.SocioRepository;
import com.sc.sicanet.migracion_sicanet.repository.SucursalRepository;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Root;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.sql.Date;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;

@Service
public class SocioServiceImpl implements SocioService {
    @Autowired
    private SocioRepository socioRepository;

    @Autowired
    private SucursalRepository sucursalRepository;

    @PersistenceContext
    private EntityManager entityManager;

    public Socio guardarSocio(Socio socio){
        agregarDatos(socio);
        return socioRepository.save(socio);
    }

    @Override
    public Map<String, String> recuperarSocio(Persona persona) {
        String referenciaSocio = "";
        String nombreSocio = "";
        Map<String, String> socioRecuperado = new HashMap<>();
        Optional<Socio> socio = socioRepository.findByPersona(persona);
        if(socio.isPresent()){
            referenciaSocio = socio.get().getReferenciaSocio();
            nombreSocio = persona.getNombre() + " " + persona.getApellidoPaterno() + " " + persona.getApellidoMaterno();
            socioRecuperado.put("referenciaSocio", referenciaSocio);
            socioRecuperado.put("nombreSocio", nombreSocio);
            return socioRecuperado;
        } else {
            return  null;
        }
    }

    public Socio agregarDatos(Socio socio){
        LocalDateTime fechaActual = LocalDateTime.now();
        LocalDate fechaAlta = LocalDate.now();
        Date fechaBaja = Date.valueOf("1900-01-01");

        socio.setFechaRegistro(fechaActual);
        socio.setFechaModificacion(fechaActual);
        socio.setRefenciaSocio("");
        socio.setNumeroSerieFiel("");
        socio.setEstatus("A");
        socio.setTipoSocio("A");
        socio.setFechaAlta(fechaAlta);
        socio.setFechaBaja(fechaBaja);
        socio.setDispositivo("API Migracion");
        socio.setObservacionEjecutivo("");
        socio.setNumeroIdentificacionFiscal("");
        socio.setSucursal(1);
        socio.setFkCatUsuario(1);
        socio.setRefenciaSocio(referenciaSocio(socio));

        return socio;
    }

    public String referenciaSocio(Socio socio){
        String refenciaSocio = "";
        String consecutivo = "";

        Optional<Sucursal> sucursal = sucursalRepository.findByPkEmpresa(socio.getSucursal());

        if (sucursal.isPresent()) {
            CriteriaBuilder cb = entityManager.getCriteriaBuilder();
            CriteriaQuery<Long> query = cb.createQuery(Long.class);
            Root<Socio> root = query.from(Socio.class);
            query.select(cb.count(root)).where(cb.equal(root.get("sucursal"), socio.getSucursal()));
            Long totalSocios = entityManager.createQuery(query).getSingleResult();

            consecutivo = String.format("%06d", totalSocios + 1);

            refenciaSocio = sucursal.get().getPrefijo() + "-" + consecutivo;
        }

        return refenciaSocio;
    }
}
