package com.dacrt.SBIABackend.controler;

import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.net.URI;
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 org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.DeleteMapping;
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.ApplicationActualizarDto;
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.ServiceOffersDescDto;
import com.dacrt.SBIABackend.dto.StatusDto;
import com.dacrt.SBIABackend.dto.StatusDto2;
import com.dacrt.SBIABackend.dto.TechnologyRecordDto;
import com.dacrt.SBIABackend.dto.TecnologyActualizarDto;
import com.dacrt.SBIABackend.dto.TypesUnitDto;
import com.dacrt.SBIABackend.dto.responseDto.ChannelsResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.TechnologyEntryResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.TechnologyRecordEntry;
import com.dacrt.SBIABackend.dto.responseDto.TechnologyResponseDto;
import com.dacrt.SBIABackend.entity.Applications;
import com.dacrt.SBIABackend.entity.Facilities;
import com.dacrt.SBIABackend.entity.Technology;
import com.dacrt.SBIABackend.repository.TechnologyRepository;
import com.dacrt.SBIABackend.security.dto.AuditRequestDto;
import com.dacrt.SBIABackend.security.dto.PrivilegesAllDto;
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.UsersListDto;
import com.dacrt.SBIABackend.security.entity.Params;
import com.dacrt.SBIABackend.security.entity.Roles;
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.utils.HttpReqRespUtils;

@RestController
//@RequestMapping("/units")   
@CrossOrigin(origins = "*")
public class TechnologyController {
	@Autowired
	private ParamsRepository paramsRepository;

	@Autowired
	private UsersRepository usersRepository;

	@Autowired
	private AuditRepository auditRepository;
	
	@Autowired
	private TechnologyRepository technologyRepository; 

	@Autowired
	private RolesPrivilegesRepository rolesPrivilegesRepository;

	@Autowired
	UsersService usersService;

	@Autowired
	ParamsService paramsService;

	@Autowired
	SecurityService securityService;

	@Autowired
	MenuService menuService;

	@PersistenceContext
	private EntityManager entityManager;
	
	
	@PostMapping("/technologies")
	public ResponseEntity<?> channels(HttpServletRequest request,@RequestBody UsersListDto tiposfiltros) throws ParseException, UnsupportedEncodingException {
		RespuestaDto respuesta = new RespuestaDto("", false);
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		ChannelsResponseDto channelsResponseDto = new ChannelsResponseDto();
		TechnologyResponseDto TechResponseDto = new TechnologyResponseDto();
		
		ChannelsRecordDto channelsRecordDto = new ChannelsRecordDto();
		RecordCatalogoResponseDto channelsFormatResponseDto = new RecordCatalogoResponseDto();
		CampaignFormat2Dto detalleCompaing2;
		int formatList = 0;
		CampaignFormat2Dto detalleSuppliers;
		StatusDto2 detalleStatus;
		StatusDto2 detalleLayerOut;
		StatusDto2 detalleType;
		StatusDto2 detalleTipo;
		StatusDto detalleStatus2;
		ChannelsAmountDto detalleAmountOP;
		ChannelsAmountDto detallevolumeOP;
		StatusDto2 detallecapacityperiod;
		ServiceOffersDescDto detalleserviceoffers;
		List<TypesUnitDto> listasTypes = new ArrayList<>();
		List<ServiceOffersDescDto> listasOfertas = new ArrayList<>();
		PrivilegesAllDto detallePrivilege;
		List<TypesUnitDto> listasLayer = new ArrayList<>();
		List<TypesUnitDto> listasYesno = new ArrayList<>();
		List<TypesUnitDto> listasMonitor = new ArrayList<>();
		
		
	     
	     Long cuantosregistro = (long) 0;
	     
	     List<PrivilegesAllDto> listasPrivelege = new ArrayList<>();
	     List<ChannelsRecordDto> listasRecord= new ArrayList<>();
	     List<TechnologyRecordDto> listasRecordTech= new ArrayList<>();
	     TechnologyRecordDto technologyRecordDto= new TechnologyRecordDto();
	     
	     TypesUnitDto detalleTypes;
	     TypesUnitDto detallePeriodos;
	     TypesUnitDto detalleLayer;
	     TypesUnitDto detalleYesno;
	     TypesUnitDto detalleMonitor;
	     TypesUnitDto detalleEoleos;
	     List<TypesUnitDto> listasPeriodos = new ArrayList<>();
	     List<TypesUnitDto> listasEoleos = 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 searchLayer = "";
	      String searchTyper = "";
	      int searchApp = 0;
	      
	      int searchFaci = 0;
	   	  String contentIn = "";
		  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();
					    
					    if (formatList==0) {
					    	formatList = 1;
					    } else {
					    	formatList = tiposfiltros.getFormat();
					    }
					  // Este proceso permite obtener un listado de los proveedores. (Priv 440)
					   Roles roles = encontreSessionUsuario.get().getRolid();
					   idrol = roles.getId();
					   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 405);
					   if (formatList!=2) {
					        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();
						  searchLayer = tiposfiltros.getFilters().getTechlayerpar();
						  searchTyper= tiposfiltros.getFilters().getTechtypepar();
						  searchApp= tiposfiltros.getFilters().getApplication();
						  searchFaci= tiposfiltros.getFilters().getFacility();
						  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();
						 // String typeIn2 = tiposfiltros.getFilters().getType();
						  
						  
						  
						  
						  
						  try {
							  String typeIn2 = tiposfiltros.getFilters().getType();
							  typeIn  = Integer.parseInt(typeIn2);
								  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 "
						+ " (u.id,  u.name, u.status, "
						+ "	 CASE "
						+ "	WHEN u.status = 1 THEN 'Activo' "
						+ "	ELSE 'Inactivo' "
						+ "	END AS estatus ) "
						+ "	FROM "
						+ "	Technology u ";
			} else { 
			
			
		    	// 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 u.id,u.ref,u.name,u.dsc,u.lastupdate,pr.descr as layer,pr.valor as layerid,pr1.descr as tipo,pr1.valor as tipoid,  "
						+ "	 u.status,CASE WHEN u.status = 1 THEN 'Activo' ELSE 'Inactivo' END AS estatus,u.applicationid,u.facilityid from main.technology u  "
						+ " 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 = 'TECH_LAYER') pr ON u.layer = CAST(pr.valor AS INTEGER) "
						+ " 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 = 'TECH_TYPE') pr1 ON u.type = CAST(pr1.valor AS INTEGER)";
			}		
			Query query;
			
			String QueryTotal = "";
			String name = " u.name ";
			String status = " u.status ";				
			String lowername = "main.sinacentos(LOWER(u.name))";
			String lowerdsc = "main.sinacentos(LOWER(u.dsc))";
			String lowerdscParams = "main.sinacentos(LOWER(pr.descr))";
			String lowerref = "main.sinacentos(LOWER(u.ref))";
			String LowerSearch = searchIn.toLowerCase();
		//	String lowername = "main.sinacentos(LOWER(u.name))";
			
			 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) {
			         	QueryTotal = SentenciaBase + " WHERE (" + lowername + " LIKE  " + "'%" + LowerSearch + "%'"  + " OR " +  lowerdsc + " LIKE " + "'%" + LowerSearch + "%' " + " OR " + lowerref + " 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);
			    	
	         }
			 
