package com.dacrt.SBIABackend.controler;

import java.io.PrintWriter;

import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Optional;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import com.dacrt.SBIABackend.dto.CampaignFormat2Dto;
import com.dacrt.SBIABackend.dto.ChannelsAmountDto;
import com.dacrt.SBIABackend.dto.ChannelsDtoStatus;
import com.dacrt.SBIABackend.dto.ChannelsRecordDto;
import com.dacrt.SBIABackend.dto.RecordCatalogoResponseDto;
import com.dacrt.SBIABackend.dto.RiskFactorsElementDto;
import com.dacrt.SBIABackend.dto.RiskFactorsEntryRecordDto;
import com.dacrt.SBIABackend.dto.RiskFactorsRecordDto;
import com.dacrt.SBIABackend.dto.ServiceOffersDescDto;
import com.dacrt.SBIABackend.dto.StatusDto;
import com.dacrt.SBIABackend.dto.StatusDto2;
import com.dacrt.SBIABackend.dto.TypesUnitDto;
import com.dacrt.SBIABackend.dto.requestDto.ChannelsRequestDto;
import com.dacrt.SBIABackend.dto.requestDto.RiskFactorElementDto;
import com.dacrt.SBIABackend.dto.requestDto.RiskFactorRequestDto;
import com.dacrt.SBIABackend.dto.responseDto.ChannelsResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.RickEntryRespondeDto;
import com.dacrt.SBIABackend.dto.responseDto.RiskCategoryResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.RiskFactorsResponseDto;
import com.dacrt.SBIABackend.repository.ChannelsRepository;
import com.dacrt.SBIABackend.repository.RiskfactorelementsRepository;
import com.dacrt.SBIABackend.repository.RiskfactorsRepository;
import com.dacrt.SBIABackend.repository.SuppliersRepository;
import com.dacrt.SBIABackend.security.dto.AuditRequestDto;
import com.dacrt.SBIABackend.security.dto.ParamsDto;
import com.dacrt.SBIABackend.security.dto.ParamsResponseDto;
import com.dacrt.SBIABackend.security.dto.PrivilegesAllDto;
import com.dacrt.SBIABackend.security.dto.PrivilegesDto;
import com.dacrt.SBIABackend.security.dto.RespuestaDto;
import com.dacrt.SBIABackend.security.dto.RespuestaMsgDto;
import com.dacrt.SBIABackend.security.dto.RespuestaValueDto;
import com.dacrt.SBIABackend.security.dto.RoleDto;
import com.dacrt.SBIABackend.security.dto.UsersListDto;
import com.dacrt.SBIABackend.security.entity.Params;
import com.dacrt.SBIABackend.security.entity.Roles;
import com.dacrt.SBIABackend.entity.Channels;
import com.dacrt.SBIABackend.entity.Riskfactorelements;
import com.dacrt.SBIABackend.entity.Riskfactors;
import com.dacrt.SBIABackend.security.entity.Users;
import com.dacrt.SBIABackend.security.repository.AuditRepository;
import com.dacrt.SBIABackend.security.repository.ParamsRepository;
import com.dacrt.SBIABackend.security.repository.RolesPrivilegesRepository;
import com.dacrt.SBIABackend.security.repository.UsersRepository;
import com.dacrt.SBIABackend.security.service.MenuService;
import com.dacrt.SBIABackend.security.service.ParamsService;
import com.dacrt.SBIABackend.security.service.SecurityService;
import com.dacrt.SBIABackend.security.service.UsersService;
import com.dacrt.SBIABackend.service.ChannelsService;
import com.dacrt.SBIABackend.service.RiskfactorelementsService;
import com.dacrt.SBIABackend.service.RiskfactorsService;
import com.dacrt.SBIABackend.utils.HttpReqRespUtils;

@Valid
@RestController
@CrossOrigin(origins = "*")
public class RiskfactorsController {
	

	@Autowired
	private ParamsRepository paramsRepository;
	
	@Autowired
	private UsersRepository usersRepository;
	
	@Autowired
	private AuditRepository auditRepository;
	
	@Autowired
	private ChannelsRepository channelsRepository;
	
	@Autowired
	private RolesPrivilegesRepository rolesPrivilegesRepository;
	
	@Autowired
	UsersService usersService;
	
	@Autowired
	ParamsService paramsService;
	
	@Autowired
	ChannelsService channelsService;
	
	@Autowired
	SecurityService securityService;
	
	@Autowired
	MenuService menuService;
	
	@PersistenceContext
    private EntityManager entityManager;
	
	@Autowired
	SuppliersRepository suppliersRepository;
	
	@Autowired
	RiskfactorsRepository riskfactorsRepository;
	
	@Autowired
	RiskfactorelementsRepository riskfactorelementsRepository;
	
	@Autowired
	RiskfactorsService riskfactorsService; 
	
	@Autowired
	RiskfactorelementsService riskfactorelementsService; 
	
	@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;

