package com.dacrt.SBIABackend.security.service;


import java.text.Normalizer;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.transaction.Transactional;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

import com.dacrt.SBIABackend.security.repository.AuditRepository;
import com.dacrt.SBIABackend.security.repository.ParamsRepository;
import com.dacrt.SBIABackend.dto.TypesUnitDto;
import com.dacrt.SBIABackend.security.dto.RespuestaMsgDto;
import com.dacrt.SBIABackend.security.entity.Params;


@Service
@Transactional
public class ParamsService {
	
	Logger logger = LoggerFactory.getLogger(ParamsService.class);
	@Autowired
	ParamsRepository paramsRepository;
	
	@PersistenceContext
    private EntityManager entityManager;
	
	@Autowired
    private JdbcTemplate jdbcTemplate;
	
	@Value("${spring.datasource.url}")
	private String conexion;
	
	@Value("${spring.datasource.username}")
	private String userbd;
	
	@Value("${spring.datasource.password}")
	private String passbd;
	
	
	


         public boolean existsById(Integer id_tipoinsumo) {
	         return paramsRepository.existsById(id_tipoinsumo);
           }
         
         
     	public Params getParamsByid(Integer id) {
     		Params tipoInsumo = paramsRepository.findById(id).orElseThrow(() ->
              		new IllegalArgumentException("No se encontro el parametro con id: " + id));
     		 return tipoInsumo;
     	}
     	
     	
    	public Params addIdParams(Params tipoParams) {
    		return paramsRepository.save(tipoParams);
    		
    	}
    	
    	 public static String quitarAcentosJava(String texto) {
		        if (texto == null || texto.isEmpty()) {
		            return texto; // Devuelve el texto tal cual si es nulo o vacío
		        }

		        // 1. Normaliza el texto a la forma NFD (Forma de Descomposición Canónica).
		        // Esto separa los caracteres base de sus diacríticos (ej. 'é' se convierte en 'e' + '´')
		        String textoNormalizado = Normalizer.normalize(texto, Normalizer.Form.NFD);

		        // 2. Elimina los caracteres diacríticos.
		        // La expresión regular "\\p{InCombiningDiacriticalMarks}+" busca todos los diacríticos combinantes.
		        // `+` significa uno o más.
		        String textoSinAcentos = textoNormalizado.replaceAll("\\p{InCombiningDiacriticalMarks}+", "");

		        // 3. Opcional: Eliminar caracteres que no sean letras, números o espacios (si es necesario)
		        // Por ejemplo, para eliminar la 'ñ' si no se manejó como diacrítico o si quieres simplificar aún más.
		        // Esto es útil si quieres un texto puramente ASCII.
		        // textoSinAcentos = textoSinAcentos.replaceAll("[^\\p{Alnum}\\s]", "");

		        return textoSinAcentos;
		    }
    	 
    	 
    	 public int converttoMinute(String filterIn,int cantidad) {
		        if (filterIn == null || filterIn.isEmpty()) {
		            return 0; // Devuelve el texto tal cual si es nulo o vacío
		        }
                 
		        String filterOut="";
		        String valueOut="";
		        int quantitytotal;
		        
		         String query= " SELECT elemento ->> 'filter' AS filter,elemento ->> 'value' AS valor "
		         		+ "FROM main.params p, jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento "
		         		+ "WHERE paramname = 'EVALPROC_PERIOD' AND elemento ->> 'value' = " + "'" + filterIn + "'";
		      
		         Query queryPeriodo = entityManager.createNativeQuery(query);
		         Long cuantosregistro = (long) queryPeriodo.getResultList().size();		
		         
		         if (cuantosregistro>0) { 
			       List<Object[]> listaperiodos= queryPeriodo.getResultList();
			       
			       for (Object[] typesperi : listaperiodos) {
			    	  // detallePeriodos = new TypesUnitDto();
			    	  
			    	   filterOut = (String) typesperi[0];
			    	    valueOut = (String) typesperi[1];
			    	  // detallePeriodos.setDsc((String) typesperi[0]);
			    	  // detallePeriodos.setValue((String) typesperi[1]);
			    	   //listasPeriodos.add(detallePeriodos);
			       }
			       int filterOutInt = Integer.parseInt(filterOut);
			       int valueOutInt = Integer.parseInt(valueOut);
			       
			     
			         quantitytotal = cantidad*filterOutInt;
			       
		         } else 
		         {
		        	 quantitytotal=-1;
		         }
			       
			      /* int filterOutInt = Integer.parseInt(filterOut);
			       int valueOutInt = Integer.parseInt(valueOut);
			       
			       switch (valueOutInt) { 
				    case 1:  //ordena por name ascendente
				    	
				    	quantitytotal = cantidad*filterOutInt;
				     break;
				    case 2://ordena por status ascendente
				    	
				    	quantitytotal = cantidad*filterOutInt;
				     break;		
				     
                 case 3://ordena por status ascendente
				    	
                	 quantitytotal = cantidad*filterOutInt;
				     break;
				     
				    default:	// viene con el parametro para buscar por el like		   			    				    	
				    	quantitytotal = 0;
				 
				    
				   }*/
				
	
                  
		        return quantitytotal;
		    }
 	 
    	 
    	/* SELECT elemento ->> 'dsc' AS descr, elemento ->> 'value' AS valor
    	 FROM main.params p, jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento
    	 WHERE paramname = 'EVALPROC_PERIOD' AND elemento ->> 'value' = '2'
    	 ORDER BY valor ASC;*/
}