			  //searchLayer = tiposfiltros.getFilters().getTechlayerpar();
	  if (formatList==1) {
		     switch (searchLayer) {
		     case "": // viene sin busqueda por el like

			 QueryTotal = QueryTotal;
		  	break;

		    default: // viene con el parametro para buscar por el like
			QueryTotal = QueryTotal + " AND pr.valor = " + "'" + searchLayer + "'";

		    }
		     
		     switch (searchTyper) {
		     case "": // viene sin busqueda por el like

			 QueryTotal = QueryTotal;
		  	break;

		    default: // viene con el parametro para buscar por el like
			QueryTotal = QueryTotal + " AND pr1.valor = " + "'" + searchTyper + "'";

		    }
		     switch (searchApp) {
		     case 0: // viene sin busqueda por el like

			 QueryTotal = QueryTotal;
		  	break;

		    default: // viene con el parametro para buscar por el like
			QueryTotal = QueryTotal + " AND u.applicationid = " +  searchApp ;

		    }
		     switch (searchFaci) {
		     case 0: // viene sin busqueda por el like

			 QueryTotal = QueryTotal;
		  	break;

		    default: // viene con el parametro para buscar por el like
			QueryTotal = QueryTotal + " AND u.facilityid = " + searchFaci ;

		    }
		     
		     
	 }		 
			    