	@PostMapping("/riskfactors")
	public ResponseEntity<?> listriskfactors(HttpServletRequest request,HttpServletResponse response,@RequestBody UsersListDto tiposfiltros) throws ParseException, UnsupportedEncodingException {
		RespuestaDto respuesta = new RespuestaDto("", false);
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		ChannelsRecordDto channelsRecordDto = new ChannelsRecordDto();
		RiskFactorsRecordDto riskRecordDto = new RiskFactorsRecordDto();
		RecordCatalogoResponseDto channelsFormatResponseDto = new RecordCatalogoResponseDto();
		CampaignFormat2Dto detalleCompaing2;
		int formatList = 0;
	//	ParamsDto detalleParams;
		CampaignFormat2Dto detalleSuppliers;
		RiskFactorsElementDto detalleRiskFactorsElementDto;
		List<RiskFactorsElementDto> listasRiskFactorsElementDto= new ArrayList<>();
		RiskFactorsRecordDto detalleRiskFactorsRecordDto;
		List<RiskFactorsRecordDto> listasRiskFactorsRecordDto= new ArrayList<>();
		//RiskFactorsResponseDto detalleRiskFactorsResponseDto;
		RiskFactorsResponseDto riskFactorsResponseDto = new RiskFactorsResponseDto();
		 
		StatusDto2 detalleStatus;
		StatusDto2 detalleType;
		StatusDto2 detalleScenery;
		StatusDto detalleStatus2;
		
		StatusDto2 detallecapacityperiod;
		ServiceOffersDescDto detalleserviceoffers;
		RiskFactorsElementDto detalleElements;
		List<TypesUnitDto> listasTypes = new ArrayList<>();
		List<ServiceOffersDescDto> listasOfertas = new ArrayList<>();
		List<RiskFactorsElementDto> listasElementos = new ArrayList<>();
		
		PrivilegesAllDto detallePrivilege;
		
	     
	     Long cuantosregistro = (long) 0;
	     
	     List<PrivilegesAllDto> listasPrivelege = new ArrayList<>();
	     List<ChannelsRecordDto> listasRecord= new ArrayList<>();
	     List<RiskFactorsRecordDto> listasRecordRisk= new ArrayList<>();
	     TypesUnitDto detalleTypes;
	     TypesUnitDto detallePeriodos;
	     List<TypesUnitDto> listasPeriodos = new ArrayList<>();
		 
		 String sessionid = request.getHeader("Authorization");
		  Date fecha = new Date();
		    SimpleDateFormat  formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	        String dataFormattata = formatter.format(fecha);
	        Date fechaDate = formatter.parse(dataFormattata);
	        AuditRequestDto  auditDto=new AuditRequestDto();
	       
	        String groupby = "";
	     
	      boolean mostraTodo = false; 
	      int idrol;
	   	  String searchIn = "";
	   	  String contentIn = "";
	     // String searchModule = "";
		  int searchStatus = 0;
		  int typeIn=0;
		  String fechaComoCadena; 
		 int orderIn = 0;
		 int offsetIn = 0;
		 int numofrecordsIn = 0;
		 Date fecha2 = new Date();
		
			if (sessionid==null) {
				String var = "";
				boolean bloked = false;
				RespuestaDto respuestaDto = new RespuestaDto(var, bloked);
				respuestaDto.setBlocked(bloked);
				respuestaDto.setMsg("Sesión expirada o inválida");
				//Error 400
				return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
			} else   {
				 
				   sessionid = sessionid.substring(7);
				   Optional<Users> encontreSessionUsuario =usersRepository.getBySessionid(sessionid);
				//   String usuarioIN = encontreSessionUsuario.get().getUsr();
				 //  int position = usuarioIN.indexOf('('); 
				   
				   if (encontreSessionUsuario.isPresent()) {
					   
					   Date FechaReg = encontreSessionUsuario.get().getValidthru(); 

					   //fechaComoCadena  = securityService.consultarSessionActiva(FechaReg,fecha2);
					   fechaComoCadena  = securityService.consultarSessionActiva(FechaReg,fecha2,encontreSessionUsuario.get().getId());
           
					    if (fechaComoCadena=="") {
						   
						   
						   
						   String var = "";
							boolean bloked = false;
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							//respuestaDto.setBlocked(bloked);
							respuestaDto.setMsg("Sesión expirada o inválida"); 
							return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);
						   
					    }
					    formatList = tiposfiltros.getFormat();
					    mostraTodo = tiposfiltros.getFilters().isShowall();
					    
					    try {
					        if (formatList==0) {
					    	   formatList = 1;
					        } else {
					    	formatList = tiposfiltros.getFormat();
					       }
					    }catch (Exception e) {
					    	formatList = 1;
					    }
					    
					  
					    
					  // Este proceso permite obtener un listado de los proveedores. (Priv 440)
					   Roles roles = encontreSessionUsuario.get().getRolid();
					   idrol = roles.getId();
					   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 800);
					   if (formatList!=2) {
					  // if (!mostraTodo) {
					        if (rolisvalid==0) {
						   
						   String var = "";
							boolean bloked = false;
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							//respuestaDto.setBlocked(bloked);
							respuestaDto.setMsg("No tiene los Privilegios"); 
							return new ResponseEntity(respuestaDto, HttpStatus.FORBIDDEN);
					        }	
					    }
						 // searchIn = tiposfiltros.getFilters().getSearch();
						  searchIn = tiposfiltros.getFilters().getSearch();
						  
						  String Salida = usersService.verificarCaracteresValidosConRegex(searchIn);
						  
						  if (Salida=="NOOK") {
							  String var = "";
								boolean bloked = false;
								RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
								//respuestaDto.setBlocked(bloked);
								respuestaDto.setMsg("Caracteres no permitidos en la busqueda"); 
								return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
						  }
						 
						       
						   searchIn = usersService.eliminarAcentosService(tiposfiltros.getFilters().getSearch());
						   searchStatus = tiposfiltros.getFilters().getStatus();
					
						  orderIn = tiposfiltros.getOrder();
						  offsetIn = tiposfiltros.getOffset();
						  numofrecordsIn = tiposfiltros.getNumofrecords();
						  contentIn = tiposfiltros.getContent();
						  
						  
						  try {
							  typeIn= tiposfiltros.getFilters().getSceneryid();
								 if (typeIn==0) {
									  typeIn = 0;
								  }
								  
							  }  catch (Exception e) { 
								  
								  typeIn = 0;
								  
							  }
							
						  
						  if (contentIn !=null) {
						     menuService.iscontentdiffnull(contentIn, encontreSessionUsuario.get().getId());
						  }
						 
					
					
				 } else {
						String var = "";
						boolean bloked = false;
						RespuestaDto respuestaDto = new RespuestaDto(var, bloked);
						respuestaDto.setBlocked(bloked);
						respuestaDto.setMsg("Sesión expirada o inválida");
						//Error 400
						return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);
				 }
			}
			
			
		
		try {
			
			String SentenciaBase;
			/*if (formatList==2) {	
				   SentenciaBase = "SELECT  new com.dacrt.SBIABackend.dto.ChannelsDtoStatus "
							+ " (f.id,  f.name, f.status, "
							+ "	 CASE "
							+ "	WHEN f.status = 1 THEN 'Activo' "
							+ "	ELSE 'Inactivo' "
							+ "	END AS estatus ) "
							+ "	FROM "
							+ "	Riskfactors f ";
				} else { */
				SentenciaBase = " SELECT  "
						+ "    f.id,  "
						+ "    f.name,  "
						+ "    f.category,  "
						+ "    f.scenery,  "
						+ "    f.status,  "
						+ " CASE WHEN f.status = 1 THEN 'Activo' ELSE 'Inactivo' END AS estatus, "
						+ "    pr.descr AS scenery_name, "
						+ "    cast(COUNT(e.id) as Integer ) AS totalelementos,    "
						+ "    STRING_AGG(e.name, ',') AS elementos, "
						+ "    STRING_AGG(CAST(e.id AS TEXT), ',') AS idelemento,  "
						+ "    STRING_AGG(CAST(e.weight AS TEXT), ',') AS weights  "
						+ " FROM main.riskfactors f "
						+ " LEFT JOIN main.riskfactorelements e ON f.id = e.riskfactorid "
						+ " LEFT JOIN ( "
						+ "    SELECT  "
						+ "        elemento ->> 'dsc' AS descr, "
						+ "        elemento ->> 'value' AS valor  "
						+ "    FROM main.params p, "
						+ "    jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento "
						+ "    WHERE p.paramname = 'RISK_SCENERIES' "
						+ " ) pr ON f.scenery = CAST(pr.valor AS integer)  ";
				 groupby = " GROUP BY f.id, f.name, f.category, f.scenery, f.status, f.createdat, f.modifiedat, pr.descr ";
			//}
				
						
				
				Query query;
				 String QueryTotal;
			
			String name = "f.name";
			String status = "f.status";				
			String lowername = "main.sinacentos(LOWER(f.name))";
			String lowercategory = "main.sinacentos(LOWER(f.category))";
			String lowerdscParams = "main.sinacentos(LOWER(pr.descr))";
			String LowerSearch = searchIn.toLowerCase();
			
			 switch (searchIn) { 
			    case "":  // viene sin busqueda por el like
			    	
			    	QueryTotal = SentenciaBase  + " WHERE TRUE = TRUE";
			     break;
			  
			    default:	// viene con el parametro para buscar por el like		
			    	  // if (formatList==1) {
			    		   //mostraTodo
			    	//   if (formatList==1) {	   
			         	    QueryTotal = SentenciaBase + " WHERE (" + lowername + " LIKE  " + "'%" + LowerSearch + "%'"  + " OR " +  lowercategory + " LIKE " + "'%" + LowerSearch + "%' " + " OR " + lowerdscParams + " LIKE " + "'%" + LowerSearch + "%')";
			    	 //  } else {
			    	  //      QueryTotal = SentenciaBase + " WHERE " + lowername + " LIKE  " + "'%" + LowerSearch + "%'";
			    	  // }
			    	
	         }
			 
			 switch (searchStatus) { 
			    case 0:  // Busca por cualquier estatus
			    	QueryTotal = QueryTotal;
			     break;
			    case 1:  // Busca por estatus activo
			    	
			    	QueryTotal = QueryTotal  + " AND " + status + " = " + searchStatus;
			     break;
			    case 2:  // Busca por estatus Inactivo
			    	
			    	//QueryTotal = QueryTotal  + " AND " + status + " = " + searchStatus;
			    	QueryTotal = QueryTotal  + " AND " + status + " = " + 0;
			     break;
			  
			    default:	// viene con el parametro para buscar por el like		   			    				    	
			    	String var2 = "";
					boolean bloked = false;
					RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
					respuestaDto= new RespuestaMsgDto("Error interno del servidor");
					estatus=HttpStatus.INTERNAL_SERVER_ERROR;   
					return new ResponseEntity(respuestaDto, estatus);
			    	
	         }
			 
		// if (formatList==1) {
				 
			    switch (typeIn) { 
			    case 0:  // Busca por cualquier estatus
			      	QueryTotal = QueryTotal;
			     break;
			    case 1:  // Busca por estatus activo
			    	
			    	QueryTotal = QueryTotal  + " AND " + " f.scenery " + " = " + typeIn;
			     break;
			    case 2:  // Busca por estatus Inactivo
			    	
			    	//QueryTotal = QueryTotal  + " AND " + status + " = " + searchStatus;
			    	QueryTotal = QueryTotal  + " AND " + " f.scenery " + " = " + typeIn;
			     break;
			     
                 case 3:  // Busca por estatus Inactivo
			    	
			    	//QueryTotal = QueryTotal  + " AND " + status + " = " + searchStatus;
			    	QueryTotal = QueryTotal  + " AND " +  " f.scenery " + " = " + typeIn;
			     break;
                 case 4:  // Busca por estatus Inactivo
 			    	
 			    	//QueryTotal = QueryTotal  + " AND " + status + " = " + searchStatus;
 			    	QueryTotal = QueryTotal  + " AND " +  " f.scenery " + " = " + typeIn;
 			     break;
                 case 5:  // Busca por estatus Inactivo
 			    	
 			    	//QueryTotal = QueryTotal  + " AND " + status + " = " + searchStatus;
 			    	QueryTotal = QueryTotal  + " AND " +  " f.scenery " + " = " + typeIn;
 			     break;
			    default:	// viene con el parametro para buscar por el like		   			    				    	
			    	String var2 = "";
					boolean bloked = false;
					RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
					respuestaDto= new RespuestaMsgDto("Error interno del servidor");
					estatus=HttpStatus.INTERNAL_SERVER_ERROR;   
					return new ResponseEntity(respuestaDto, estatus);
			    	
	         }
		     
		 //}	 
			    
	   //  if (formatList==1) {
		      QueryTotal = QueryTotal + groupby;
		      query = entityManager.createNativeQuery(QueryTotal);
	   //  } else {
	   // 	  QueryTotal = QueryTotal;
	   //  }
			          	
			          
		   	         
			    	     			 			 			
			 
			 String ordena="";
			  if (orderIn == 1 || orderIn == 2 || orderIn == 3 || orderIn == 4 || orderIn == 5 || orderIn == 99) {
				  ordena = " ASC";
			 }  else if (orderIn == -1 || orderIn == -2 || orderIn == -3 || orderIn == -4 || orderIn == -5 || orderIn == -99) {
				  ordena = " DESC";
			 } else {
				 	String var2 = "";
					boolean bloked = false;
					RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
					respuestaDto= new RespuestaMsgDto("Error interno del servidor");
					estatus=HttpStatus.INTERNAL_SERVER_ERROR;   
					return new ResponseEntity(respuestaDto, estatus);
			 }		
			 int absolutoOrden = Math.abs(orderIn);			 			 			 			 
			 switch (absolutoOrden) { 
			    case 1:  //ordena por name ascendente
			    	
			    	QueryTotal = QueryTotal + " ORDER BY " + " pr.descr " + ordena + ", " + name + ordena  ;
			     break;
			    case 2://ordena por status ascendente
			    	
			    	QueryTotal = QueryTotal + " ORDER BY " + " f.category " + ordena;
			     break;	
                case 3:  //ordena por name ascendente
			    	
			    	QueryTotal = QueryTotal + " ORDER BY " + name + ordena;
			     break;
                case 4:  //ordena por name ascendente
 	
 	             QueryTotal = QueryTotal + " ORDER BY " + " totalelementos " + ordena;
                 break;
                case 5:  //ordena por name ascendente
                 	
    	             QueryTotal = QueryTotal + " ORDER BY "   + " estatus " + ordena;
                    break;
                case 99:   //ordena por status ascendente
                	
                    QueryTotal = QueryTotal + " ORDER BY " + " f.id " + ordena;
                break; 
			 
			    
			   }
	  
	if (formatList==1) {  
	     
		        if (!mostraTodo) {
				       query = entityManager.createNativeQuery(QueryTotal);
				       cuantosregistro = (long) query.getResultList().size();	
				       query.setFirstResult(offsetIn);
					   query.setMaxResults(numofrecordsIn);
					   List<Object[]> listacompleta = query.getResultList();
				
					//   cuantosregistro = (long) query.getResultList().size();	
			   
		    	   List<CampaignFormat2Dto> listasSuppliers = new ArrayList<>();
		    	   detalleSuppliers = new CampaignFormat2Dto();
		    	  
		    		 for (Object[] reg : listacompleta) {	   
		    		   detalleSuppliers = new CampaignFormat2Dto();
		    		   channelsRecordDto = new ChannelsRecordDto();
		    		   riskRecordDto = new RiskFactorsRecordDto();
		    		   detalleStatus = new StatusDto2();
		    		   detalleScenery = new StatusDto2();
		    		  
		    		   detallecapacityperiod = new StatusDto2();
		    		   detalleserviceoffers = new ServiceOffersDescDto();
		    		   
		    		
		    		   ///////////////////////llenando el scenery//////////////////
		    		   detalleScenery.setId((int) reg[3]);
		    		   detalleScenery.setName((String) reg[6]);
		    		   ///////////////////////////////////////////////////////
		    		   
		    		   /////////////////////llenando el estatus//////////////////////
		    		   detalleStatus.setId((int) reg[4]);
			    	   detalleStatus.setName((String) reg[5]);			    	   			    	   				 
			    	   
		    		   //////////////////////////////////////////////////////////////
		    		   //////////////////comienzo a llenar el dto de factores de riesgo///////////////////
		    		   riskRecordDto.setId((int) reg[0]);
		    		   riskRecordDto.setName((String) reg[1]);
		    		   riskRecordDto.setCategory((String) reg[2]);
		    		   riskRecordDto.setScenery(detalleScenery);
		    		   riskRecordDto.setStatus(detalleStatus);
		    		   //////////////////////////////////////////////////////////////////////////////
		    		
			    	     
			    	       String NameElements = (String) reg[8]; // AQUI VIENEN LOS ID DE LAS OFERTAS ASOCIADAS
			    		   String IdElements = (String) reg[9]; // AQUI VIENEN LOS NOMBRES DE LAS  OFERTAS ASOCIADAS
			    		   String WeigthElements = (String) reg[10]; // AQUI VIENEN LOS TIPOS DE OFERTAS ASOCIADAS, INDICATIVO DE SI SON 24X7
			    		   
			    		   
			    		   if (NameElements != null && !IdElements.isEmpty()) {
						    	
						        String[] Idelements = IdElements.split(",");
						        String[] Nameelements = NameElements.split(",");
						        String[] Weigthelements = WeigthElements.split(",");
						        int i = 0;
						       
						        listasElementos = new ArrayList<>();
						        for (String ofeId : Idelements) {
						        	
						        	detalleElements= new  RiskFactorsElementDto();
						        	String NombreEle = Nameelements[i];
						        	String IdEle = Idelements[i];
						        	String WeigthEle = Weigthelements[i];
						        	
					    	          detalleElements.setId(Integer.parseInt(IdEle));
					    	          detalleElements.setName(NombreEle);
					    	          //detalleElements.setWeight(WeigthEle);
					    	          if (WeigthEle != null && !WeigthEle.isEmpty()) {
					    	              detalleElements.setWeight(new BigDecimal(WeigthEle));
					    	          } else {
					    	              detalleElements.setWeight(BigDecimal.ZERO);
					    	          }
					    	          //detalleElements.setWeight(Integer.parseInt(WeigthEle));					    	    					    	         
							    	  
					    	          listasElementos.add(detalleElements);
						        	i = i+1;
						        }
						    }  else {
						    	listasElementos = new ArrayList<>();
						    	detalleElements = new RiskFactorsElementDto();
						    	
						    }				    		   
			    	        			     
			    		   riskRecordDto.setElements(listasElementos);		    		 
			    		   listasRecordRisk.add(riskRecordDto);
		    	   }
		    	
		    	   
      	    	 	detallePrivilege = new PrivilegesAllDto();
      	    	       boolean tieneView = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,800);
					   boolean tieneUpdate = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,801);
					   boolean tieneAdd = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,802);
					   boolean tieneDelete = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,803);
					   //existsByRolidAndPrivilegeid
					   
	      	    	 	detallePrivilege.setView(tieneView);
			    	  	detallePrivilege.setUpdate(tieneUpdate);		    	  
			    	  	detallePrivilege.setAdd(tieneAdd);
			    	  	detallePrivilege.setDelete(tieneDelete);
			    	  	
			    	  	
			    	  	 String SetenciaSceneries="";
							
			    	  	SetenciaSceneries= "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 = 'RISK_SCENERIES' ORDER BY valor ASC";
					      
					      Query queryTypes = entityManager.createNativeQuery(SetenciaSceneries);
					       List<Object[]> listasceneries= queryTypes.getResultList();
					       for (Object[] types : listasceneries) {
					    	   detalleTypes = new TypesUnitDto();
					    	  
					    	   detalleTypes.setDsc((String) types[0]);
					    	   detalleTypes.setValue((String) types[1]);
					    	   listasTypes.add(detalleTypes);
					       }
		    	          
					       riskFactorsResponseDto.setNumofrecords(cuantosregistro); 
					       riskFactorsResponseDto.setSessionvalidthru(fechaComoCadena);
					       riskFactorsResponseDto.setRecords(listasRecordRisk);
					       riskFactorsResponseDto.setPrivileges(detallePrivilege);
					       riskFactorsResponseDto.setSceneries(listasTypes);
		    	   	    	   			
		  						           
                return ResponseEntity.ok(riskFactorsResponseDto);
		     						
			 } else {
				 
				 
				 query = entityManager.createNativeQuery(QueryTotal);
			       cuantosregistro = (long) query.getResultList().size();	
			       query.setFirstResult(offsetIn);
				   query.setMaxResults(numofrecordsIn);
				  // List<Object[]> listacompleta = query.getResultList();
				   List<Object[]> resultados = query.getResultList();
				 String unit ="FACTORES DE RIESGO";
		         response.setContentType("text/csv");
			     response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"Tipos_de_Factores_de_Riesgo.csv\"");
			 try (PrintWriter writer = response.getWriter();
            // CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT.withHeader( "UNIDADES", "PROCESOS" , "IM" , "AT" ,  "PR" , "RV" , "PC" ,  "IN" , "RR" ))) {
					 CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT.withHeader("ESCENARIO", "CATEGORIA", "NOMBRE", "ELEMENTOS", "ESTATUS"))) {
			     
			        if (cuantosregistro > 0) {
						for (Object[] filaformat2 : resultados) {   
							 String cadenaescenario="";
							 String cadenacategoria="";
							 String cadenanombre = "";
							 int cadenaelementos =0;
							 String cadenaestatus = "";
							///////////////seteando el escenario////////////////////
							 cadenaescenario = (String) filaformat2[6];
							 cadenaescenario = cadenaescenario.replace(',', ' ');
			             	///////////////seteando la categoria////////////////////
							 cadenacategoria = (String) filaformat2[2];
							 cadenacategoria = cadenacategoria.replace(',', ' ');
				             ///////////////seteando el name////////////////////
							 cadenanombre = (String) filaformat2[1];
							 cadenanombre = cadenanombre.replace(',', ' ');
				             ///////////////seteando la cantidad de elemento////////////////////
							 cadenaelementos = (int) filaformat2[7];
							// cadenaelementos = cadenaelementos.replace(',', ' ');
							  ///////////////seteando el estatus////////////////////
							 cadenaestatus = (String) filaformat2[5];
							 cadenaestatus = cadenaestatus.replace(',', ' ');
		                  
		                   
		                     
		                 // }
                        String Imprimir = "\"" + cadenaescenario+ "\""  + "," + "\""+ cadenacategoria +"\"" + "," + "\"" + cadenanombre + "\"" + "," + "\"" + cadenaelementos + "\""  + "," + "\""+cadenaestatus+"\"" ;
                      csvPrinter.printRecord(Imprimir);
						}
						csvPrinter.flush();
					}  
			        return new ResponseEntity(HttpStatus.OK);
              
             }

			 }  
	}  else {   ///genero el listado con el formatlist tipo 2
		  query = entityManager.createNativeQuery(QueryTotal);
	       cuantosregistro = (long) query.getResultList().size();	
	       query.setFirstResult(offsetIn);
		   query.setMaxResults(numofrecordsIn);
		   List<Object[]> listacompleta = query.getResultList();
		   List<CampaignFormat2Dto> listasSuppliers2 = new ArrayList<>();
		  
		   for (Object[] reg : listacompleta) {
   		       detalleCompaing2 = new CampaignFormat2Dto();
   		 
   		       detalleStatus2 = new StatusDto();
   		       detalleCompaing2.setId((int) reg[0]);
   		       detalleCompaing2.setName((String) reg[1]);
   		   
   		   
   		        detalleStatus2.setId((int) reg[4]);
	    	    detalleStatus2.setName((String) reg[5]);
		     
	    	   detalleCompaing2.setStatus(detalleStatus2);
	    	  // detalleSuppliers.setStatus(detalleStatus);
	    	   
	    	   listasSuppliers2.add(detalleCompaing2);
   	   }
		  
		       
		          channelsFormatResponseDto.setSessionvalidthru(fechaComoCadena);		           
		          channelsFormatResponseDto.setRecords(listasSuppliers2);
	  						           
           return ResponseEntity.ok(channelsFormatResponseDto);
	}      
	
		} catch (Exception e) {
            // Manejo de excepciones
			respuesta= new RespuestaDto("Error interno del servidor", false);
			estatus=HttpStatus.INTERNAL_SERVER_ERROR;            
        } finally {
	        if (entityManager != null && entityManager.isOpen()) {
	            entityManager.close();
	        }
	    }
		
		return new ResponseEntity(respuesta, estatus);
	
	}

	
	//	@GetMapping("/channels/{channelid}")
	//public ResponseEntity<?> getOneVP(HttpServletRequest request, @PathVariable("channelid") final Integer channelid) throws ParseException {
	
	@GetMapping("/riskfactors/{riskfactorid}")
	public ResponseEntity<?> getoneriskfactors(HttpServletRequest request, @PathVariable("riskfactorid") final Integer riskfactorid) throws ParseException {
		RespuestaDto respuesta = new RespuestaDto("", false);
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		ChannelsRecordDto channelsRecordDto = new ChannelsRecordDto();
		RiskFactorsEntryRecordDto riskRecordDto = new RiskFactorsEntryRecordDto();
		RecordCatalogoResponseDto channelsFormatResponseDto = new RecordCatalogoResponseDto();
		CampaignFormat2Dto detalleCompaing2;
	//	ParamsDto detalleParams;
		RiskFactorsElementDto detalleRiskFactorsElementDto;
		
		
		RickEntryRespondeDto detalleRickEntryRespondeDto=null;
		RiskFactorsRecordDto detalleRiskFactorsRecordDto;
		List<RiskFactorsRecordDto> listasRiskFactorsRecordDto= new ArrayList<>();
		 
		StatusDto2 detalleStatus;
		StatusDto2 detalleType;
		StatusDto2 detalleScenery;
		StatusDto detalleStatus2;
		
		StatusDto2 detallecapacityperiod;
		ServiceOffersDescDto detalleserviceoffers;
		RiskFactorsElementDto detalleElements;
		List<TypesUnitDto> listasTypes = new ArrayList<>();
		List<ServiceOffersDescDto> listasOfertas = new ArrayList<>();
		List<RiskFactorsElementDto> listasElementos = new ArrayList<>();
		
	
	     
	     Long cuantosregistro = (long) 0;
	     
	     List<ChannelsRecordDto> listasRecord= new ArrayList<>();
	     List<RiskFactorsEntryRecordDto> listasRecordRisk= new ArrayList<>();
	     TypesUnitDto detalleTypes;
	     TypesUnitDto detallePeriodos;
	     List<TypesUnitDto> listasPeriodos = new ArrayList<>();
		 
		 String sessionid = request.getHeader("Authorization");
		  Date fecha = new Date();
		    SimpleDateFormat  formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	        String dataFormattata = formatter.format(fecha);
	        Date fechaDate = formatter.parse(dataFormattata);
	        AuditRequestDto  auditDto=new AuditRequestDto();
	       
	        
	     
	       
	      int idrol;
	   	  String searchIn = "";
	   	  String contentIn = "";
	     // String searchModule = "";
		  int searchStatus = 0;
		  int typeIn=0;
		  String fechaComoCadena; 
		 int orderIn = 0;
		 int offsetIn = 0;
		 int numofrecordsIn = 0;
		 Date fecha2 = new Date();
		
			if (sessionid==null) {
				String var = "";
				boolean bloked = false;
				RespuestaDto respuestaDto = new RespuestaDto(var, bloked);
				respuestaDto.setBlocked(bloked);
				respuestaDto.setMsg("Sesión expirada o inválida");
				//Error 400
				return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
			} else   {
				 
				   sessionid = sessionid.substring(7);
				   Optional<Users> encontreSessionUsuario =usersRepository.getBySessionid(sessionid);
				//   String usuarioIN = encontreSessionUsuario.get().getUsr();
				 //  int position = usuarioIN.indexOf('('); 
				   
				   if (encontreSessionUsuario.isPresent()) {
					   
					   Date FechaReg = encontreSessionUsuario.get().getValidthru(); 

					   //fechaComoCadena  = securityService.consultarSessionActiva(FechaReg,fecha2);
					   fechaComoCadena  = securityService.consultarSessionActiva(FechaReg,fecha2,encontreSessionUsuario.get().getId());
           
					    if (fechaComoCadena=="") {
						   
						   
						   
						   String var = "";
							boolean bloked = false;
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							//respuestaDto.setBlocked(bloked);
							respuestaDto.setMsg("Sesión expirada o inválida"); 
							return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);
						   
					    }
					
					  // Este proceso permite obtener un listado de los proveedores. (Priv 440)
					   Roles roles = encontreSessionUsuario.get().getRolid();
					   idrol = roles.getId();
					   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 800);
					
					        if (rolisvalid==0) {
						   
						   String var = "";
							boolean bloked = false;
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							//respuestaDto.setBlocked(bloked);
							respuestaDto.setMsg("No tiene los Privilegios"); 
							return new ResponseEntity(respuestaDto, HttpStatus.FORBIDDEN);
					        }	
					    
						  
						  String Salida = usersService.verificarCaracteresValidosConRegex(searchIn);
						  
						  if (Salida=="NOOK") {
							  String var = "";
								boolean bloked = false;
								RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
								//respuestaDto.setBlocked(bloked);
								respuestaDto.setMsg("Caracteres no permitidos en la busqueda"); 
								return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
						  }
						 
						       
						 
						
						  
						  if (contentIn !=null) {
						     menuService.iscontentdiffnull(contentIn, encontreSessionUsuario.get().getId());
						  }
						 
					
					
				 } else {
						String var = "";
						boolean bloked = false;
						RespuestaDto respuestaDto = new RespuestaDto(var, bloked);
						respuestaDto.setBlocked(bloked);
						respuestaDto.setMsg("Sesión expirada o inválida");
						//Error 400
						return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);
				 }
			}
			
			
		
		try {
			
			String SentenciaBase;
		    	// SentenciaBase = "SELECT new com.dacrt.SBIABackend.dto.ChannelsDtoStatus (u.id,u.name,u.status,CASE WHEN u.status = 1 then 'Activo' ELSE 'Inactivo' END AS estatus) FROM Channels u";
				
				SentenciaBase = " SELECT  "
						+ "    f.id,  "
						+ "    f.name,  "
						+ "    f.category,  "
						+ "    f.scenery,  "
						+ "    f.status,  "
						+ " CASE WHEN f.status = 1 THEN 'Activo' ELSE 'Inactivo' END AS estatus, "
						+ "    pr.descr AS scenery_name, "
						+ "    COUNT(e.id) AS totalelementos,  "
						+ "    STRING_AGG(e.name, ',') AS elementos, "
						+ "    STRING_AGG(CAST(e.id AS TEXT), ',') AS idelemento,  "
						+ "    STRING_AGG(CAST(e.weight AS TEXT), ',') AS weights,f.dsc  "
						+ " FROM main.riskfactors f "
						+ " LEFT JOIN main.riskfactorelements e ON f.id = e.riskfactorid "
						+ " LEFT JOIN ( "
						+ "    SELECT  "
						+ "        elemento ->> 'dsc' AS descr, "
						+ "        elemento ->> 'value' AS valor  "
						+ "    FROM main.params p, "
						+ "    jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento "
						+ "    WHERE p.paramname = 'RISK_SCENERIES' "
						+ " ) pr ON f.scenery = CAST(pr.valor AS integer)  "
						+ "  	 WHERE f.id =" + riskfactorid ;
					
				
				Query query;
				String groupby = " GROUP BY f.id, f.name, f.category, f.scenery, f.status, f.createdat, f.modifiedat, pr.descr ";
				
			      String QueryTotal = SentenciaBase + groupby;
							     							     			 			
				       query = entityManager.createNativeQuery(QueryTotal);
				       query.setFirstResult(offsetIn);
					   query.setMaxResults(numofrecordsIn);
					   List<Object[]> listacompleta = query.getResultList();
				
					   cuantosregistro = (long) query.getResultList().size();	
			   
		    	   List<CampaignFormat2Dto> listasSuppliers = new ArrayList<>();
		    	  
		    		 for (Object[] reg : listacompleta) {	   
		    		   riskRecordDto = new RiskFactorsEntryRecordDto();
		    		   detalleStatus = new StatusDto2();
		    		   detalleScenery = new StatusDto2();
		    		  
		    		   detallecapacityperiod = new StatusDto2();
		    		   detalleserviceoffers = new ServiceOffersDescDto();
		    		   
		    		
		    		   ///////////////////////llenando el scenery//////////////////
		    		   detalleScenery.setId((int) reg[3]);
		    		   detalleScenery.setName((String) reg[6]);
		    		   ///////////////////////////////////////////////////////
		    		   
		    		   /////////////////////llenando el estatus//////////////////////
		    		   detalleStatus.setId((int) reg[4]);
			    	   detalleStatus.setName((String) reg[5]);			    	   			    	   				 
			    	   
		    		   //////////////////////////////////////////////////////////////
		    		   //////////////////comienzo a llenar el dto de factores de riesgo///////////////////
		    		   riskRecordDto.setId((int) reg[0]);
		    		   riskRecordDto.setName((String) reg[1]);
		    		   riskRecordDto.setDsc((String) reg[11]);
		    		   riskRecordDto.setCategory((String) reg[2]);
		    		   riskRecordDto.setScenery(detalleScenery);
		    		   riskRecordDto.setStatus(detalleStatus);
		    		   //////////////////////////////////////////////////////////////////////////////
		    		
			    	     
			    	       String NameElements = (String) reg[8]; // AQUI VIENEN LOS ID DE LAS OFERTAS ASOCIADAS
			    		   String IdElements = (String) reg[9]; // AQUI VIENEN LOS NOMBRES DE LAS  OFERTAS ASOCIADAS
			    		   String WeigthElements = (String) reg[10]; // AQUI VIENEN LOS TIPOS DE OFERTAS ASOCIADAS, INDICATIVO DE SI SON 24X7
			    		   
			    		   
			    		   if (NameElements != null && !IdElements.isEmpty()) {
						    	
						        String[] Idelements = IdElements.split(",");
						        String[] Nameelements = NameElements.split(",");
						        String[] Weigthelements = WeigthElements.split(",");
						        int i = 0;
						       // listasUnits = new ArrayList<>();
						        //listasOfertas = new ArrayList<>();
						        listasElementos = new ArrayList<>();
						        for (String ofeId : Idelements) {
						        	
						        	detalleElements= new  RiskFactorsElementDto();
						        	String NombreEle = Nameelements[i];
						        	String IdEle = Idelements[i];
						        	String WeigthEle = Weigthelements[i];
						        	
					    	          detalleElements.setId(Integer.parseInt(IdEle));
					    	          detalleElements.setName(NombreEle);
					    	         // detalleElements.setWeight(Integer.parseInt(WeigthEle));
					    	          if (WeigthEle != null && !WeigthEle.isEmpty()) {
					    	              detalleElements.setWeight(new BigDecimal(WeigthEle));
					    	          } else {
					    	              detalleElements.setWeight(BigDecimal.ZERO);
					    	          }
					    	          
							    	  
					    	          listasElementos.add(detalleElements);
							    	  //listasOfertas
						        	i = i+1;
						        }
						    }  else {
						    	listasElementos = new ArrayList<>();
						    	detalleElements = new RiskFactorsElementDto();
						    	
						    }		
			    		   
			    	         			     
			    		   riskRecordDto.setElements(listasElementos);
			    		 
			    	
			    		   listasRecordRisk.add(riskRecordDto);
		    	   }		    			    	     	    
			    	  	
			    	  	 String SetenciaSceneries="";
							
			    	  	SetenciaSceneries= "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 = 'RISK_SCENERIES' ORDER BY valor ASC";
					      
					      Query queryTypes = entityManager.createNativeQuery(SetenciaSceneries);
					       List<Object[]> listasceneries= queryTypes.getResultList();
					       for (Object[] types : listasceneries) {
					    	   detalleTypes = new TypesUnitDto();
					    	  
					    	   detalleTypes.setDsc((String) types[0]);
					    	   detalleTypes.setValue((String) types[1]);
					    	   listasTypes.add(detalleTypes);
					       }
					       detalleRickEntryRespondeDto = new RickEntryRespondeDto();
					       detalleRickEntryRespondeDto.setEntry(riskRecordDto);
					       detalleRickEntryRespondeDto.setSceneries(listasTypes);
		    	   	      		   			
		  						           
                return ResponseEntity.ok(detalleRickEntryRespondeDto);
		     						
			 
	
		} catch (Exception e) {
            // Manejo de excepciones
			respuesta= new RespuestaDto("Error interno del servidor", false);
			estatus=HttpStatus.INTERNAL_SERVER_ERROR;            
        } finally {
	        if (entityManager != null && entityManager.isOpen()) {
	            entityManager.close();
	        }
	    }
		
		return new ResponseEntity(respuesta, estatus);
	
	}
	
	//Validad el mensaje de error y verifica si es por cantidad de caracteres superior al tamano del campo en base de datos
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<RespuestaMsgDto> handleValidationExceptions(MethodArgumentNotValidException ex) {
        // Extraemos el error del campo (ej. "dsc")
        FieldError error = ex.getBindingResult().getFieldError();
        String campoCulpable = (error != null) ? error.getField() : "desconocido";
        
        // Construimos el mensaje que quieres ver
        String mensajeFinal = "Error de validación: El campo '" + campoCulpable + "' es demasiado largo.";
        
        // Usamos tu clase RespuestaMsgDto para que el formato sea el mismo que usas siempre
        RespuestaMsgDto respuestaDto = new RespuestaMsgDto(mensajeFinal);
        
        return new ResponseEntity<>(respuestaDto, HttpStatus.BAD_REQUEST);
    }
    
	@PostMapping("/riskfactors/{riskfactorid}")
	public ResponseEntity<ParamsResponseDto> RiskUpsert(
            HttpServletRequest request,
            @Valid @RequestBody RiskFactorRequestDto datosrisk, // Se agregó @Valid aquí
            @PathVariable("riskfactorid") final Integer riskfactorid) throws ParseException, SQLException {
	/*public ResponseEntity<ParamsResponseDto> RiskUpsert(HttpServletRequest request,@Valid @RequestBody
			RiskFactorRequestDto datosrisk,@PathVariable("riskfactorid") final Integer riskfactorid) throws ParseException, SQLException {*/
			
			RespuestaValueDto respuestaValueDto;
			RespuestaMsgDto respuesta = new RespuestaMsgDto("");
			HttpStatus estatus = HttpStatus.FORBIDDEN;
			ParamsResponseDto paramsResponseDto = new ParamsResponseDto();
			ParamsDto detalleParams;
			PrivilegesDto detallePrivilege;
		     List<ParamsDto> listasParams = new ArrayList<>();
		     List<PrivilegesDto> listasPrivelege = new ArrayList<>();
		     
			 int idparametro = riskfactorid;
			 Connection conexion2 = DriverManager.getConnection(conexion,userbd, passbd);
			 int valor = idparametro;
			 String sessionid = request.getHeader("Authorization");
			  Date fecha = new Date();
			    SimpleDateFormat  formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		        String dataFormattata = formatter.format(fecha);
		        Date fechaDate = formatter.parse(dataFormattata);
		        AuditRequestDto  auditDto=new AuditRequestDto();
		        Optional<Users> encontreSessionUsuario;    	       	  		
			   Date fecha2 = new Date();
			   Calendar calendar = Calendar.getInstance();
			   
			 
				if (sessionid==null) {
					String var = "";
					boolean bloked = false;
					RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
					//respuestaDto.setBlocked(bloked);
					respuestaDto.setMsg("Llamada al servicio malformado");
					//Error 400
					return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
				} else   {
					 
					   sessionid = sessionid.substring(7);
					   encontreSessionUsuario =usersRepository.getBySessionid(sessionid);
				       String fechaComoCadena;
					   
					   if (encontreSessionUsuario.isPresent()) {
						   
						   Date FechaReg = encontreSessionUsuario.get().getValidthru(); 
	  					   //Llamada a la funcion que validad el tiempo de Session, retorna la fecha sumandole el tiempo de session activa, y vacio si no esta activa
	  					   
	  					  //  fechaComoCadena  = securityService.consultarSessionActiva(FechaReg,fecha2);
	  					   fechaComoCadena  = securityService.consultarSessionActiva(FechaReg,fecha2,encontreSessionUsuario.get().getId());
	  					    if (fechaComoCadena=="") {	  						   	  						  
	  						   
	  						   String var = "";
	  							boolean bloked = false;
	  							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
	  							//respuestaDto.setBlocked(bloked);
	  							respuestaDto.setMsg("Sesión expirada o inválida"); 
	  							return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);
	  						   
	  					    }
	  					    
	  					  String Salida = usersService.verificarCaracteresValidosConRegex(datosrisk.getName());
	  					  
	  					  if (Salida=="NOOK") {
	  						  String var = "";
	  							boolean bloked = false;
	  							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
	  							//respuestaDto.setBlocked(bloked);
	  							respuestaDto.setMsg("Caracteres no permitidos en la busqueda"); 
	  							return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
	  					  }
	  					  
	  	                 String SalidaDsc = usersService.verificarCaracteresValidosConRegex(datosrisk.getCategory());
	  					  
	  					  if (SalidaDsc=="NOOK") {
	  						  String var = "";
	  							boolean bloked = false;
	  							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
	  							//respuestaDto.setBlocked(bloked);
	  							respuestaDto.setMsg("Caracteres no permitidos en la busqueda"); 
	  							return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
	  					  }
	  					  
	  					   
						 //Actualiza o Incluye un registro de un usuario. (Si el unitid es 0 se incluye). (priv 111 MOD Y 112 INC)
						   if (idparametro==0) {
							   //el permiso es el 632
							   Roles roles = encontreSessionUsuario.get().getRolid();
							   int idrol = roles.getId();
							   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 802);
							  // rolisvalid = 3;
							   if (rolisvalid==0) {
								   
								   String var = "";
									boolean bloked = false;
									RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
									//respuestaDto.setBlocked(bloked);
									respuestaDto.setMsg("No tiene los Privilegios"); 
									return new ResponseEntity(respuestaDto, HttpStatus.FORBIDDEN);
								   
							     }
							
							   
						   } else {
						   
						   Roles roles = encontreSessionUsuario.get().getRolid();
						   int idrol = roles.getId();
						   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 801);
						 //  rolisvalid = 3;
						   if (rolisvalid==0) {
							   
							   String var = "";
								boolean bloked = false;
								RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
								//respuestaDto.setBlocked(bloked);
								respuestaDto.setMsg("No tiene los Privilegios"); 
								return new ResponseEntity(respuestaDto, HttpStatus.FORBIDDEN);
							   
						     }
						   
                               boolean existeFactor = riskfactorsRepository.existsById(riskfactorid);
						   
						      if  (!existeFactor) {	
							   
							  
							    
							    	String var = "";
							    	RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
									//respuestaDto.setBlocked(bloked);
									respuestaDto.setMsg("Registro No encontrado");
									//Error 400
									return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
							    
						       }
						   } 
						   						                        						 							
						   
						 if (idparametro==0) {
							   
	                       if  (datosrisk.getName()!= "" ) {	
								   
								   //boolean existeRef = unitsRepository.existsByRef(datosUnidad.getRef());
								   String Query1 = "SELECT name FROM main.riskfactors WHERE LOWER(name) = " + "'" + datosrisk.getName().toString().toLowerCase() + "'" ;
								   Long cuantosregistroref = (long) jdbcTemplate.queryForList(Query1).size();
								   
								    if (cuantosregistroref>0) {
								    	String var = "";
								    	RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
										//respuestaDto.setBlocked(bloked);
										respuestaDto.setMsg("Registro Duplicado");
										//Error 400
										return new ResponseEntity(respuestaDto, HttpStatus.CONFLICT);
								    }
							   }	                       	                     				                     						   											
							   
						   }
						 
							// PASO 1 - PARA LA  VALIDACIÓN PREVIA (No Inserto nada aún) Se valida que el elemento no exista, valido por el nombre que me indico Jose que debia ser unico
							//en toda la tabla
							List<String> elementosDuplicados = new ArrayList<>();
							List<String> elementosconcero = new ArrayList<>();
							BigDecimal sumaTotalPesos = BigDecimal.ZERO;
							if (datosrisk.getElements() != null) {
							    for (RiskFactorElementDto elemento : datosrisk.getElements()) {
							        if (elemento.getId() >= 0) { // Solo validamos duplicados para los NUEVOS
							        	
							        	if (elemento.getWeight() != null) {
							                // sumaTotalPesos = sumaTotalPesos + elemento.getWeight()
							                sumaTotalPesos = sumaTotalPesos.add(elemento.getWeight());
							            }
							        	
							        	if (elemento.getWeight().compareTo(BigDecimal.ZERO) <= 0) {
							                // sumaTotalPesos = sumaTotalPesos + elemento.getWeight()
							        	       elementosconcero.add(elemento.getName());
							            }
							            // Buscamos si ya existe un elemento con ese nombre para este factor de riesgo
							        	boolean existe;
							            if (elemento.getId() == 0) {
							                // Si es nuevo, buscamos si el nombre existe en cualquier registro
							                existe = riskfactorelementsRepository.existsByName(elemento.getName());
							            } else {
							            	System.out.println("Validando elemento: " + elemento.getName() + " con ID: " + elemento.getId());
							                // Si es actualización, buscamos si existe el nombre pero IGNORANDO su propio ID
							                existe = riskfactorelementsRepository.existsByNameAndIdNot(elemento.getName(), elemento.getId());
							            }							              
							            if (existe) {
							            	System.out.println("¡DUPLICADO ENCONTRADO! El nombre ya existe en otro ID.");
							                elementosDuplicados.add(elemento.getName());
							            }
							        }
							    }
							}
							
						
							   
							// PASO 2: VERIFICAR QUE LA SUMA SEA EXACTAMENTE 100
							
							if (sumaTotalPesos.compareTo(new BigDecimal("100")) != 0) {
							    RespuestaMsgDto respuestaDto = new RespuestaMsgDto(
							        "Error: La suma de los pesos debe ser exactamente 100. Suma actual: " + sumaTotalPesos
							    );
							    return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
							}
						       
							// PASO 3: VERIFICAR SI HUBO ERRORES EXISTEN ELEMENTOS DUPLICADOS FUE EL ERROE QUE REPORTO NEWMAN
							if (!elementosDuplicados.isEmpty()) {
							    String nombres = String.join(", ", elementosDuplicados);
							    RespuestaMsgDto respuestaDto = new RespuestaMsgDto("Error: Los siguientes elementos ya existen: " + nombres);
							    return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
							}
							
							// PASO 4: VERIFICAR SI ALGUNO DE LOS ELEMENTOS TIENE VALOR CERO 0.00 
							if (!elementosconcero.isEmpty()) {
							    String nombres = String.join(", ", elementosconcero);
							    RespuestaMsgDto respuestaDto = new RespuestaMsgDto("Error: Los siguientes elementos tienen un peso no permitido: " + nombres);
							    return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
							}
					   
					 } else {
							String var = "";
							boolean bloked = false;
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							//respuestaDto.setBlocked(bloked);
							respuestaDto.setMsg("Sesión expirada o inválida");
							//Error 400
							return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);
					 }
				}
				
				
			
			try {
				
			
				Riskfactors tipoRisk2=null;
				Riskfactors tipoRisk=null;
				Riskfactors tipoRiskNew2=null;
				Optional<Riskfactors> nuevoinsertado = null;
				
				int cantidadAlmacenarCapacity = 0;
				if (idparametro==0) {
					
					Riskfactors tipoRiskNew = new Riskfactors();
					
					if (datosrisk.getScenery()==0) {
					    	            
		                	String var2 = "";
							boolean bloked = false;
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
							respuestaDto= new RespuestaMsgDto("Llamada al servicio malformado");
							estatus=HttpStatus.BAD_REQUEST;   
							return new ResponseEntity(respuestaDto, estatus);	              
				    }
					
					//Workers
					//datosWorker
					tipoRiskNew.setStatus(datosrisk.getStatus());
					tipoRiskNew.setModifiedat(fechaDate);
					tipoRiskNew.setCreatedat(fechaDate); 
					tipoRiskNew.setName(datosrisk.getName());
					tipoRiskNew.setDsc(datosrisk.getDsc());
					tipoRiskNew.setCategory(datosrisk.getCategory());
					tipoRiskNew.setScenery(datosrisk.getScenery());
					tipoRiskNew2=riskfactorsService.addIdRiskfactors(tipoRiskNew);
					
					///////////////Aqui termino la insercion del Tipo de Riesgo, luego comienzo con los elementos.
					
					
					// typeIn  = Integer.parseInt(typeIn2);
					
					tipoRisk2= tipoRiskNew2;
					nuevoinsertado = riskfactorsRepository.findByName(datosrisk.getName());
					int idInsertado =  nuevoinsertado.get().getId();
					int idmensaje = idInsertado;
					 Riskfactorelements tipoRiskElementNewDupli = new Riskfactorelements();

				

			
				
					if (datosrisk.getElements() == null || datosrisk.getElements().isEmpty()) {
				       String mensaje = "No vienen elementos";
				    } else {

				    	   datosrisk.getElements().forEach(elemento -> {
				    	 
				    	   
				            Integer idele = elemento.getId();
				            String nombreEl = elemento.getName();
				            BigDecimal pesoEle = elemento.getWeight();
				            Riskfactorelements tipoRiskElementNew = new Riskfactorelements();
				            Riskfactorelements tipoRiskElementNew2 = new Riskfactorelements();
				            int idfactorrisk=0;
				          
				            boolean existeid;  
					         if (idele==0) {
					        	  existeid = true;
					         } else {
					        	  existeid = riskfactorelementsRepository.existsById(Math.abs(idele)); 
					         }       
					           
				            // existeid = riskfactorelementsRepository.existsById(Math.abs(idele));      
					        if (existeid) {   
				             if (idele > 0) {
				            // Lógica para ACTUALIZAR
				             /*  System.out.println("Actualizando elemento ID: " + idele + " - " + nombreEl);
				               Statement sentenciaPreparada = null;
				               try {
								sentenciaPreparada = conexion2.createStatement();
							    } catch (SQLException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
						    	}*/
				              /* String sql = "UPDATE main.riskfactorelements SET " +
				                       "weight = " + pesoEle + ", " +
				                       "name = '" + nombreEl + "' " +				                 
				                       "WHERE id = " + idele;
				                     //  "WHERE id = " + idele + " AND riskfactorid = " + idfactorrisk;
				               int filasInsertadas=0;
			    	            try {
									filasInsertadas = sentenciaPreparada.executeUpdate(sql);
								} catch (SQLException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								}*/
				               riskfactorelementsRepository.updateRiskfactorelementsbyid(idele,pesoEle,nombreEl);
				            
				             } else if (idele < 0) {
				            // Lógica para BORRAR (se suele usar el valor absoluto del ID)
				                System.out.println("Borrando elemento ID: " + Math.abs(idele));
				                int idDelete = Math.abs(idele);
				                // DELETE FROM Riskfactorelements e where e.id = ?1 and e.riskfactorid = ?2
				                riskfactorelementsRepository.deleteRiskfactorelementsbyid(idDelete); 
				            
				              } else {
				            // Lógica para NUEVO (id == 0)
				                System.out.println("Insertando nuevo elemento: " + nombreEl);
				                tipoRiskElementNew.setName(nombreEl);
				                tipoRiskElementNew.setWeight(pesoEle);
				                tipoRiskElementNew.setRiskfactorid(tipoRiskNew);
				                tipoRiskElementNew2=riskfactorelementsService.addIdRiskfactorelements(tipoRiskElementNew);
				            // repository.save(new ElementEntity(nombre, peso));
				             }
				    	   } else {
				    		   
				    		   String varerror = "No existe ese elemento";
				    		   System.out.print(varerror);
				    	   }     
				            });
				
				  }																		
					
							
			
				    //////////////////////////INSERCION BLOQUE DE AUDITORIA///////////////////
				     String module = "Factores de Riesgo";
				     //String Descmodule = "Actualización de parametro del Sistema con id: " + parmid  ;
				     String Descmodule = "Se agregó el Tipo de Factor de Riesgo: " + datosrisk.getName() + " con Id:" + idInsertado ;
				    
			         auditDto.setIpaddr(HttpReqRespUtils.getClientIpAddressIfServletRequestExist());			        
			         
			         String singo1 = "(";
			         String singo2 = ")";
			         String usryemail = encontreSessionUsuario.get().getUsr().concat(" ").concat(singo1).concat(encontreSessionUsuario.get().getEmail().concat(singo2));
			         auditDto.setUserref(usryemail);
			         auditDto.setModule(module);
			         auditDto.setDesc(Descmodule);
			         auditDto.setCreatedat(fechaDate);
			 		   usersService.registrarAuditSesion(auditDto); 
			 		   
			 		
						respuestaValueDto= new RespuestaValueDto(idmensaje);
						estatus=HttpStatus.OK;
						return new ResponseEntity(respuestaValueDto, estatus); 
		         

				} else {
					
					
					
				    	//tipoCanal = channelsService.getChannelsByid(idparametro);
				    	tipoRisk = riskfactorsService.getRiskfactorsByid(idparametro);
				    			
				    	tipoRisk.setStatus(datosrisk.getStatus());
				    	tipoRisk.setModifiedat(fechaDate);
				    	tipoRisk.setCreatedat(fechaDate); 
				    	tipoRisk.setDsc(datosrisk.getDsc());
				    	tipoRisk.setCategory(datosrisk.getCategory());
				    	tipoRisk.setScenery(datosrisk.getScenery());
						

						String vp1 = tipoRisk.getName();
						String vp2 = datosrisk.getName();
						if (vp1.equals(vp2)){
							String Validausers = "El canal es el mismo";
					    	
						} else {
					
						 String QueryTotal = "SELECT name FROM main.riskfactors WHERE LOWER(name) = " + "'" + datosrisk.getName().toString().toLowerCase() + "'" ;
						 Long validaCanal = (long) jdbcTemplate.queryForList(QueryTotal).size();
						 
		                if (validaCanal>0) {
							
							String var = "";
							//boolean bloked = false;
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							//respuestaDto.setBlocked(bloked);
							respuestaDto.setMsg("Registro Duplicado");
							//Error 400
							return new ResponseEntity(respuestaDto, HttpStatus.CONFLICT);
							
						} else {
							tipoRisk.setName(datosrisk.getName());
						}
					}																
					
						final Riskfactors[] riskFactorWrapper = new Riskfactors[1];
						//tipovp2=workersService.addIdWorkers(tipoWorker);
						//tipoRisk2=channelsService.addIdChannels(tipoCanal);
						tipoRisk2 = riskfactorsService.addIdRiskfactors(tipoRisk);
						riskFactorWrapper[0] = riskfactorsService.getRiskfactorsByid(idparametro);
						final Riskfactors riskFactorFinal = tipoRisk;
						if (datosrisk.getElements() == null || datosrisk.getElements().isEmpty()) {
					        String mensaje = "No vienen elementos";
					    } else {
				            

					    	   datosrisk.getElements().forEach(elemento -> {
					    		   int idfactorrisk = 0;
					    		   Riskfactorelements tipoRiskElementNew = new Riskfactorelements();
						            Riskfactorelements tipoRiskElementNew2 = new Riskfactorelements();
					            
						            int idele = elemento.getId();
					                String nombreEl = elemento.getName();
					                BigDecimal pesoEle = elemento.getWeight();
					         boolean existeid;  
					         if (idele==0) {
					        	  existeid = true;
					         } else {
					        	  existeid = riskfactorelementsRepository.existsById(Math.abs(idele)); 
					         }       
					                
					        if (existeid) {  
					           if (idele > 0) {
					            // Lógica para ACTUALIZAR
					        	 /*  Statement sentenciaPreparada = null;
					               try {
									sentenciaPreparada = conexion2.createStatement();
								    } catch (SQLException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
							    	}*/
					             //  String sql = "UPDATE main.riskfactorelements SET " +
					               //        "weight = " + pesoEle + ", " +
					                 //      "name = '" + nombreEl + "' " +	
					                   //    "WHERE id = " + idele;
					               riskfactorelementsRepository.updateRiskfactorelementsbyid(idele,pesoEle,nombreEl);   
					                     //  "WHERE id = " + idele + " AND riskfactorid = " + idfactorrisk;
					              /* int filasInsertadas=0;
				    	            try {
										filasInsertadas = sentenciaPreparada.executeUpdate(sql);
									} catch (SQLException e) {
										// TODO Auto-generated catch block
										e.printStackTrace();
									}*/
					            
					               
				   		          
					             } else if (idele < 0) {
					            // Lógica para BORRAR (se suele usar el valor absoluto del ID)
					            	  System.out.println("Borrando elemento ID: " + Math.abs(idele));
							                int idDelete = Math.abs(idele);
							                // DELETE FROM Riskfactorelements e where e.id = ?1 and e.riskfactorid = ?2
							               // String sql = " DELETE FROM  main.riskfactorelements " +
								                      // " WHERE  id = " + idDelete ;
							                riskfactorelementsRepository.deleteRiskfactorelementsbyid(idDelete);         
							             //   deleteRiskfactorelementsbyid      

						            
					              } else {
					            // Lógica para NUEVO (id == 0)
					            	  System.out.println("Insertando nuevo elemento: " + nombreEl);
						                tipoRiskElementNew.setName(nombreEl);
						                tipoRiskElementNew.setWeight(pesoEle);
						                tipoRiskElementNew.setRiskfactorid(riskFactorFinal);
						                tipoRiskElementNew2=riskfactorelementsService.addIdRiskfactorelements(tipoRiskElementNew);
					            // repository.save(new ElementEntity(nombre, peso));
					             }
					    	   } else {
					    		   
					    		   
							    	String varerror = "No existe ese elemento";
						    		System.out.print(varerror);
							    
					    	   }  
					            });
					
					    }																		
						
						
					    //////////////////////////INSERCION BLOQUE DE AUDITORIA///////////////////
					     String module = "Factores de Riesgo";
					     //String Descmodule = "Actualización de parametro del Sistema con id: " + parmid  ;
					     String Descmodule = "Se actualizó el Tipo de Factor de Riesgo: "+ datosrisk.getName() + " con Id:" + idparametro ;
					    
				         auditDto.setIpaddr(HttpReqRespUtils.getClientIpAddressIfServletRequestExist());			        
				         
				         String singo1 = "(";
				         String singo2 = ")";
				         String usryemail = encontreSessionUsuario.get().getUsr().concat(" ").concat(singo1).concat(encontreSessionUsuario.get().getEmail().concat(singo2));
				         auditDto.setUserref(usryemail);
				         auditDto.setModule(module);
				         auditDto.setDesc(Descmodule);
				         auditDto.setCreatedat(fechaDate);
				 		   usersService.registrarAuditSesion(auditDto); 
				 		  //////////////////////////INSERCION BLOQUE DE AUDITORIA///////////////////	
				 		   int idmensaje = idparametro;
				 		   respuestaValueDto= new RespuestaValueDto(idmensaje);
							estatus=HttpStatus.OK;
							return new ResponseEntity(respuestaValueDto, estatus); 
			         
			      
				      }
			
			} catch (Exception e) {
	            // Manejo de excepciones
				respuesta= new RespuestaMsgDto("Error interno del servidor");
				estatus=HttpStatus.INTERNAL_SERVER_ERROR;            
	        } finally {
				if (entityManager != null && entityManager.isOpen()) {
					entityManager.close();
				}
			}
			
			return new ResponseEntity(respuesta, estatus);
		
		}
	
	@PostMapping("/riskfactors/categories")
	public ResponseEntity<?> listriskcategories(HttpServletRequest request,@RequestBody UsersListDto tiposfiltros) throws ParseException, UnsupportedEncodingException {
		RespuestaDto respuesta = new RespuestaDto("", false);
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		ChannelsRecordDto channelsRecordDto = new ChannelsRecordDto();
		
		
		RiskCategoryResponseDto riskCategoryResponseDto = new RiskCategoryResponseDto();
		List<String> listaCategorias= new ArrayList<>();

	     
	     Long cuantosregistro = (long) 0;
	     
	     List<RiskFactorsRecordDto> listasRecordRisk= new ArrayList<>();
	     TypesUnitDto detalleTypes;
	     TypesUnitDto detallePeriodos;
	     List<TypesUnitDto> listasPeriodos = new ArrayList<>();
		 
		 String sessionid = request.getHeader("Authorization");
		  Date fecha = new Date();
		    SimpleDateFormat  formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	        String dataFormattata = formatter.format(fecha);
	        Date fechaDate = formatter.parse(dataFormattata);
	        AuditRequestDto  auditDto=new AuditRequestDto();
	       
	        
	     
	       
	      int idrol;
	   	  String searchIn = "";
	   	  String contentIn = "";
	     // String searchModule = "";
		  int searchStatus = 0;
		  int typeIn=0;
		  String fechaComoCadena; 
		 int orderIn = 0;
		 int offsetIn = 0;
		 int numofrecordsIn = 0;
		 Date fecha2 = new Date();
		
			if (sessionid==null) {
				String var = "";
				boolean bloked = false;
				RespuestaDto respuestaDto = new RespuestaDto(var, bloked);
				respuestaDto.setBlocked(bloked);
				respuestaDto.setMsg("Sesión expirada o inválida");
				//Error 400
				return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
			} else   {
				 
				   sessionid = sessionid.substring(7);
				   Optional<Users> encontreSessionUsuario =usersRepository.getBySessionid(sessionid);
	
				   
				   if (encontreSessionUsuario.isPresent()) {
					   
					   Date FechaReg = encontreSessionUsuario.get().getValidthru(); 
					   fechaComoCadena  = securityService.consultarSessionActiva(FechaReg,fecha2,encontreSessionUsuario.get().getId());
           
					    if (fechaComoCadena=="") {
						     
						   String var = "";
							boolean bloked = false;
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							//respuestaDto.setBlocked(bloked);
							respuestaDto.setMsg("Sesión expirada o inválida"); 
							return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);
						   
					    }
					   
					  // Este proceso permite obtener un listado de los proveedores. (Priv 440)
					   Roles roles = encontreSessionUsuario.get().getRolid();
					   idrol = roles.getId();
					   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 800);
					 
					        if (rolisvalid==0) {
						   
						   String var = "";
							boolean bloked = false;
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							//respuestaDto.setBlocked(bloked);
							respuestaDto.setMsg("No tiene los Privilegios"); 
							return new ResponseEntity(respuestaDto, HttpStatus.FORBIDDEN);
					        }	
					    
						  searchIn = tiposfiltros.getFilters().getSearch();
						  
						  String Salida = usersService.verificarCaracteresValidosConRegex(searchIn);
						  
						  if (Salida=="NOOK") {
							  String var = "";
								boolean bloked = false;
								RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
								//respuestaDto.setBlocked(bloked);
								respuestaDto.setMsg("Caracteres no permitidos en la busqueda"); 
								return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
						  }
						 
						       
						   searchIn = usersService.eliminarAcentosService(tiposfiltros.getFilters().getSearch());
						   searchStatus = tiposfiltros.getFilters().getStatus();
					
						  orderIn = tiposfiltros.getOrder();
						  offsetIn = tiposfiltros.getOffset();
						  numofrecordsIn = tiposfiltros.getNumofrecords();
						  contentIn = tiposfiltros.getContent();
						  
						  
						  if (contentIn !=null) {
						     menuService.iscontentdiffnull(contentIn, encontreSessionUsuario.get().getId());
						  }
						 
					
					
				 } else {
						String var = "";
						boolean bloked = false;
						RespuestaDto respuestaDto = new RespuestaDto(var, bloked);
						respuestaDto.setBlocked(bloked);
						respuestaDto.setMsg("Sesión expirada o inválida");
						return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);
				 }
			}
			
			
		
		try {
			
			String SentenciaBase;
			SentenciaBase = "SELECT u.category FROM main.riskfactors u ";
						
				Query query;
				String groupby = " GROUP BY category ";
				
			String QueryTotal = "";
			String category = "u.category";
			String status = "f.status";				
			String lowername = "main.sinacentos(LOWER(u.category))";
			String lowercategory = "main.sinacentos(LOWER(u.category))";
			String LowerSearch = searchIn.toLowerCase();
			
			 switch (searchIn) { 
			    case "":  // viene sin busqueda por el like
			    	
			    	QueryTotal = SentenciaBase  + " WHERE TRUE = TRUE";
			     break;
			  
			    default:	// viene con el parametro para buscar por el like		
			    	 
			    	   QueryTotal = SentenciaBase + " WHERE " + lowercategory + " LIKE  " + "'%" + LowerSearch + "%'";
			    	   			    	
	         }
			 
			
			    	 QueryTotal = QueryTotal + groupby;
			         query = entityManager.createNativeQuery(QueryTotal);
			         		     			 			 			
			 
			 String ordena="";
			  if (orderIn == 1) {
				  ordena = " ASC";
			 }  else if (orderIn == -1) {
				  ordena = " DESC";
			 } else {
				 	String var2 = "";
					boolean bloked = false;
					RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
					respuestaDto= new RespuestaMsgDto("Error interno del servidor");
					estatus=HttpStatus.INTERNAL_SERVER_ERROR;   
					return new ResponseEntity(respuestaDto, estatus);
			 }		
			 int absolutoOrden = Math.abs(orderIn);			 			 			 			 
			 switch (absolutoOrden) { 
			    case 1:  //ordena por name ascendente
			    	
			    	QueryTotal = QueryTotal + " ORDER BY " + category + ordena;
			     break;
			    		
			   }
		
	     			   
				       query = entityManager.createNativeQuery(QueryTotal);
				       query.setFirstResult(offsetIn);
					   query.setMaxResults(numofrecordsIn);
					   List<String> listacompleta = query.getResultList();
				
					   cuantosregistro = (long) query.getResultList().size();				    		
      	    	
		    	//	 RiskCategoryResponseDto riskCategoryResponseDto = new RiskCategoryResponseDto();
		    	//		List<String> listaCategorias= new ArrayList<>();
		    		       riskCategoryResponseDto.setNumofrecords(cuantosregistro); 
					       riskCategoryResponseDto.setSessionvalidthru(fechaComoCadena);
					       riskCategoryResponseDto.setRecords(listacompleta);
		    	   	    	   			
		  						           
                return ResponseEntity.ok(riskCategoryResponseDto);
		     						
			 
	
		} catch (Exception e) {
            // Manejo de excepciones
			respuesta= new RespuestaDto("Error interno del servidor", false);
			estatus=HttpStatus.INTERNAL_SERVER_ERROR;            
        } finally {
	        if (entityManager != null && entityManager.isOpen()) {
	            entityManager.close();
	        }
	    }
		
		return new ResponseEntity(respuesta, estatus);
	
	}
	
	@DeleteMapping("/riskfactors/{riskfactorid}")
	public ResponseEntity<?> borrarRiskFactor(HttpServletRequest request, @PathVariable("riskfactorid") final Integer riskfactorid)
			throws ParseException {
		RespuestaMsgDto respuesta = new RespuestaMsgDto("");
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		RoleDto detalleRoles;
		PrivilegesAllDto detallePrivilege;
		
		String var = "";
		boolean bloked = false;
		RespuestaDto respuestaDto = new RespuestaDto(var, bloked);
		String sessionid = request.getHeader("Authorization");
		Date fecha = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dataFormattata = formatter.format(fecha);
		Date fechaDate = formatter.parse(dataFormattata);
		AuditRequestDto auditDto = new AuditRequestDto();
		RespuestaValueDto respuestaValueDto;
		String searchIn = "";


		Optional<Params> deSessDuration = paramsRepository.findByParamname("SESSION_DURATION");
		String SessionDuration = deSessDuration.get().getValue();
		int duracionSession = Integer.parseInt(SessionDuration);
		Date fecha2 = new Date();
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(fecha2); // tuFechaBase es un Date;
		// calendar.add(Calendar.MINUTE, minutosASumar); //minutosASumar es int.
		calendar.add(Calendar.MINUTE, duracionSession); // horasASumar es int.
		// lo que más quieras sumar
		Date ValidThrufechaSalida = calendar.getTime(); // Y ya tienes la fecha sumada.

		if (sessionid == null) {
			respuesta.setMsg("Llamada al servicio malformado");
			estatus=HttpStatus.BAD_REQUEST;
			return new ResponseEntity(respuesta, estatus);
		} else {
			sessionid = sessionid.substring(7);
			Optional<Users> encontreSessionUsuario = usersRepository.getBySessionid(sessionid);

			if (encontreSessionUsuario.isPresent()) {
				//Eliminar un registro de un usuario. (priv 633)

				String fechaComoCadena;
				   Date FechaReg = encontreSessionUsuario.get().getValidthru(); 
					   //Llamada a la funcion que validad el tiempo de Session, retorna la fecha sumandole el tiempo de session activa, y vacio si no esta activa
					   
					   // fechaComoCadena  = securityService.consultarSessionActiva(FechaReg,fecha2);
					    fechaComoCadena  = securityService.consultarSessionActiva(FechaReg,fecha2,encontreSessionUsuario.get().getId());
					    if (fechaComoCadena=="") {
						   
						   
						   
						    String var2 = "";
							boolean bloked2 = false;
							RespuestaMsgDto respuestaDto2 = new RespuestaMsgDto(var2);
							//respuestaDto.setBlocked(bloked);
							respuestaDto2.setMsg("Sesión expirada o inválida"); 
							return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);
						   
					    }
					    
				  Roles roles = encontreSessionUsuario.get().getRolid();
				   int idrol = roles.getId();
				   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 803);
				   if (rolisvalid==0) {
					  
					   
						//boolean bloked = false;
						RespuestaMsgDto respuestaPrivDto = new RespuestaMsgDto(var);
						//respuestaDto.setBlocked(bloked);
						respuestaPrivDto.setMsg("No tiene los Privilegios"); 
						return new ResponseEntity(respuestaPrivDto, HttpStatus.FORBIDDEN);
						
				   }
				   	
				try {
					
					if (riskfactorsRepository.existsById(riskfactorid)) {
					   					
						    Optional<Riskfactors> FactorDelete = riskfactorsRepository.findById(riskfactorid);
						    Riskfactors FactorDelete2 = riskfactorsRepository.getById(riskfactorid);
						   String module = "Factores de Riesgo";
						     String Descmodule = "Se eliminó el Tipo de Factor de Riesgo: " + FactorDelete2.getName() + " con Id: " + FactorDelete2.getId();
						    
					         auditDto.setIpaddr(HttpReqRespUtils.getClientIpAddressIfServletRequestExist());
					       
					         String singo1 = "(";
					         String singo2 = ")";
					         String usryemail = encontreSessionUsuario.get().getUsr().concat(" ").concat(singo1).concat(encontreSessionUsuario.get().getEmail().concat(singo2));
					         auditDto.setUserref(usryemail);
					         auditDto.setModule(module);
					         auditDto.setDesc(Descmodule);
					         auditDto.setCreatedat(fechaDate);
					 		   usersService.registrarAuditSesion(auditDto);
					   try {
									//usersRepository.deleteusersbyid(userid,fechaDate,valor);	
						   riskfactorsRepository.delete(FactorDelete2);	   
					 		 respuestaValueDto= new RespuestaValueDto(riskfactorid);

								estatus=HttpStatus.OK;
								return new ResponseEntity(respuestaValueDto, estatus);
						} catch (Exception e) {// Error Interno
									respuesta.setMsg("Error interno del servidor -conflicto. ");
									estatus=HttpStatus.CONFLICT;
									return new ResponseEntity(respuesta, estatus);
						}
						 
					} else {// Registro no encontrado
						respuesta.setMsg("Registro no encontrado");
						estatus=HttpStatus.NOT_FOUND;
						return new ResponseEntity(respuesta, estatus);
						
					}

				} catch (Exception e) {// Error Interno
					// Manejo de excepciones
					respuesta.setMsg("Error interno del servidor");
					estatus=HttpStatus.INTERNAL_SERVER_ERROR;
					return new ResponseEntity(respuesta, estatus);
				} finally {
					if (entityManager != null && entityManager.isOpen()) {
						entityManager.close();
					}
				}
			} else {
				respuesta.setMsg("Sesión expirada o inválida");
				estatus=HttpStatus.UNAUTHORIZED;
				return new ResponseEntity(respuesta, estatus);
				
			}

			
		}
		
	}	

}