			 if (formatList==1) {
			    	 QueryTotal = QueryTotal;
			         query = entityManager.createNativeQuery(QueryTotal);
			         cuantosregistro = (long) query.getResultList().size();			     			 			 			
			 
			 String ordena="";
			  if (orderIn == 1 || orderIn == 2 || orderIn == 3 || orderIn == 4 || orderIn == 5 || orderIn == 6 || orderIn == 99) {
				  ordena = " ASC";
			 }  else if  (orderIn == -1 || orderIn == -2 || orderIn == -3 || orderIn == -4 || orderIn == -5 || orderIn == -6 || 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 " + " u.ref " + ordena;
			     break;
			    case 2://ordena por status ascendente
			    	
			    	QueryTotal = QueryTotal + " ORDER BY " + " u.name "  + ordena;
			     break;	
                case 3:  //ordena por name ascendente
			    	
			    	QueryTotal = QueryTotal + " ORDER BY " + " u.dsc " + ordena;
			     break;
                case 4:  //ordena por name ascendente
 	
 	             QueryTotal = QueryTotal + " ORDER BY " + " pr.descr " + ordena;
                 break;
                case 5:   //ordena por status ascendente
                	
                    QueryTotal = QueryTotal + " ORDER BY " + " pr1.descr " + ordena;
                break; 
                case 6:   //ordena por status ascendente
                	
                    QueryTotal = QueryTotal + " ORDER BY " + " u.lastupdate " + ordena;
                break;
                case 99:   //ordena por status ascendente
                	
                    QueryTotal = QueryTotal + " ORDER BY " + " u.id " + ordena;
                break;
			 
			    
			   }
		}  else {
					     			 			 			
	 
	 String ordena="";
	  if (orderIn == 1 || orderIn == 2 || orderIn == 99) {
		  ordena = " ASC ";
	 }  else if (orderIn == -1 || orderIn == -2 || 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 " + name + ordena;
	     break;
	    case 2://ordena por status ascendente
	    	
	    	QueryTotal = QueryTotal + " ORDER BY " + status + ordena;
	     break;	
        case 99:   //ordena por status ascendente
        	
            QueryTotal = QueryTotal + " ORDER BY " + " u.id " + ordena;
        break; 
	 
	    
	   }
	}
			 if (formatList!=2) {  
			
			     
			   
				       query = entityManager.createNativeQuery(QueryTotal);
				       query.setFirstResult(offsetIn);
					   query.setMaxResults(numofrecordsIn);
					   List<Object[]> listacompleta = query.getResultList();
				
			      
			      //List<ChannelsDtoStatus> listacompleta = channels.getResultList();
			   
		    	   List<CampaignFormat2Dto> listasSuppliers = new ArrayList<>();
		    	   detalleSuppliers = new CampaignFormat2Dto();
		    	
		    		 for (Object[] reg : listacompleta) {	   
		    		   detalleSuppliers = new CampaignFormat2Dto();
		    		   channelsRecordDto = new ChannelsRecordDto();
		    		   technologyRecordDto = new TechnologyRecordDto();
		    		  //detalleUnits.setId((int) reg[0]);	
		    		   detalleStatus = new StatusDto2();
		    		   detalleLayerOut = new StatusDto2();
		    		   detalleTipo = new StatusDto2();
		    		   detalleType = new StatusDto2();		    		 
		    		   
		    		   technologyRecordDto.setId((int) reg[0]);
		    		   technologyRecordDto.setRef((String) reg[1]);
		    		   technologyRecordDto.setName((String) reg[2]);
		    		   if (reg[4] != null) {
		    			    // 1. Convertir el objeto de la DB a Date
		    			    Date lastUpdateDate = (Date) reg[4]; 
		    			    
		    			    // 2. Definir el formato deseado
		    			    SimpleDateFormat outFormat = new SimpleDateFormat("yyyy-MM-dd");
		    			    
		    			    // 3. Convertir a String
		    			    String fechaFormateada = outFormat.format(lastUpdateDate);
		    			    
		    			    // 4. Asignar a tu DTO
		    			    technologyRecordDto.setLastact(fechaFormateada);
		    			} else {
		    				technologyRecordDto.setLastact(""); 
		    			}
		    		   
		    		   ////////////seteo el layer/////// 
		    		   detalleLayerOut.setId(Integer.parseInt((String) reg[6]));
		    		   detalleLayerOut.setName((String) reg[5]);
		    		   ////////////////////////////
		    		   technologyRecordDto.setLayer(detalleLayerOut);
		    		   ////////////seteo el type/////// 
		    		   detalleTipo.setId(Integer.parseInt((String) reg[8]));
		    		   detalleTipo.setName((String) reg[7]);
		    		   ////////////////////////////
		    		   technologyRecordDto.setType(detalleTipo);
		    		   ////////////seteo el status/////// 
		    		   detalleStatus.setId((int) reg[9]);
		    		   detalleStatus.setName((String) reg[10]);
		    		   ///////////////////////////////////////////////
		    		   technologyRecordDto.setStatus(detalleStatus);
		    		   technologyRecordDto.setDsc((String) reg[3]);
		    		   
		    				    		   			    					    	     		    				    				    	
		    		   listasRecordTech.add(technologyRecordDto);
		    	   }
		    	
		    	   
      	    	 	detallePrivilege = new PrivilegesAllDto();
      	    	       boolean tieneView = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,405);
					   boolean tieneUpdate = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,406);
					   boolean tieneAdd = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,407);
					   boolean tieneDelete = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,408);
					   //existsByRolidAndPrivilegeid
					   
	      	    	 	detallePrivilege.setView(tieneView);
			    	  	detallePrivilege.setUpdate(tieneUpdate);		    	  
			    	  	detallePrivilege.setAdd(tieneAdd);
			    	  	detallePrivilege.setDelete(tieneDelete);
			    	  	
			    	  	
			    	  	 
			    	  	 String SetenciaLayer="";
							
			    	  	SetenciaLayer= "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 = 'TECH_LAYER' ORDER BY valor ASC";
					      
					      Query queryLayer= entityManager.createNativeQuery(SetenciaLayer);
					       List<Object[]> listaLayer= queryLayer.getResultList();
					       for (Object[] layer : listaLayer) {
					    	   detalleLayer = new TypesUnitDto();
					    	  
					    	   detalleLayer.setDsc((String) layer[0]);
					    	   detalleLayer.setValue((String) layer[1]);
					    	   listasLayer.add(detalleLayer);
					       }
		    	          
					       String SetenciaType="";
							
					       SetenciaType= "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 = 'TECH_TYPE' ORDER BY valor ASC";
						      
						      Query queryType = entityManager.createNativeQuery(SetenciaType);
						       List<Object[]> listaperiodos= queryType.getResultList();
						       for (Object[] typesperi : listaperiodos) {
						    	   detallePeriodos = new TypesUnitDto();
						    	  
						    	   detallePeriodos.setDsc((String) typesperi[0]);
						    	   detallePeriodos.setValue((String) typesperi[1]);
						    	   listasPeriodos.add(detallePeriodos);
						       }
						   String Setenciayesno="";
								
						   Setenciayesno= "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 = 'TECH_YESNO' ORDER BY valor ASC";
							      
							      Query queryYesno = entityManager.createNativeQuery(Setenciayesno);
							       List<Object[]> listayesno= queryYesno.getResultList();
							       for (Object[] typesyesno : listayesno) {
							    	   detalleYesno= new TypesUnitDto();
							    	  
							    	   detalleYesno.setDsc((String) typesyesno[0]);
							    	   detalleYesno.setValue((String) typesyesno[1]);
							    	   listasYesno.add(detalleYesno);
							       } 
							       
						    String SetenciaMonitor="";
									//detalleMonitor
						    SetenciaMonitor= "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 = 'TECH_MONITORED' ORDER BY valor ASC";
								      
								      Query queryMonitor = entityManager.createNativeQuery(SetenciaMonitor);
								       List<Object[]> listamon= queryMonitor.getResultList();
								       for (Object[] typesmonitor : listamon) {
								    	   detalleMonitor = new TypesUnitDto();
								    	  
								    	   detalleMonitor.setDsc((String) typesmonitor[0]);
								    	   detalleMonitor.setValue((String) typesmonitor[1]);
								    	   listasMonitor.add(detalleMonitor);
								       }	       
		    	
								     String  SetenciaEoleo= "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 = 'TECH_EOLEOS' ORDER BY valor ASC";
												      
										       Query queryEoleo = entityManager.createNativeQuery(SetenciaEoleo);
											   List<Object[]> listaeoleo= queryEoleo.getResultList();
											   for (Object[] typeseoleos : listaeoleo) {
												           detalleEoleos= new TypesUnitDto();
												    	  
												           detalleEoleos.setDsc((String) typeseoleos[0]);
												           detalleEoleos.setValue((String) typeseoleos[1]);
												           listasEoleos.add(detalleEoleos);
												       } 
							 
								       TechResponseDto.setNumofrecords(cuantosregistro);
								       TechResponseDto.setSessionvalidthru(fechaComoCadena);
								       TechResponseDto.setRecords(listasRecordTech);
								       TechResponseDto.setTechlayer(listasLayer);
								       TechResponseDto.setTechtype(listasPeriodos);
								       TechResponseDto.setTechmonitored(listasMonitor);
								       TechResponseDto.setTechyesno(listasYesno);
								       TechResponseDto.setTecheoleos(listasEoleos);
								       TechResponseDto.setPrivileges(detallePrivilege);    		   			
		  						           
                return ResponseEntity.ok(TechResponseDto);
		     						
			 } else {
				 
				 TypedQuery<ChannelsDtoStatus> suppliers= entityManager.createQuery(QueryTotal, ChannelsDtoStatus.class);
				  List<ChannelsDtoStatus> listacompleta = suppliers.getResultList();
				  List<CampaignFormat2Dto> listasSuppliers2 = new ArrayList<>();
				  
				
				  
				  for(ChannelsDtoStatus suppli : listacompleta) {
		    		   detalleCompaing2 = new CampaignFormat2Dto();
		    		 
		    		   detalleStatus2 = new StatusDto();
		    		   detalleCompaing2.setId(suppli.getId());
		    		   detalleCompaing2.setName(suppli.getName());
		    		  
		    		   
			    	  // detalleStatus.setId(suppli.getStatus());
			    	  /// detalleStatus.setName(suppli.getEstatus());
				     
		    		   detalleStatus2.setId(suppli.getStatus());
			    	   detalleStatus2.setName(suppli.getEstatus());
				     
			    	   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("/technologies/{technologyid}")
	public ResponseEntity<?> getonetechnologies(HttpServletRequest request, @PathVariable("technologyid") final Integer technologyid) throws ParseException {
		RespuestaDto respuesta = new RespuestaDto("", false);
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		ChannelsResponseDto channelsResponseDto = new ChannelsResponseDto();
		TechnologyResponseDto TechResponseDto = new TechnologyResponseDto();
		TechnologyEntryResponseDto technologyEntryResponseDto = new TechnologyEntryResponseDto();
		
		ChannelsRecordDto channelsRecordDto = new ChannelsRecordDto();
		RecordCatalogoResponseDto channelsFormatResponseDto = new RecordCatalogoResponseDto();
		CampaignFormat2Dto detalleCompaing2;
		int formatList = 0;
		CampaignFormat2Dto detalleSuppliers;
		StatusDto2 detalleStatus;
		StatusDto2 detalleLayerOut;
		StatusDto2 detalleType;
		StatusDto2 detalleTipo;
		StatusDto2 detalleApp;
		StatusDto2 detaleEoleo;
		StatusDto2 detallefacilities;
		StatusDto detalleStatus2;
		ChannelsAmountDto detalleAmountOP;
		ChannelsAmountDto detallevolumeOP;
		StatusDto2 detallecapacityperiod;
		ServiceOffersDescDto detalleserviceoffers;
		List<TypesUnitDto> listasTypes = new ArrayList<>();
		List<ServiceOffersDescDto> listasOfertas = new ArrayList<>();
		PrivilegesAllDto detallePrivilege;
		List<TypesUnitDto> listasLayer = new ArrayList<>();
		List<TypesUnitDto> listasYesno = new ArrayList<>();
		List<TypesUnitDto> listasMonitor = new ArrayList<>();
		
		
	     
	     Long cuantosregistro = (long) 0;
	     
	     List<PrivilegesAllDto> listasPrivelege = new ArrayList<>();
	     List<ChannelsRecordDto> listasRecord= new ArrayList<>();
	     List<TechnologyRecordEntry> listasRecordTech= new ArrayList<>();
	     TechnologyRecordDto technologyRecordDto= new TechnologyRecordDto();
	     TechnologyRecordEntry  technologyRecordEntry= new TechnologyRecordEntry();
	     
	     TypesUnitDto detalleTypes;
	     TypesUnitDto detallePeriodos;
	     TypesUnitDto detalleLayer;
	     TypesUnitDto detalleYesno;
	     TypesUnitDto detalleMonitor;
	     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 searchLayer = "";
	      String searchTyper = "";
	      int searchApp = 0;
	      
	      int searchFaci = 0;
	   	  String contentIn = "";
		  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, 405);
					   if (formatList!=2) {
					        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 {
						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 {
			
			
			
			
		    	// 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";
				
				String SentenciaBase = "  SELECT u.id,u.ref,u.name,u.dsc,u.lastupdate,pr.descr as layer,pr.valor as layerid,pr1.descr as tipo,pr1.valor as tipoid,  "
						+ "							 u.status,CASE WHEN u.status = 1 THEN 'Activo' ELSE 'Inactivo' END AS estatus,u.applicationid,u.facilityid, "
						+ "	pr2.descr as eoleo,pr2.valor as eoleoid,a.name AS application_name , f.name AS facilities_name ,dr,hs,sla,monitored,classified,techowner,businessowner from main.technology u  "
						+ "						 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 = 'TECH_LAYER') pr ON u.layer = CAST(pr.valor AS INTEGER) "
						+ "						 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 = 'TECH_TYPE') pr1 ON u.type = CAST(pr1.valor AS INTEGER)"
						+ "	                      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 = 'TECH_EOLEOS') pr2 ON u.eoleos = CAST(pr2.valor AS INTEGER)"
						+ "	                     JOIN main.applications a on a.id = u.applicationid"
						+ "	                     JOIN main.facilities f on f.id = u.facilityid  "
						+ " WHERE u.id  = " + technologyid ;
				
				
			Query query;
			
		
			       
				       query = entityManager.createNativeQuery(SentenciaBase);
				       query.setFirstResult(offsetIn);
					   query.setMaxResults(numofrecordsIn);
					   List<Object[]> listacompleta = query.getResultList();
				
			      
			      //List<ChannelsDtoStatus> listacompleta = channels.getResultList();
			   
		    	   List<CampaignFormat2Dto> listasSuppliers = new ArrayList<>();
		    	   detalleSuppliers = new CampaignFormat2Dto();
		    	
		    		 for (Object[] reg : listacompleta) {	   
		    		   detalleSuppliers = new CampaignFormat2Dto();
		    		   channelsRecordDto = new ChannelsRecordDto();
		    		   technologyRecordDto = new TechnologyRecordDto();
		    		  //detalleUnits.setId((int) reg[0]);	
		    		   detalleStatus = new StatusDto2();
		    		   detalleLayerOut = new StatusDto2();
		    		   detalleTipo = new StatusDto2();
		    		   detalleType = new StatusDto2();		    		 
		    		   detalleApp = new StatusDto2();
		    		   detaleEoleo = new StatusDto2();
		    		   detallefacilities = new StatusDto2();
		    		   technologyRecordEntry.setId((int) reg[0]);
		    		   technologyRecordEntry.setRef((String) reg[1]);
		    		   technologyRecordEntry.setName((String) reg[2]);
		    		   if (reg[4] != null) {
		    			    // 1. Convertir el objeto de la DB a Date
		    			    Date lastUpdateDate = (Date) reg[4]; 
		    			    
		    			    // 2. Definir el formato deseado
		    			    SimpleDateFormat outFormat = new SimpleDateFormat("yyyy-MM-dd");
		    			    
		    			    // 3. Convertir a String
		    			    String fechaFormateada = outFormat.format(lastUpdateDate);
		    			    
		    			    // 4. Asignar a tu DTO
		    			   // technologyRecordEntry.setLastact(fechaFormateada);
		    			    technologyRecordEntry.setLastupdate(fechaFormateada);
		    			} else {
		    				technologyRecordEntry.setLastupdate(""); 
		    			}
		    		   ///////////////seteo la app//////////////////////
		    		   detalleApp.setId((int) reg[11]);
		    		   detalleApp.setName((String) reg[15]);
		    		   technologyRecordEntry.setApplication(detalleApp);
		    		   //////////////////////////////////////////
		    		   technologyRecordEntry.setDr((int) reg[17]);
		    		   technologyRecordEntry.setHs((int) reg[18]);
		    		   technologyRecordEntry.setSla((int) reg[19]);
		    		   technologyRecordEntry.setMonitored((int) reg[20]);
		    		   technologyRecordEntry.setClassified((int) reg[21]);
		    		   technologyRecordEntry.setBusinessowner((String) reg[22]);
		    		   technologyRecordEntry.setTechowner((String) reg[23]);
		    		   
		    		   
		               ///////////////seteo el facilities//////////////////////
		    		   detallefacilities.setId((int) reg[12]);
		    		   detallefacilities.setName((String) reg[16]);
		 		       technologyRecordEntry.setFacility(detallefacilities);
		 		        //////////////////////////////////////////
		 		      ///////////////seteo el eoleos//////////////////////
		 		       detaleEoleo.setId(Integer.parseInt((String) reg[14]));
		 		       detaleEoleo.setName((String) reg[13]);
		 		       technologyRecordEntry.setEoleos(detaleEoleo);
		 		        //////////////////////////////////////////
		    		   ////////////seteo el layer/////// 
		    		   detalleLayerOut.setId(Integer.parseInt((String) reg[6]));
		    		   detalleLayerOut.setName((String) reg[5]);
		    		   ////////////////////////////
		    		   technologyRecordEntry.setLayer(detalleLayerOut);
		    		   ////////////seteo el type/////// 
		    		   detalleTipo.setId(Integer.parseInt((String) reg[8]));
		    		   detalleTipo.setName((String) reg[7]);
		    		   ////////////////////////////
		    		   technologyRecordEntry.setType(detalleTipo);
		    		   ////////////seteo el status/////// 
		    		   detalleStatus.setId((int) reg[9]);
		    		   detalleStatus.setName((String) reg[10]);
		    		   ///////////////////////////////////////////////
		    		   technologyRecordEntry.setStatus(detalleStatus);
		    		   technologyRecordEntry.setDsc((String) reg[3]);
		    		   
		    		   
		    		   
		    				    		   			    					    	     		    				    				    	
		    		   listasRecordTech.add(technologyRecordEntry);
		    	   }
		    	
		    	   
      	    	 
			    	  	
			    	  	 
			    	  	 String SetenciaLayer="";
							
			    	  	SetenciaLayer= "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 = 'TECH_LAYER' ORDER BY valor ASC";
					      
					      Query queryLayer= entityManager.createNativeQuery(SetenciaLayer);
					       List<Object[]> listaLayer= queryLayer.getResultList();
					       for (Object[] layer : listaLayer) {
					    	   detalleLayer = new TypesUnitDto();
					    	  
					    	   detalleLayer.setDsc((String) layer[0]);
					    	   detalleLayer.setValue((String) layer[1]);
					    	   listasLayer.add(detalleLayer);
					       }
		    	          
					       String SetenciaType="";
							
					       SetenciaType= "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 = 'TECH_TYPE' ORDER BY valor ASC";
						      
						      Query queryType = entityManager.createNativeQuery(SetenciaType);
						       List<Object[]> listaperiodos= queryType.getResultList();
						       for (Object[] typesperi : listaperiodos) {
						    	   detallePeriodos = new TypesUnitDto();
						    	  
						    	   detallePeriodos.setDsc((String) typesperi[0]);
						    	   detallePeriodos.setValue((String) typesperi[1]);
						    	   listasPeriodos.add(detallePeriodos);
						       }
						   String Setenciayesno="";
								
						   Setenciayesno= "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 = 'TECH_YESNO' ORDER BY valor ASC";
							      
							      Query queryYesno = entityManager.createNativeQuery(Setenciayesno);
							       List<Object[]> listayesno= queryYesno.getResultList();
							       for (Object[] typesyesno : listayesno) {
							    	   detalleYesno= new TypesUnitDto();
							    	  
							    	   detalleYesno.setDsc((String) typesyesno[0]);
							    	   detalleYesno.setValue((String) typesyesno[1]);
							    	   listasYesno.add(detalleYesno);
							       } 
							       
						    String SetenciaMonitor="";
									//detalleMonitor
						    SetenciaMonitor= "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 = 'TECH_MONITORED' ORDER BY valor ASC";
								      
								      Query queryMonitor = entityManager.createNativeQuery(SetenciaMonitor);
								       List<Object[]> listamon= queryMonitor.getResultList();
								       for (Object[] typesmonitor : listamon) {
								    	   detalleMonitor = new TypesUnitDto();
								    	  
								    	   detalleMonitor.setDsc((String) typesmonitor[0]);
								    	   detalleMonitor.setValue((String) typesmonitor[1]);
								    	   listasMonitor.add(detalleMonitor);
								       }	       
		    	
								       technologyEntryResponseDto.setEntry(technologyRecordEntry);
								       technologyEntryResponseDto.setTechlayer(listasLayer);
								       technologyEntryResponseDto.setTechmonitored(listasMonitor);
								       technologyEntryResponseDto.setTechtype(listasPeriodos);
								       technologyEntryResponseDto.setTechyesno(listasYesno);
							 		   			
		  						           
                return ResponseEntity.ok(technologyEntryResponseDto);
		     						
			
       
		}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);
	
	}


	
	@PostMapping("/technologies/{technologyid}")
	public ResponseEntity<?> actualizartechnologies(HttpServletRequest request,
			@RequestBody TecnologyActualizarDto tecnologyActualizarDto,
			@PathVariable("technologyid") final Integer technologyid) throws ParseException {

		RespuestaMsgDto respuesta = new RespuestaMsgDto("");
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		long cuantosregistro = 0;
		long cuantosregistro2 = 0;
		long cuantosregistro3 = 0;

		String sessionid = request.getHeader("Authorization");
		Date fecha = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dataFormattata = formatter.format(fecha);

		AuditRequestDto auditDto = new AuditRequestDto();
		String module = "";
		String Descmodule = "";

		Date fecha3 = new Date();
		SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dataFormattata2 = formatter.format(fecha3);
		Date fechaDate2 = formatter.parse(dataFormattata2);

		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.
		SimpleDateFormat salida = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // 2024-12-23 23:00
		String fechaComoCadena = salida.format(ValidThrufechaSalida);
		System.out.println(fechaComoCadena);

		// Verifico la session
		if (sessionid == null) {
			respuesta.setMsg("Llamada al servicio malformado");
			estatus = HttpStatus.BAD_REQUEST;
			return new ResponseEntity(respuesta, estatus);
		} else {
			sessionid = sessionid.substring(7); // verifico si la sesión del usuario existe.

			Optional<Users> encontreSessionUsuario = usersRepository.getBySessionid(sessionid);
			if (encontreSessionUsuario.isPresent()) { // si la sesión del usuario existe
				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,
						encontreSessionUsuario.get().getId());
				if (fechaComoCadena == "") {
					RespuestaMsgDto respuestaDto2;
					String var2 = "";
					boolean bloked2 = false;
					respuestaDto2 = new RespuestaMsgDto(var2);
					respuestaDto2.setMsg("Sesión expirada o inválida");
					return new ResponseEntity(respuestaDto2, HttpStatus.UNAUTHORIZED);
				}
				
				
				 /*String Salida = usersService.verificarCaracteresValidosConRegex(tecnologyActualizarDto.getName());
				  
				  if (Salida=="NOOK") {
					  String var = "";
						boolean bloked = false;
						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
						//respuestaDto.setBlocked(bloked);
						respuestaDto.setMsg("Caracteres no permitidos"); 
						return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
				  }
				  
                 String SalidaDsc = usersService.verificarCaracteresValidosConRegex(tecnologyActualizarDto.getDsc());
				  
				  if (SalidaDsc=="NOOK") {
					  String var = "";
						boolean bloked = false;
						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
						//respuestaDto.setBlocked(bloked);
						respuestaDto.setMsg("Caracteres no permitidos"); 
						return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
				  }
				  
				  String SalidaRef = usersService.verificarCaracteresValidosConRegex(tecnologyActualizarDto.getRef());
				  
				  if (SalidaDsc=="NOOK") {
					  String var = "";
						boolean bloked = false;
						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
						//respuestaDto.setBlocked(bloked);
						respuestaDto.setMsg("Caracteres no permitidos"); 
						return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
				  }*/
				  
				
				int rolisvalid = 0;
				
				if (technologyid != 0) {// actualizar las tecnologías

					try {
						// verifico si tiene el privilegio
						rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 406);
						if (rolisvalid == 0) {
							respuesta.setMsg("No tiene los Privilegios");
							estatus = HttpStatus.FORBIDDEN;
							return new ResponseEntity(respuesta, estatus);
						}

						// Verificar si el campo nombre no puede ser vacío
						if (tecnologyActualizarDto.getName() == "") {
							String var = "";
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							respuestaDto.setMsg("El campo nombre no puede ser vacío");
							return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
						}

						if (tecnologyActualizarDto.getRef() == "") {
							String var = "";
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							respuestaDto.setMsg("El campo nombre no puede ser vacío");
							return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
						}
						
						// Verifico si existe el id de la tecnología en la base de datos
						Optional<Technology> technology= technologyRepository.findById(technologyid);

						Technology technology1 = new Technology();
						Technology technology2 = new Technology();
						
						// Verifico si encontre la tecnología
						if (!technology.isPresent()) {
							respuesta.setMsg("Registro no encontrado");
							return new ResponseEntity(respuesta, HttpStatus.NOT_FOUND);
						}

						// Verificar si el nombre de la tecnología existe en la base de datos
						if (technologyRepository.existsByName(tecnologyActualizarDto.getName()) 
								&& technologyRepository.getByName(tecnologyActualizarDto.getName()).get().getId()!=technologyid) {
							respuesta.setMsg("Registro Duplicado");
							return new ResponseEntity(respuesta, HttpStatus.CONFLICT);
						}
						
						// Verificar si el ref de la tecnología existe en la base de datos
						if (technologyRepository.existsByRef(tecnologyActualizarDto.getRef()) 
								&& technologyRepository.getByRef(tecnologyActualizarDto.getRef()).get().getId()!=technologyid) {
							respuesta.setMsg("Registro Duplicado");
							return new ResponseEntity(respuesta, HttpStatus.CONFLICT);
						}
						
						technology1=technology.get();
						// Construyo los datos de la entidad de tecnología
						technology1.setStatus(tecnologyActualizarDto.getStatus());
						technology1.setName(tecnologyActualizarDto.getName());
						technology1.setDsc(tecnologyActualizarDto.getDsc());
						technology1.setRef(tecnologyActualizarDto.getRef());
						technology1.setLayer(tecnologyActualizarDto.getLayer());
						technology1.setType(tecnologyActualizarDto.getType());
						technology1.setFacilityid(tecnologyActualizarDto.getFacilityid());
						technology1.setApplicationid(tecnologyActualizarDto.getApplicationid());
						technology1.setEoleos(tecnologyActualizarDto.getEoleos());
						technology1.setDr(tecnologyActualizarDto.getDr());
						technology1.setHs(tecnologyActualizarDto.getHs());
						technology1.setSla(tecnologyActualizarDto.getSla());
						technology1.setMonitored(tecnologyActualizarDto.getMonitored());
						technology1.setLastupdate(tecnologyActualizarDto.getLastupdate());
						technology1.setTechowner(tecnologyActualizarDto.getTechowner());
						technology1.setBusinessowner(tecnologyActualizarDto.getBusinessowner());
						technology1.setClassified(tecnologyActualizarDto.getClassified());
						technology1.setModifiedat(fecha2);
						technology2 = technologyRepository.save(technology1);

						if (technology2 != null) {
							
							module = "Tecnologías";
							Descmodule = "Se actualizó la Tecnología: " + technology1.getName() + " con id: "+technology1.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(fechaDate2);
							usersService.registrarAuditSesion(auditDto);

							RespuestaValueDto respuestaValueDto = new RespuestaValueDto(technology1.getId());
							URI location = URI.create("/technologies/" + technology1.getId()); // O la URL correcta para // tu
																					// recurso

							return ResponseEntity.created(location).body(respuestaValueDto);
						}
					} catch (Exception e) {
						respuesta.setMsg("Error interno del servidor "+e.getMessage());
						estatus = HttpStatus.INTERNAL_SERVER_ERROR;
					}

				} else { // incluir la tecnología

					try {
						rolisvalid = auditRepository
								.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 407);
						if (rolisvalid == 0) {
							respuesta.setMsg("No tiene los Privilegios");
							estatus = HttpStatus.FORBIDDEN;
							return new ResponseEntity(respuesta, estatus);
						}

						// Verificar si el campo nombre no puede ser vacío
						if (tecnologyActualizarDto.getName() == "") {
							String var = "";
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							respuestaDto.setMsg("El campo nombre no puede ser vacío");
							return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
						}

						if (tecnologyActualizarDto.getRef() == "") {
							String var = "";
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							respuestaDto.setMsg("El campo nombre no puede ser vacío");
							return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
						}
						
						if (technologyRepository.existsByName(tecnologyActualizarDto.getName())) {
							String var = "";
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							respuestaDto.setMsg("Registro Duplicado");
							return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
						}
						
						if (technologyRepository.existsByRef(tecnologyActualizarDto.getRef())) {
							String var = "";
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							respuestaDto.setMsg("Registro Duplicado");
							return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
						}
						
						Technology technology1=new Technology();
						Technology technology2=new Technology();
						// Construyo los datos de la entidad de Tecnología
						technology1.setStatus(tecnologyActualizarDto.getStatus());
						technology1.setName(tecnologyActualizarDto.getName());
						technology1.setDsc(tecnologyActualizarDto.getDsc());
						technology1.setRef(tecnologyActualizarDto.getRef());
						technology1.setLayer(tecnologyActualizarDto.getLayer());
						technology1.setType(tecnologyActualizarDto.getType());
						technology1.setFacilityid(tecnologyActualizarDto.getFacilityid());
						technology1.setApplicationid(tecnologyActualizarDto.getApplicationid());
						technology1.setEoleos(tecnologyActualizarDto.getEoleos());
						technology1.setDr(tecnologyActualizarDto.getDr());
						technology1.setHs(tecnologyActualizarDto.getHs());
						technology1.setSla(tecnologyActualizarDto.getSla());
						technology1.setMonitored(tecnologyActualizarDto.getMonitored());
						technology1.setLastupdate(tecnologyActualizarDto.getLastupdate());
						technology1.setTechowner(tecnologyActualizarDto.getTechowner());
						technology1.setBusinessowner(tecnologyActualizarDto.getBusinessowner());
						technology1.setClassified(tecnologyActualizarDto.getClassified());
						technology1.setCreatedat(fecha2);
						technology1.setModifiedat(fecha2);
						
						technology2 = technologyRepository.save(technology1);

						try {
							if (technology2 != null) {
								
								module = "Tecnologías";
								Descmodule = "Se insertó la Tecnología: " + technology1.getName() + " con id: "+technology1.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(fechaDate2);
								usersService.registrarAuditSesion(auditDto);

								RespuestaValueDto respuestaValueDto = new RespuestaValueDto(technology1.getId());
								URI location = URI.create("/technologies/" + technology1.getId()); // O la URL correcta
																								// para // tu
																								// recurso
								return ResponseEntity.created(location).body(respuestaValueDto);
							} else {
								respuesta.setMsg("No se pudo actualizar por alguna razón");
								estatus = HttpStatus.CONFLICT;
								return new ResponseEntity(respuesta, estatus);
							}
						} catch (Exception e) {
							respuesta.setMsg("Error interno.  Descripción del error" + e.getMessage());
							estatus = HttpStatus.INTERNAL_SERVER_ERROR;
							return new ResponseEntity(respuesta, estatus);
						}

					} catch (Exception e) {
						respuesta.setMsg("Error interno.  Descripción del error" + e.getMessage());
						estatus = HttpStatus.INTERNAL_SERVER_ERROR;
						return new ResponseEntity(respuesta, estatus);
					}
					finally {
						if (entityManager != null && entityManager.isOpen()) {
							entityManager.close();
						}
					}
				}
			}

			return new ResponseEntity(respuesta, HttpStatus.OK);

		}
	}
	
	@DeleteMapping("/technologies/{technologyid}")
	public ResponseEntity<?> borrarTechnology(HttpServletRequest request,
			@PathVariable("technologyid") final Integer technologyid) throws ParseException {

		RespuestaMsgDto respuesta = new RespuestaMsgDto("");
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		long cuantosregistro = 0;

		String sessionid = request.getHeader("Authorization");
		Date fecha = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dataFormattata = formatter.format(fecha);

		AuditRequestDto auditDto = new AuditRequestDto();
		String module = "";
		String Descmodule = "";

		Date fecha3 = new Date();
		SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dataFormattata2 = formatter.format(fecha3);
		Date fechaDate2 = formatter.parse(dataFormattata2);

		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.
		SimpleDateFormat salida = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // 2024-12-23 23:00
		String fechaComoCadena = salida.format(ValidThrufechaSalida);
		System.out.println(fechaComoCadena);

		// Verifico la session
		if (sessionid == null) {
			respuesta.setMsg("Llamada al servicio malformado");
			estatus = HttpStatus.BAD_REQUEST;
			return new ResponseEntity(respuesta, estatus);
		} else {
			sessionid = sessionid.substring(7); // verifico si la sesión del usuario existe.

			Optional<Users> encontreSessionUsuario = usersRepository.getBySessionid(sessionid);
			if (encontreSessionUsuario.isPresent()) { // si la sesión del usuario existe
				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,
						encontreSessionUsuario.get().getId());
				if (fechaComoCadena == "") {
					RespuestaMsgDto respuestaDto2;
					String var2 = "";
					boolean bloked2 = false;
					respuestaDto2 = new RespuestaMsgDto(var2);
					respuestaDto2.setMsg("Sesión expirada o inválida");
					return new ResponseEntity(respuestaDto2, HttpStatus.UNAUTHORIZED);
				}

				int rolisvalid = 0;

				try {
					// verifico si tiene el privilegio
					rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(),
							408);
					if (rolisvalid == 0) {
						respuesta.setMsg("No tiene los Privilegios");
						estatus = HttpStatus.FORBIDDEN;
						return new ResponseEntity(respuesta, estatus);
					}

					// Verifico si existe el id de la tecnología está en la base de datos
					Optional<Technology> technology = technologyRepository.findById(technologyid);

					Technology technology1 = new Technology();
					Technology technology2 = new Technology();
					// Verifico si encontre la aplicación
					if (!technology.isPresent()) {
						respuesta.setMsg("Registro no encontrado");
						return new ResponseEntity(respuesta, HttpStatus.NOT_FOUND);
					}

					technology1 = technology.get();
					technology2 = technology1;
					try {
						// Se borra la Tecnología
						technologyRepository.deleteById(technologyid);

						module = "Tecnologías";
						Descmodule = "Se borró la Tecnología: " + technology2.getName() + " con id: " + technologyid;
						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(fechaDate2);
						usersService.registrarAuditSesion(auditDto);

						RespuestaValueDto respuestaValueDto = new RespuestaValueDto(technologyid);
						URI location = URI.create("/technology/" + technologyid); // O la URL correcta para // tu
																					// recurso

						return ResponseEntity.created(location).body(respuestaValueDto);

					} catch (Exception e) {
						respuesta.setMsg("No se pudo borrar por alguna razón");
						estatus = HttpStatus.CONFLICT;
						return new ResponseEntity(respuesta, estatus);
					} finally {
						if (entityManager != null && entityManager.isOpen()) {
							entityManager.close();
						}
					}
				} catch (Exception e) {
					respuesta.setMsg("Error interno. Descripción del error " + e.getMessage());
					estatus = HttpStatus.INTERNAL_SERVER_ERROR;
					return new ResponseEntity(respuesta, estatus);
				} finally {
					if (entityManager != null && entityManager.isOpen()) {
						entityManager.close();
					}
				}

			}

			return new ResponseEntity(respuesta, HttpStatus.OK);

		}

	}
}
