package com.dacrt.SBIABackend.controler;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
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.beans.factory.annotation.Value;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.JdbcTemplate;
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.CampaignFormat2Dto;
import com.dacrt.SBIABackend.dto.CampaignRecordFormat2Dto;
import com.dacrt.SBIABackend.dto.CampainDetailDto;
import com.dacrt.SBIABackend.dto.CampaingDto;
import com.dacrt.SBIABackend.dto.CampaingDtoStatus;
import com.dacrt.SBIABackend.dto.ChannelDto;
import com.dacrt.SBIABackend.dto.ChannelsDtoStatus;
import com.dacrt.SBIABackend.dto.StatusDto;
import com.dacrt.SBIABackend.dto.UnitsDto;
import com.dacrt.SBIABackend.dto.UnitsUsersDto;
import com.dacrt.SBIABackend.dto.requestDto.CampaingRequestNewDto;
import com.dacrt.SBIABackend.dto.requestDto.UnitsRequestNewDto;
import com.dacrt.SBIABackend.dto.responseDto.CampainDetailResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.CampainsResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.ChannelsResponseDto;
import com.dacrt.SBIABackend.entity.Campaigns;
import com.dacrt.SBIABackend.entity.Campaignunits;
import com.dacrt.SBIABackend.entity.Facilities;
import com.dacrt.SBIABackend.entity.Unitprocesses;
import com.dacrt.SBIABackend.entity.Units;
import com.dacrt.SBIABackend.entity.Userunits;
import com.dacrt.SBIABackend.entity.Vicepresidencies;
import com.dacrt.SBIABackend.repository.CampaignsRepository;
import com.dacrt.SBIABackend.repository.CampaignunitsRepository;
import com.dacrt.SBIABackend.repository.SuppliersRepository;
import com.dacrt.SBIABackend.repository.UnitsRepository;
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.PrivilegeAllCampaignDto;
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.RolesResponseDto;
import com.dacrt.SBIABackend.security.dto.RolesUserDto;
import com.dacrt.SBIABackend.security.dto.SuppliersUsersDto;
import com.dacrt.SBIABackend.security.dto.UserDetailsResponseDto;
import com.dacrt.SBIABackend.security.dto.UsersListDto;
import com.dacrt.SBIABackend.security.dto.UsersRolesPriWorStaDto;
import com.dacrt.SBIABackend.security.dto.UsersUnitDto;
import com.dacrt.SBIABackend.security.dto.WorkersUsersDto;
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.service.CampaignsService;
import com.dacrt.SBIABackend.utils.HttpReqRespUtils;


@RestController
//@RequestMapping("/units")   
@CrossOrigin(origins = "*")
public class CampaignsController {
	

	@Autowired
	private ParamsRepository paramsRepository;
	
	@Autowired
	private UsersRepository usersRepository;
	
	@Autowired
	private AuditRepository auditRepository;
	
	@Autowired
	private CampaignsRepository campaignsRepository;
	
	@Autowired
	private CampaignunitsRepository campaignunitsRepository;
	
	@Autowired
	private UnitsRepository unitsRepository;
	
	@Autowired
	private RolesPrivilegesRepository rolesPrivilegesRepository;
	
	@Autowired
	UsersService usersService;
	
	@Autowired
	ParamsService paramsService;
	
	@Autowired
	MenuService menuService;
	
	@Autowired
	SecurityService securityService;
	
	@Autowired
	CampaignsService campaignsService;
	
	@PersistenceContext
    private EntityManager entityManager;
	
	@Autowired
    private JdbcTemplate jdbcTemplate;
	
	@Value("${spring.datasource.url}")
	private String conexion;
	
	@Value("${spring.datasource.username}")
	private String userbd;
	
	@Value("${spring.datasource.password}")
	private String passbd;
	
	@Autowired
	SuppliersRepository suppliersRepository;
	
	

	@GetMapping("/campaigns/{campaignid}/status/{action}")
	public ResponseEntity<?> changeCampaing(HttpServletRequest request, @PathVariable("campaignid") final Integer campaignid,@PathVariable("action") final Integer action)
			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, 104);
				   int rolisvalidChange = auditRepository.getCantbyRolAndPrivi(idrol, 105);
				
				   
				
				try {
					
					if (campaignsRepository.existsById(campaignid)) {
						
						
						  Optional<Campaigns> Campanachange = campaignsRepository.findById(campaignid);
						  int statusactual = Campanachange.get().getStatus();
						  
						  int result = 0;
						  String SentenciaBase = "SELECT  CASE WHEN u.dateto < now()"									
									+ "	then TRUE ELSE FALSE END AS expiro FROM main.campaigns u where u.id = " + campaignid ;
						  
						   Query queryTypes = entityManager.createNativeQuery(SentenciaBase);
					       boolean listatipos= (boolean) queryTypes.getSingleResult();
					       boolean RemoteJson = listatipos;
					       boolean fas = RemoteJson;
					     ///cuando envian en el estatus el valor 0, para cerrar una campana.
					       
					       if (action==0) {
					    	   
					    	   if (RemoteJson) { //pregunta si esta expirada porque debe cerrarla porque su estatus es 1 (abierta) y debe tener el rol 105
					    		   
					    		    if (rolisvalidChange==0 ) {  //rol 105
					    		    	//boolean bloked = false;
										RespuestaMsgDto respuestaPrivDto = new RespuestaMsgDto(var);
										//respuestaDto.setBlocked(bloked);
										respuestaPrivDto.setMsg("No tiene los Privilegios"); 
										return new ResponseEntity(respuestaPrivDto, HttpStatus.FORBIDDEN);
					    		    	
					    		    } else {
					    		    	  campaignsRepository.updateAllCampaings();
							    		  campaignsRepository.updateOneCampaingByIdStatus(campaignid,action);
							    		  result = 0;
					    		    }
					    		      
					    	   } else {
                                      
				    		    	  campaignsRepository.updateAllCampaings();
						    		  campaignsRepository.updateOneCampaingByIdStatus(campaignid,action);
						    		  result = 0;
					    		  
					    	   }
					        }
					       
					       ///cuando envian en el estatus el valor 1, para Abrir una campana
					       
                           if (action==1) {
					    	   
					    	 
					    		   
                        	   if (RemoteJson) {
                        		   
                        		   if (rolisvalidChange==0 ) {  //rol 105
					    		    	//boolean bloked = false;
										RespuestaMsgDto respuestaPrivDto = new RespuestaMsgDto(var);
										//respuestaDto.setBlocked(bloked);
										respuestaPrivDto.setMsg("No tiene los Privilegios"); 
										return new ResponseEntity(respuestaPrivDto, HttpStatus.FORBIDDEN);
					    		    	
					    		    } else {
					    		    	
					    		    	 int hayactivo = campaignsRepository.validarexisteactivo();
	                        			   
	                        			   boolean expirada;
	                        			   
	                        			   if (hayactivo==0) {
	                        				   expirada = false;
	                        				   
	                        			   } else {
	                        				   
	                        				    expirada = campaignsRepository.consultarvigenciacampanaactiva();
	                        				   
	                        			   }
	                        			   
	                            		   
	                            		   if (expirada) {
	                                    	   
	                                    	   if (rolisvalidChange==0 ) {  //rol 105
	       					    		    	//boolean bloked = false;
	       										RespuestaMsgDto respuestaPrivDto = new RespuestaMsgDto(var);
	       										//respuestaDto.setBlocked(bloked);
	       										respuestaPrivDto.setMsg("No tiene los Privilegios"); 
	       										return new ResponseEntity(respuestaPrivDto, HttpStatus.FORBIDDEN);
	       					    		    	
	       					    		       } else {
	       					    		    	  campaignsRepository.updateAllCampaings();
	       							    		  campaignsRepository.updateOneCampaingByIdStatus(campaignid,action);
	       							    		  result = 1;
	       					    		      }
	                               		   
	                                    	   
	                                       } else {
	                                    	      campaignsRepository.updateAllCampaings();
	    							    		  campaignsRepository.updateOneCampaingByIdStatus(campaignid,action);
	    							    		  result = 1;
	                                       }                       
							    		  result = 1;
					    		    }
                        		   
					    		    	
                        	   } else {
                        		   
                        		   int hayactivo = campaignsRepository.validarexisteactivo();
                    			   
                    			   boolean expirada;
                    			   
                    			   if (hayactivo==0) {
                    				   expirada = false;
                    				   
                    			   } else {
                    				   
                    				    expirada = campaignsRepository.consultarvigenciacampanaactiva();
                    				   
                    			   }
                    			   
                        		   
                                   if (expirada) {
                                	   
                                	   if (rolisvalidChange==0 ) {  //rol 105
   					    		    	//boolean bloked = false;
   										RespuestaMsgDto respuestaPrivDto = new RespuestaMsgDto(var);
   										//respuestaDto.setBlocked(bloked);
   										respuestaPrivDto.setMsg("No tiene los Privilegios"); 
   										return new ResponseEntity(respuestaPrivDto, HttpStatus.FORBIDDEN);
   					    		    	
   					    		       } else {
   					    		    	  campaignsRepository.updateAllCampaings();
   							    		  campaignsRepository.updateOneCampaingByIdStatus(campaignid,action);
   							    		  result = 1;
   					    		      }
                           		   
                                	   
                                   } else {
                                	      campaignsRepository.updateAllCampaings();
							    		  campaignsRepository.updateOneCampaingByIdStatus(campaignid,action);
							    		  result = 1;
                                   }
                        		   
                        		    
                        	   }		  
					    		    
					    		   
					    	   
					        }
                           
                         ///cuando envian en el estatus el valor 2 "toggle", para abrir una campana si esta cerrada ó cerrarla si esta cerrada
                           if (action==2) {
					    	   
                        	   if (Campanachange.get().getStatus()==1)  {
                          		 int desactivar = 0;
                          		 
                          		     if (RemoteJson) { // pregunta si esta expirada porque debe cerrarla porque su estatus es 1 (abierta) y debe tener el rol 105
                          		    	 
                          		    	 if (rolisvalidChange==0 ) {
     					    		    	//boolean bloked = false;
     										RespuestaMsgDto respuestaPrivDto = new RespuestaMsgDto(var);
     										//respuestaDto.setBlocked(bloked);
     										respuestaPrivDto.setMsg("No tiene los Privilegios"); 
     										return new ResponseEntity(respuestaPrivDto, HttpStatus.FORBIDDEN);
     					    		    	
     					    		    } else {
     					    		    	  campaignsRepository.updateAllCampaings();
     							    		  campaignsRepository.updateOneCampaingByIdStatus(campaignid,desactivar);
     							    		 result = 0;
     					    		    }
                          			 
                          	     	 } else {
                          	     		 
                          	     		 
      					    		    	
      					    		    	  campaignsRepository.updateAllCampaings();
      							    		  campaignsRepository.updateOneCampaingByIdStatus(campaignid,desactivar);
      							    		  result = 0;
      					    		    
                          			 
                          		     }
					    		   
                        	   }
					    		   
                        	   
                        	   if (Campanachange.get().getStatus()==0)  {
                        		   int activar = 1;
                            		 
                            		   
                        		   if (RemoteJson) { 
                        			   
                        			   if (rolisvalidChange==0 ) {
    					    		    	//boolean bloked = false;
    										RespuestaMsgDto respuestaPrivDto = new RespuestaMsgDto(var);
    										//respuestaDto.setBlocked(bloked);
    										respuestaPrivDto.setMsg("No tiene los Privilegios"); 
    										return new ResponseEntity(respuestaPrivDto, HttpStatus.FORBIDDEN);
    					    		    	
    					    		    } else {
    					    		    	  campaignsRepository.updateAllCampaings();
    							    		  campaignsRepository.updateOneCampaingByIdStatus(campaignid,activar);
    							    		 result = 1;
    					    		    }
                        			   
                        		   } else
                        		   {
                        			   
                        			   int hayactivo = campaignsRepository.validarexisteactivo();
                        			   
                        			   boolean expirada;
                        			   
                        			   if (hayactivo==0) {
                        				   expirada = false;
                        				   
                        			   } else {
                        				   
                        				    expirada = campaignsRepository.consultarvigenciacampanaactiva();
                        				   
                        			   }
                        			   
                            		   
                            		   if (expirada) {
                                    	   
                                    	   if (rolisvalidChange==0 ) {  //rol 105
       					    		    	//boolean bloked = false;
       										RespuestaMsgDto respuestaPrivDto = new RespuestaMsgDto(var);
       										//respuestaDto.setBlocked(bloked);
       										respuestaPrivDto.setMsg("No tiene los Privilegios"); 
       										return new ResponseEntity(respuestaPrivDto, HttpStatus.FORBIDDEN);
       					    		    	
       					    		       } else {
       					    		    	  campaignsRepository.updateAllCampaings();
       							    		  campaignsRepository.updateOneCampaingByIdStatus(campaignid,activar);
       							    		  result = 1;
       					    		      }
                               		   
                                    	   
                                       } else {
                                    	      campaignsRepository.updateAllCampaings();
    							    		  campaignsRepository.updateOneCampaingByIdStatus(campaignid,activar);
    							    		  result = 1;
                                       }                            		                           			
                        		   }
        					    		    	        					    		    	         					    		                               			                             		       					    		   
                          	   }
					    	   
					        }
					       		
                       String resultText = "";    
					   if (result==1) {
						   resultText = "Abierta";
					   } else {
						   resultText = "Cerrada";
					   }
						  												 						  
						   String module = "Campañas";
						     String Descmodule = "Se Modificó el Estatus de la Campaña: " + Campanachange.get().getName() + " con Id:" + campaignid + " nuevo estatus:" + resultText;
						    
					         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); 
						
						// Borro el rol boolean existeUsers = ;
						int valor = 0;
						try {
					
						respuestaValueDto= new RespuestaValueDto(result);												
						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);
				}
			} else {
				respuesta.setMsg("Sesión expirada o inválida");
				estatus=HttpStatus.UNAUTHORIZED;
				return new ResponseEntity(respuesta, estatus);
				
			}

			
		}
		
	}	

	
	@PostMapping("/campaigns/{campaignid}")
	public ResponseEntity<ParamsResponseDto> campaingUpdate(HttpServletRequest request,@RequestBody CampaingRequestNewDto datosCampana,@PathVariable("campaignid") final Integer campaignid) 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 filasInsertadas=0;
		     int filasBorradas = 0;
			 int idparametro = campaignid;
			 int Cerrada = 0;
			 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();
			   int rolisvalidChange = 0;
			   Connection conexion2 = DriverManager.getConnection(conexion,userbd, passbd);
				//(PreparedStatement sentenciaPreparada = conexion2.prepareStatement(sql))
				Statement sentenciaPreparada = null;
				
				Statement sentenciaPreparadaDel= null;
				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);
	  						   
	  					    }
	  					    
	  					    
	  					   
						 //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, 102);
							   rolisvalidChange = auditRepository.getCantbyRolAndPrivi(idrol, 105);
							   //rolisvalid = 3; se usa para probar cuando no tenemos privilegios
							   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, 101);
						   rolisvalidChange = auditRepository.getCantbyRolAndPrivi(idrol, 105);
						   //rolisvalid = 3; se usa para probar cuando no tenemos privilegios
						   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 SalidaName= usersService.verificarCaracteresValidosConRegex(datosCampana.getName());
						    String SalidaDesc = usersService.verificarCaracteresValidosConRegex(datosCampana.getDsc());
						   // String SalidaCod = usersService.verificarCaracteresValidosConRegex(datosUnidad.getRef());
						    
						    if (SalidaName=="NOOK" || SalidaDesc=="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 (idparametro==0) {							   	               
	                       
	                       if  (datosCampana.getName()!= "" ) {	
							   
							   //boolean existeName = unitsRepository.existsByName(datosUnidad.getName());
	                    	   String Query2 = "SELECT name FROM main.campaigns WHERE LOWER(name) = " + "'" + datosCampana.getName().toLowerCase() + "'";
	                    	   
							   Long cuantosregistroname = (long) jdbcTemplate.queryForList(Query2).size();
							   
							    if (cuantosregistroname>0) {
							    	String var = "";
							    	RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
									//respuestaDto.setBlocked(bloked);
									respuestaDto.setMsg("Registro Duplicado");
									//Error 40
									return new ResponseEntity(respuestaDto, HttpStatus.CONFLICT);
							    }
							    
							    boolean validacampstatus = campaignsRepository.existsByStatus(1);
							    
							   
						   }
						                     						   
						
						
							   
						   } else {
							   //boolean existeUnit =  unitsRepository.existsById(idparametro);
							   boolean existeCampana = campaignsRepository.existsById(idparametro);
							   if (!existeCampana) {
						    	    String var = "";
									boolean bloked = false;
									RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
									//respuestaDto.setBlocked(bloked);
									respuestaDto.setMsg("Registro no encontrado"); 
									return new ResponseEntity(respuestaDto, HttpStatus.NOT_FOUND);
						    	  
						      } //else						    	  						    	  						
							   
						   }
							   
						       
				
					   
					 } 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 {
				
		
				Campaigns tipoCampa2=null;
				Campaigns tipoCampa=null;
				Campaigns tipoCampaNew2=null;
				Optional<Campaigns> nuevoinsertado = null;
			
				Campaignunits tipoUnitCampaign = new Campaignunits();
				
				
				if (idparametro==0) {
					
					////VALIDACION DE LA FECHA QUE ENTRA POR PARAMETRO DEBE SER MAYOR A LA FECHA ACTUAL DEL CALENDARIO
	                Date fechaBDto = datosCampana.getDateto();
					
					SimpleDateFormat salida = new SimpleDateFormat("yyyy-MM-dd"); //2024-12-23 23:00
		            String fechaTextoNuevo = salida.format(fechaBDto);
		            LocalDate fechaActual = LocalDate.now();
		            DateTimeFormatter formatter2 = DateTimeFormatter.ISO_DATE;
		            LocalDate fechaNueva = LocalDate.parse(fechaTextoNuevo, formatter2);
		            
		            if (fechaActual.isBefore(fechaNueva)) {
		            	System.out.println("La fecha actual (" + fechaActual + ") es anterior a " + fechaNueva + ".");
		            	
		            } else if (fechaActual.isAfter(fechaNueva)) {
		            	
		            	

		                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 if (fechaActual.isEqual(fechaNueva)) {
		            	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);
		            }
				 ////////////////////TERMINA LA VALIDACION DE LA FECHA	
					//Users tipoUsersNew = new Users();
					//La campana originalmente siempre se crean en estatus inactivo
					Campaigns tipoCampaingNew = new Campaigns();
					int statusoriginal = 0;
					tipoCampaingNew.setStatus(statusoriginal);					
					tipoCampaingNew.setName(datosCampana.getName());
					tipoCampaingNew.setDsc(datosCampana.getDsc());
					tipoCampaingNew.setModifiedat(fechaDate);
					tipoCampaingNew.setCreatedat(fechaDate); 
					  
					tipoCampaingNew.setDatefrom(datosCampana.getDatefrom());
					tipoCampaingNew.setDateto(datosCampana.getDateto());
							        
					tipoCampaNew2=campaignsService.addIdCampaigns(tipoCampaingNew);
					tipoCampa2 = tipoCampaNew2;
					
					
 					int maxiInsertado = campaignsRepository.getMaxRecordCampaign();
 					//idmensaje = maxiInsertado;
									
					    //////////////////////////INSERCION BLOQUE DE AUDITORIA///////////////////
					     String module = "Campañas";
					     //String Descmodule = "Actualización de parametro del Sistema con id: " + parmid  ;
					     String Descmodule = "Se agregó la Campaña con Nombre: " + datosCampana.getName() + " y Id:" + maxiInsertado;
					    
				         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); 
		         

				} else {
					
					
					 // int result = 0;
					  String SentenciaBase = "SELECT  CASE WHEN u.dateto < now()"									
								+ "	then TRUE ELSE FALSE END AS expiro FROM main.campaigns u where u.id = " + idparametro ;
					  
					   Query queryTypes = entityManager.createNativeQuery(SentenciaBase);
				       boolean listatipos= (boolean) queryTypes.getSingleResult();
				       boolean RemoteJson = listatipos;				       				   								
					  		       				       
					     tipoCampa = campaignsService.getCampaignsByid(idparametro);
					 
				    	//tipoCampa.setStatus(datosCampana.getStatus());
						//tipoUsers.setUsr(datosUsuario.getUsr());

						String campa1 = tipoCampa.getName();
						 Cerrada = tipoCampa.getStatus();
						String campa2 = datosCampana.getName();
						
						if (campa1.equals(campa2)){
							String ValidaCampa = "La campana es la misma";
					    	
						} else {
							
						 String QueryTotal = "SELECT name FROM main.campaigns WHERE LOWER(name) = " + "'" + datosCampana.getName().toString().toLowerCase() + "'" ;
						 Long validacampa2 = (long) jdbcTemplate.queryForList(QueryTotal).size();
						 
		                if (validacampa2>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 {
							tipoCampa.setName(datosCampana.getName());
						}
					}	
					
						
						
					
					Date fechaBDto = tipoCampa.getDateto();
					Date fechaBfrom = tipoCampa.getDatefrom();
					SimpleDateFormat salida = new SimpleDateFormat("yyyy-MM-dd"); //2024-12-23 23:00
		            String respBDto = salida.format(fechaBDto);
		            String respBDfrom = salida.format(fechaBfrom);
		               
					Date fechaNuevato = datosCampana.getDateto();
					Date fechaNuevafrom = datosCampana.getDatefrom();
					   String respNuevato = salida.format(fechaNuevato);
					   String respNuevafrom = salida.format(fechaNuevafrom);
					
				   if (respBDto.equals(respNuevato)){
							String ValidaCampa = "La campana es la misma";
				
						
						    System.out.println(campa2);
					} else {
						
						int tieneCampanaSuperior = 0;
						
						 tieneCampanaSuperior = campaignsRepository.countCampanassuperiores(idparametro);
						
						if (tieneCampanaSuperior>0) {
							 
							  String var = "";
								boolean bloked = false;
								RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
								//respuestaDto.setBlocked(bloked);
								respuestaDto.setMsg("Llamada al servicio malformado-No puede actualizar la fecha desde y hasta de la Campana, existe una mas reciente");
								//Error 400
								return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
							
						} 
						
						////VALIDACION DE LA FECHA QUE ENTRA POR PARAMETRO DEBE SER MAYOR A LA FECHA ACTUAL DEL CALENDARIO
		                Date fechaBDto2 = datosCampana.getDateto();
						
						SimpleDateFormat salida2 = new SimpleDateFormat("yyyy-MM-dd"); //2024-12-23 23:00
			            String fechaTextoNuevo = salida.format(fechaBDto2);
			            LocalDate fechaActual = LocalDate.now();
			            DateTimeFormatter formatter2 = DateTimeFormatter.ISO_DATE;
			            LocalDate fechaNueva = LocalDate.parse(fechaTextoNuevo, formatter2);
			            
			            if (fechaActual.isBefore(fechaNueva)) {
			            	System.out.println("La fecha actual (" + fechaActual + ") es anterior a " + fechaNueva + ".");
			            	
			            } else if (fechaActual.isAfter(fechaNueva)) {
			            	
			            	

			                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 if (fechaActual.isEqual(fechaNueva)) {
			            	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);
			            }
						
						//tipoCampa.setStatus(datosCampana.getStatus());
						     if (RemoteJson) { // si esta expirada
					             if (rolisvalidChange==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 {
					            	  
					            	   // tipoCampa.setDatefrom(datosCampana.getDatefrom());
										tipoCampa.setDateto(datosCampana.getDateto());
					            	 
					             }
					           } else {
					        	   tipoCampa.setDateto(datosCampana.getDateto());
					           }
					}
				   
				   if (respBDfrom.equals(respNuevafrom)){
						String ValidaCampa = "La campana es la misma";
			
					
					    System.out.println(campa2);
			     	} else {		
			     		
			     		int tieneCampanaSuperior = 0;
						
						 tieneCampanaSuperior = campaignsRepository.countCampanassuperiores(idparametro);
						
						if (tieneCampanaSuperior>0) {
							 
							  String var = "";
								boolean bloked = false;
								RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
								//respuestaDto.setBlocked(bloked);
								respuestaDto.setMsg("Llamada al servicio malformado-No puede actualizar la fecha desde y hasta de la Campana, existe una mas reciente");
								//Error 400
								return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
							
						} 
					
					     if (RemoteJson) {
				             if (rolisvalidChange==0) {
				            	 
				            	    String var = "";
							    	boolean bloked = false;
								    RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
								    respuestaDto.setMsg("No tiene los Privilegios"); 
								    return new ResponseEntity(respuestaDto, HttpStatus.FORBIDDEN);
				            	
				            	 }
				             else {
				            	  
									tipoCampa.setDatefrom(datosCampana.getDatefrom());
				            	 
				             }
				           } else {
				        	          tipoCampa.setDatefrom(datosCampana.getDatefrom());
				           }
				    }
						
					    tipoCampa.setDsc(datosCampana.getDsc());					
					    tipoCampa.setModifiedat(fechaDate);			
										
					    tipoCampa2=campaignsService.addIdCampaigns(tipoCampa);
			            
			      
				      }
			int idmensaje=0;																	           
			if (idparametro!=0) {
	              	            		            		            		            
	                idmensaje = campaignid;
	                //Connection conexion2 = DriverManager.getConnection(conexion,userbd, passbd);
	    			//(PreparedStatement sentenciaPreparada = conexion2.prepareStatement(sql))
	    			
	    			sentenciaPreparada = conexion2.createStatement();
	    			sentenciaPreparadaDel = conexion2.createStatement();

	         
	    			int cuantascampa = datosCampana.getUnits().size();
	    			
	    		    	if (cuantascampa > 0 ) {
	    		    		try { 	
	    		    			
	    				  String unidades = arrayAParentesis(datosCampana.getUnits());		
	    				  
	    				  
	   		              String sql = "INSERT INTO main.campaignunits (unitid,campaingid) SELECT id," + campaignid + " FROM main.units  WHERE id IN " + unidades
	   		            		  + " AND id not in (SELECT unitid FROM main.campaignunits WHERE campaingid = " + campaignid + ")";
	   		              
	    				 /* String sql = " INSERT INTO main.campaignunits (unitid,campaingid) SELECT DISTINCT u.id, " + campaignid + " FROM main.units u  "
	    						  + "  INNER JOIN main.userunits uu ON u.id = uu.unitid where u.id IN  " + unidades  
	   		                      + "   AND uu.userid = " + encontreSessionUsuario.get().getId() + " and uu.unitid in (Select unitid FROM main.Userunits e where e.userid = 13 order by unitid asc "
	   		                      + "  ) AND u.id not in (SELECT unitid FROM main.campaignunits WHERE "
	   		    	             + "  campaingid =  " + campaignid + ")";*/
	   		    	
	   		           
	    	            filasInsertadas = sentenciaPreparada.executeUpdate(sql);
	    	          //filasInsertadas = sentenciaPreparada.execute(sql);
	    	        	///// campaignunitsRepository.borrarCampaingUnits(tipoCampa.getId());

		    		    //////////////////////////INSERCION BLOQUE DE AUDITORIA///////////////////
					     String module = "Campañas"; 
					     //String Descmodule = "Actualización de parametro del Sistema con id: " + parmid  ;
					     String Descmodule = "Se actualizó la Campaña con Nombre: " + datosCampana.getName() + " y 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///////////////////
	    	        
	    	           /* String sqlDel = " DELETE FROM main.campaignunits e WHERE e.campaingid =" + campaignid + " and unitid NOT IN" + unidades;
	    	            //que no pueda elimimar unidades a las cuales no esta asociada el usuario	    	            
	    	            filasBorradas = sentenciaPreparadaDel.executeUpdate(sqlDel);*/
				 		  if (Cerrada==1) {
	    					   
				 			 String sqlDel = " DELETE FROM main.campaignunits e WHERE e.campaingid = " + campaignid + "  and e.id not in (select campaignunitid from main.evalprocesses) and "
				 			 		+ "	e.id not in (select campaingunitid from main.evalunits) AND "
				 			 		+ "	unitid  IN (SELECT DISTINCT u.id FROM main.units u "
				 			 		+ "	INNER JOIN main.userunits uu ON u.id = uu.unitid WHERE u.id NOT IN " + unidades + " " 
				 			 		+ "and uu.userid = " + encontreSessionUsuario.get().getId() + " ) ";
				 			 		
				 			 
				 			filasBorradas = sentenciaPreparadaDel.executeUpdate(sqlDel);
	    					   
	    				   } //else
	    				  // {
	    					   
	    				   //}
	    				   
	    	            
		    	           // filasBorradas =  sentenciaPreparada.executeUpdate(sqlDel);
	    		    		//}   catch (DataIntegrityViolationException ex) {
	    		    		}   catch (Exception ex) {
	    			    	    Throwable rootCause = ex.getCause();
	    			    	    String mensajeError = "Error al guardar.";
	    			    	    HttpStatus estatusError = HttpStatus.CONFLICT;

	    			    	    if (rootCause instanceof SQLException) {
	    			    	        SQLException sqlEx = (SQLException) rootCause;
	    			    	        if (sqlEx.getSQLState() != null && sqlEx.getSQLState().equals("23505")) {
	    			    	            mensajeError = "Registro Duplicado.";
	    			    	        } else {
	    			    	           // mensajeError = "Error de base de datos: " + sqlEx.getMessage();
	    			    	            mensajeError = "no se pudo realizar la operación, existen unidades con entradas de evaluaciones: ";
	    			    	            estatusError = HttpStatus.CONFLICT; // O el estatus que consideres apropiado
	    			    	            ex.printStackTrace(); // Loguea la excepción para depuración
	    			    	        }
	    			    	    } else {
	    			    	    	if (filasInsertadas>0) {
	    			    	    		mensajeError = "Error eliminando unidades, fueron insertadas las nuevas unidades - ";
	    			    	    	} else {
	    			    	    		mensajeError = "Registro Duplicado - Error eliminando unidades";
	    			    	    	}
	    			    	     //   mensajeError = "Registro Duplicado: " + ex.getMessage();
	    			    	    	// mensajeError = "Registro Duplicado - Error eliminando unidades";
	    			    	        estatusError = HttpStatus.CONFLICT; // O el estatus que consideres apropiado
	    			    	        ex.printStackTrace(); // Loguea la excepción para depuración
	    			    	    }

	    			    		respuesta= new RespuestaMsgDto(mensajeError);
	    						estatus=estatusError;
	    						return new ResponseEntity(respuesta, estatus);

	    			       }

	    			}
	    			
	            			
	                
	            	             
			} else {
				
				nuevoinsertado = campaignsRepository.findByName(datosCampana.getName());
				int idInsertado =  nuevoinsertado.get().getId();
				idmensaje = idInsertado;
				//Connection conexion = null;
				
				sentenciaPreparada = conexion2.createStatement();
		        
		      
		        	//for (int i = 0; i < datosUsuario.getUnits().size();  i++) {
				//INSERT INTO userunits (unitid, userid)
				//SELECT id, 1 FROM main.units WHERE id IN (1,2,3,4,5)
				int cuantocampainc = datosCampana.getUnits().size();
				
				if (cuantocampainc > 0 ) {
				   String unidades = arrayAParentesis(datosCampana.getUnits());			
		           String sql = "INSERT INTO main.campaignunits (unitid,campaingid) SELECT id," + idInsertado + " FROM main.units  WHERE id IN " + unidades;
		           sentenciaPreparada.execute(sql);								      
		                   
			  	}   
			  }
			
	          
	        
				if (tipoCampa2!=null) { //Comprobar si es distinto de null
					
					String Resp = campaignid.toString();
					respuestaValueDto= new RespuestaValueDto(idmensaje);
					//int parmid = 2;
					//respuestaValueDto= new RespuestaValueDto(userid);
					estatus=HttpStatus.OK;
					return new ResponseEntity(respuestaValueDto, estatus);
					
				}else {
					respuesta= new RespuestaMsgDto("Fallo la actualizacion");
					estatus=HttpStatus.BAD_REQUEST;
					return new ResponseEntity(respuesta, 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();
				}
				try {
				    if (sentenciaPreparadaDel != null) {
				    	sentenciaPreparadaDel.close();
				    } 
				    
				    if (sentenciaPreparada != null) {
				    	sentenciaPreparada.close();
				    } //sentenciaPreparada2
				   
				    if (conexion2 != null) {
			            conexion2.close();
			        }
				} catch (SQLException e) {
				    // Maneja la excepción aquí, por ejemplo, imprimiendo el stack trace
				    e.printStackTrace();
				}
			 }
			
			return new ResponseEntity(respuesta, estatus);
		
		}
		
		public String arrayAParentesis(List<Integer> lista) {
			
		    if (lista == null || lista.isEmpty()) {
		        return "()";
		    }
		    StringBuilder sb = new StringBuilder("(");
		    for (int i = 0; i < lista.size(); i++) {
		        sb.append(lista.get(i));
		        if (i < lista.size() - 1) {
		            sb.append(", ");
		        }
		    }
		    sb.append(")");
		    return sb.toString();
		}
	
	//@GetMapping("/menus)
	//public ResponseEntity<MenuResponseDto> menu(@PathVariable final String sessionid) throws ParseException {
	@PostMapping("/campaigns")
	public ResponseEntity<?> campaigns(HttpServletRequest request,@RequestBody UsersListDto tiposfiltros) throws ParseException {
		RespuestaDto respuesta = new RespuestaDto("", false);
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		CampainsResponseDto campainsResponseDto = new CampainsResponseDto();
		CampaignRecordFormat2Dto campains2ResponseDto = new CampaignRecordFormat2Dto();
	//	ParamsDto detalleParams;
		CampaingDto detalleCompaing;
		CampaignFormat2Dto detalleCompaing2;
		  //detalleCompaing2 = new ChannelsDtoStatus();
		StatusDto detalleStatus;
		PrivilegeAllCampaignDto detallePrivilege;
	     
	     Long cuantosregistro = (long) 0;	     
	     List<PrivilegesAllDto> listasPrivelege = 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 searchStringfrom = tiposfiltros.getFilters().getDatefrom();
	        String searchStringto = tiposfiltros.getFilters().getDateto();
	       
	        String sinfecha="NO";
	        String sinfechaFrom="NO";
	        String sinfechaTo="NO";
	        int formatList = 0;
	        
	   	  String searchIn = "";
	   	  String contentIn = "";
	     // String searchModule = "";
		  int searchStatus = 0;
		 
		  String fechaComoCadena; 
		  Optional<Users> encontreSessionUsuario;
		  int orderIn = 0;
		  int offsetIn = 0;
		  int idrol;
		  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);
				   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)
					    formatList = tiposfiltros.getFormat();
					   Roles roles = encontreSessionUsuario.get().getRolid();
					    idrol = roles.getId();
					   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 100);
					   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();
					      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");
						//Error 400
						return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);
				 }
			}
			
			
		
		try {
			
			String SentenciaBase;
 
			//ChannelsDtoStatus
			//se formam 2 querys y se va a ejecutar cualqueira de los 2 dependiendo del valor format
			if (formatList==2) {
				 SentenciaBase = "SELECT  new com.dacrt.SBIABackend.dto.ChannelsDtoStatus "
						+ " (u.id,  u.name, u.status, "
						+ "	 CASE "
						+ "	WHEN u.status = 1 THEN 'Abierta' "
						+ "	ELSE 'Cerrada' "
						+ "	END AS estatus ) "
						+ "	FROM "
						+ "	Campaigns u ";
					//	+ "					 order by status desc ";
						
					 
				
			} else {
				 SentenciaBase = "SELECT new com.dacrt.SBIABackend.dto.CampaingDtoStatus "
						+ "    (u.id, "
						+ "    u.name, "
						+ "    TO_CHAR(u.datefrom, 'yyyy-mm-dd'), "
						+ "    TO_CHAR(u.dateto, 'yyyy-mm-dd'), "
						+ "    u.status, "
						+ "    CASE "
						+ "        WHEN u.status = 1 THEN 'Abierta' "
						+ "        ELSE 'Cerrada' "
						+ "    END AS estatus, "
						+ "    CASE "
						+ "        WHEN u.dateto < now() AND u.status = 0 THEN 'black' "
						+ "        WHEN u.dateto < now() AND u.status = 1 THEN 'red' "
						+ "        WHEN u.dateto > now() AND EXTRACT(DAY FROM (u.dateto - now())) > (SELECT CAST(p.value AS integer) FROM Params p WHERE p.paramname = 'CAMPAIGN_EXP_DAYS') THEN 'green' "
						+ "        WHEN u.dateto >= now() AND EXTRACT(DAY FROM (u.dateto - now())) <= (SELECT CAST(p.value AS integer) FROM Params p WHERE p.paramname = 'CAMPAIGN_EXP_DAYS') THEN 'yelow' "
						+ "        ELSE 'black2' "
						+ "    END AS color, "
						+ "    COUNT(c.campaingid) AS units) "
						+ " FROM "
						+ " Campaigns u "
						+ " LEFT JOIN "
						+ " Campaignunits c ON u.id = c.campaingid";
					 
		
				
			}
	
				
					 							       				
			String QueryTotal = "";
			String name = "u.name";
			String status = "u.status";				
			//String lowername = "LOWER(u.name)";
			String lowername = "main.sinacentos(LOWER(u.name))";
			String LowerSearch = searchIn.toLowerCase();
			
			//String QueryTotal = SentenciaBase + GroupBy;
			// TypedQuery<CampaingDtoStatus> channelsCount= entityManager.createQuery(QueryTotal, CampaingDtoStatus.class);
			 //cuantosregistro = (long) channelsCount.getResultList().size();
			
			 switch (searchStatus) { 
			    case 0:  // Busca por cualquier estatus
			    	QueryTotal = SentenciaBase + " WHERE 1 = 1 ";
			     break;
			    case 1:  // Busca por estatus activo
			    	
			    	QueryTotal = SentenciaBase  + " WHERE " + status + " = " + searchStatus;
			     break;
			    case 2:  // Busca por estatus Inactivo
			    	int est = 0 ;
			    	//QueryTotal = QueryTotal  + " AND " + status + " = " + searchStatus;
			    	QueryTotal = SentenciaBase  + " WHERE " + status + " = " + est;
			     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 (searchStringfrom=="") {
        		 
        		 QueryTotal = QueryTotal;
        	 } else {
        		 QueryTotal = QueryTotal  + " AND " + "u.datefrom > " + "'" + searchStringfrom + "'" ;
        		 
        	 }
        		 
             if (searchStringto=="") {
            	 QueryTotal = QueryTotal;
        	 } else {
        		 QueryTotal = QueryTotal  + " AND " + "u.dateto < " + "'" + searchStringto + "'" ;
        	 }
		
			 switch (searchIn) { 
			    case "":  // viene sin busqueda por el like
			    	QueryTotal = QueryTotal;
			    	//QueryTotal = SentenciaBase  + " WHERE " + lowername + " LIKE " + "'%" + "" + "%'";
			    	//QueryTotal = SentenciaBase  + " WHERE TRUE = TRUE";
			     break;
			  
			    default:	// viene con el parametro para buscar por el like
			    	//String lowername = "main.sinacentos(LOWER(u.name))";
			    	QueryTotal = QueryTotal + " AND " + "(" + lowername + " LIKE " + "'%" + LowerSearch + "%'" + " OR " + " main.sinacentos(LOWER(u.dsc)) "  + " LIKE " + "'%" + LowerSearch + "%'" + ")";
			    	
	         }
			 
			 if (formatList!=2) {  		      		      			 				 		          	         	 			 
			 //String GroupBy = " GROUP BY u.id,u.name,,u.status";
			 String GroupBy = " GROUP BY u.id,u.name,u.datefrom,u.dateto,u.status";
			 QueryTotal = QueryTotal + GroupBy;
			 
			 TypedQuery<CampaingDtoStatus> campaingCount= entityManager.createQuery(QueryTotal, CampaingDtoStatus.class);
			 cuantosregistro = (long) campaingCount.getResultList().size();
			 
			 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("Llamada al servicio malformado");
					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.datefrom " + ordena;
			     break;
			     case 2://ordena por status ascendente
			    	
			    	QueryTotal = QueryTotal + " ORDER BY " + " u.dateto " + ordena;
			     break;
                 case 3://ordena por status ascendente
			    	
			    	QueryTotal = QueryTotal + " ORDER BY " + " u.name " + ordena;
			     break;
                 case 4://ordena por status ascendente
 	
 	             QueryTotal = QueryTotal + " ORDER BY " + " units " + ordena;
                 break;
                 case 5://ordena por status ascendente
                	 	
     	             QueryTotal = QueryTotal + " ORDER BY " + " u.status " + ordena;
                     break;
                 case 99:   //ordena por status ascendente
                 	
	                    QueryTotal = QueryTotal + " ORDER BY " + "u.id" + ordena;
                 break;
                 default:
                 	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);
			 
			    
			   }
			 
			 TypedQuery<CampaingDtoStatus> campaings= entityManager.createQuery(QueryTotal, CampaingDtoStatus.class);
		     campaings.setFirstResult(offsetIn);
		     campaings.setMaxResults(numofrecordsIn);
		     List<CampaingDtoStatus> listacompleta = campaings.getResultList();
		      
			
			 
			 //Se mapea la entidad se le pasa el query y lo bota como un tipo de objeto ParamDto-Buscar en los DTO 
			     
			    
			   
		    	   List<CampaingDto> listasSuppliers = new ArrayList<>();
		    	   detalleCompaing = new CampaingDto();
		    	   //Se de be hacer el ciclo para poder llenar el objeto de la descripcion del estatus
		    	   for(CampaingDtoStatus suppliers : listacompleta) {
		    		   detalleCompaing = new CampaingDto();
		    		 
		    		   detalleStatus = new StatusDto();
		    		   detalleCompaing.setId(suppliers.getId());
		    		   detalleCompaing.setName(suppliers.getName());
		    		   
		    		  // SimpleDateFormat salida = new SimpleDateFormat("dd-MM-yyyy"); //2024-12-23 23:00
		             //  String resp = salida.format(suppliers.getDatefrom());
		              // String resp2 = salida.format(suppliers.getDateto());
		               
		    		   detalleCompaing.setDatefrom(suppliers.getDatefrom());
		    		   detalleCompaing.setDateto(suppliers.getDateto());
		    		   detalleCompaing.setColor(suppliers.getColor());
		    		   detalleCompaing.setUnits(suppliers.getUnits());
		    		   
			    	   detalleStatus.setId(suppliers.getStatus());
			    	   detalleStatus.setName(suppliers.getEstatus());
				     
			    	   detalleStatus.setId(suppliers.getStatus());
			    	   detalleStatus.setName(suppliers.getEstatus());
				     
			    	   detalleCompaing.setStatus(detalleStatus);
			    	  // detalleSuppliers.setStatus(detalleStatus);
			    	   
			    	   listasSuppliers.add(detalleCompaing);
		    	   }
		    	
		    	   
      	    	 	detallePrivilege = new PrivilegeAllCampaignDto();
      	    	 // Roles roles = encontreSessionUsuario.get().getRolid();
				  // int idrol = roles.getId();
				  // int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 100);
				   boolean tieneView = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,100);
				   boolean tieneUpdate = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,101);
				   boolean tieneAdd = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,102);
				   boolean tieneDelete = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,103);				   
				//   boolean tieneUpdateStatus = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,104);
				   boolean tieneUpdateExpired= rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,105);
				   //existsByRolidAndPrivilegeid
				   
      	    	 	detallePrivilege.setView(tieneView);
		    	  	detallePrivilege.setUpdate(tieneUpdate);		    	  
		    	  	detallePrivilege.setAdd(tieneAdd);
		    	  	detallePrivilege.setDelete(tieneDelete);
		    	  //	detallePrivilege.setUpdateStatus(tieneUpdateStatus);
		    	  	detallePrivilege.setUpdateStatusExpired(tieneUpdateExpired);
		    	
		    	  	campainsResponseDto.setNumofrecords(cuantosregistro);
		           //paramsResponseDto.setValidthru(ValidThrufechaSalida);
		    	  	campainsResponseDto.setSessionvalidthru(fechaComoCadena);		           
		    	  	campainsResponseDto.setRecords(listasSuppliers);
		    	  	campainsResponseDto.setPrivileges(detallePrivilege);		      		   			
		  						           
                return ResponseEntity.ok(campainsResponseDto);
                
          } else {
        	  
        	  String Orderby =  " ORDER BY status desc,u.createdat desc ";
			  QueryTotal = QueryTotal + Orderby;
        	  TypedQuery<ChannelsDtoStatus> campaings= entityManager.createQuery(QueryTotal, ChannelsDtoStatus.class);
				  List<ChannelsDtoStatus> listacompleta = campaings.getResultList();
				  List<CampaignFormat2Dto> listasSuppliers2 = new ArrayList<>();
				  int defaultValue = -1;
				  
				
				  
				  for(ChannelsDtoStatus suppliers : listacompleta) {
		    		   detalleCompaing2 = new CampaignFormat2Dto();
		    		 
		    		   detalleStatus = new StatusDto();
		    		   detalleCompaing2.setId(suppliers.getId());
		    		   detalleCompaing2.setName(suppliers.getName());
		    		   
		    		   if  (defaultValue==-1) {
		    		         defaultValue = suppliers.getId();
		    		    }
				    		   
		    		   
			    	  // detalleStatus.setId(suppliers.getStatus());
			    	//   detalleStatus.setName(suppliers.getEstatus());
				     
			    	   detalleStatus.setId(suppliers.getStatus());
			    	   detalleStatus.setName(suppliers.getEstatus());
				     
			    	   detalleCompaing2.setStatus(detalleStatus);
			    	  // detalleSuppliers.setStatus(detalleStatus);
			    	   
			    	   listasSuppliers2.add(detalleCompaing2);
		    	   }
				  
				        // campains2ResponseDto.setNumofrecords(cuantosregistro);
			           //paramsResponseDto.setValidthru(ValidThrufechaSalida);
				         campains2ResponseDto.setDefault(defaultValue);
				         campains2ResponseDto.setSessionvalidthru(fechaComoCadena);		           
				         campains2ResponseDto.setRecords(listasSuppliers2);
			    	 // 	campainsResponseDto.setPrivileges(detallePrivilege);		      		   			
			  						           
	                return ResponseEntity.ok(campains2ResponseDto);
				  
				  
			    // campaings.setFirstResult(offsetIn);
			   //  campaings.setMaxResults(numofrecordsIn);
			      
				 
			 }   
		     																													
       
		}catch (Exception e) {
            // Manejo de excepciones

			
			System.out.print(e);
			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("/campaigns/{campaignid}")
	public ResponseEntity<?> getOneUsers(HttpServletRequest request, @PathVariable("campaignid") final Integer campaignid)
			throws ParseException {
		RespuestaMsgDto respuesta = new RespuestaMsgDto("");
		// List<UsersRolesPriWorStaDto> listaUserRolWorStaSup = new ArrayList<>();
		 List<UsersRolesPriWorStaDto> listasUsersRolesPriWorStaDto = new ArrayList<>();
		 UsersRolesPriWorStaDto detalleUsers;
		 StatusDto detalleStatus;
		 WorkersUsersDto detalleworker;
		 SuppliersUsersDto detallesupplier;
		 RolesUserDto detalleroles;
		 CampainDetailDto detalleUnits;
		 UsersUnitDto detalleCampainUnit;
		 
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		try {

			RespuestaValueDto respuestaValueDto;
			String var = "";
			boolean bloked = false;
			RespuestaDto respuestaDto = new RespuestaDto(var, bloked);

			RolesResponseDto rolesResponseDto = new RolesResponseDto();
			RoleDto detalleRoles;
			PrivilegesAllDto detallePrivilege;
			Long cuantosregistro = (long) 0;
			List<RoleDto> listasRoles = new ArrayList<>();
			List<PrivilegesAllDto> listasPrivelege = 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();
            boolean tieneCampana;
			

			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);

			if (sessionid == null) {
				respuesta.setMsg("Llamada al servicio malformado");
				return new ResponseEntity(respuesta, HttpStatus.BAD_REQUEST);
			} else {
				sessionid = sessionid.substring(7);
				Optional<Users> encontreSessionUsuario = usersRepository.getBySessionid(sessionid);
				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 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);
  						   
  					    }
  					   
					// Obtiene la información de un usuario en particular. (priv 630)
					  Roles roles = encontreSessionUsuario.get().getRolid();
					   int idrol = roles.getId();
					   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 100);
					   
					   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);
							
					   }
					   
					boolean existeCampana = campaignsRepository.existsById(campaignid);
					if (!existeCampana) {
						respuesta.setMsg("Registro no encontrado");
						return new ResponseEntity(respuesta, HttpStatus.NOT_FOUND);
					} else {
						int tieneCampanaSuperior = 0;
						
						 tieneCampanaSuperior = campaignsRepository.countCampanassuperiores(campaignid);
						
						if (tieneCampanaSuperior>0) {
							 
							tieneCampana = false;
							
						} else {
							tieneCampana = true;
							
						}
						//int rolisvalid = 0;
						//List<Userunits> listaUserUnits = new ArrayList<>();
						List<Campaignunits> listaCampaingUnit = new ArrayList<>();
						
						//Optional<Users> UsersElegido = usersRepository.findById(campaignid);
						Optional<Campaigns> campainsElegida = campaignsRepository.findById(campaignid);
						 
				    	   
						 //listaUserUnits=userunitsRepository.findByUserid(campaignid);
						listaCampaingUnit=campaignunitsRepository.findByCampaingid(campaignid);
						
						 List<UnitsUsersDto> listasUnidadesDto = new ArrayList<>();
						 List<UsersUnitDto> ListunitsAsociadas= new ArrayList<>();
						 
						 List<StatusDto> listasStatus = new ArrayList<>();	
						 detalleStatus = new StatusDto();
						 						 
						for(Campaignunits campaings : listaCampaingUnit) {
							detalleCampainUnit= new UsersUnitDto();
							int campid = campaings.getUnitid();
							
							
							Optional<Units> unidadselecc = unitsRepository.findById(campid);
							detalleCampainUnit.setId(unidadselecc.get().getId());
							detalleCampainUnit.setName(unidadselecc.get().getDsc());
							ListunitsAsociadas.add(detalleCampainUnit);
							
						}						
					
					      	detalleUnits = new CampainDetailDto();
					      	detalleUnits.setId(campainsElegida.get().getId());
					      	detalleUnits.setName(campainsElegida.get().getName());
					      	detalleUnits.setDsc(campainsElegida.get().getDsc());
					      	detalleUnits.setUpdatabledate(tieneCampana);
					      	Date dateto = campainsElegida.get().getDateto();
					      	Date datefrom = campainsElegida.get().getDatefrom();
					        SimpleDateFormat salidaentry = new SimpleDateFormat("dd/MM/yyyy"); //2024-12-23 23:00
				               String respto = salidaentry.format(dateto);
				               String respfrom = salidaentry.format(datefrom);
				               
					      	detalleUnits.setDatefrom(respfrom);
					      	detalleUnits.setDateto(respto);
								    				  
				    	   detalleStatus.setId(campainsElegida.get().getStatus());
				    	   
				    	   if (campainsElegida.get().getStatus()==1) {
				    		   String descestatus = "Abierta";
				    		   detalleStatus.setName(descestatus);
				    		   
				    	   } else {
				    		   String descestatus = "Cerrada";	
				    		   detalleStatus.setName(descestatus);
				    	   }
				    	   
				    	   listasStatus.add(detalleStatus);	
				    	   detalleUnits.setStatus(detalleStatus);
				    	   detalleUnits.setUnits(ListunitsAsociadas);
				    	   				    	   
				    	   CampainDetailResponseDto entry = new CampainDetailResponseDto();			    		
				    	   entry.setEntry(detalleUnits);						 						      
						   return ResponseEntity.ok(entry);
					}
				} else {
					respuesta.setMsg("Sesión expirada o inválida");
					estatus = HttpStatus.UNAUTHORIZED;
					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);
		}

	}
	
	@DeleteMapping("/campaigns/{campaignid}")
	public ResponseEntity<?> borrarCampaing(HttpServletRequest request, @PathVariable("campaignid") final Integer campaignid)
			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.
		 // String var = "";
	    //	boolean bloked = false;
		 //   RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
		    
		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, 103);
				   //rolisvalid = 3;
				   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 (campaignsRepository.existsById(campaignid)) {
						
						  String SentenciaBase = "SELECT  CASE WHEN u.dateto < now()"									
									+ "	then TRUE ELSE FALSE END AS expiro FROM main.campaigns u where u.id = " + campaignid ;
						  
						   Query queryTypes = entityManager.createNativeQuery(SentenciaBase);
					       boolean listatipos= (boolean) queryTypes.getSingleResult();
					       boolean RemoteJson = listatipos;
					      int rolisvalidChange = auditRepository.getCantbyRolAndPrivi(idrol, 105);
					       if (RemoteJson) {
					    	   
					    	    if (rolisvalidChange==0) {
					    	    	
					    	    	   var = "";
								    	 bloked = false;
									     respuesta = new RespuestaMsgDto(var);
									    //respuestaDto.setBlocked(bloked);
									    respuestaDto.setMsg("No tiene los Privilegios"); 
									    return new ResponseEntity(respuestaDto, HttpStatus.FORBIDDEN);
					    	    } else
					    	    {
					    	    	
									
									// Borro el rol boolean existeUsers = ;
									int valor = 0;
									try {
									//usersRepository.deleteusersbyid(userid,fechaDate,valor);	
									campaignsRepository.deleteCampaignsbyid(campaignid);	
									respuestaValueDto= new RespuestaValueDto(campaignid);
									
									 Optional<Campaigns> CampanaDelete = campaignsRepository.findById(campaignid);
									   String module = "Campañas";
									     String Descmodule = "Se eliminó la Campaña con Nombre: " + CampanaDelete.get().getName() + " y Id:" + campaignid;
									    
								         auditDto.setIpaddr(HttpReqRespUtils.getClientIpAddressIfServletRequestExist());
								         //SimpleDateFormat  formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
								         //String dataFormattata = formatter.format(fecha);
								         //Date fechaDate = formatter.parse(dataFormattata);
								         
								         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); 
									
									
									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 {
						
						  Optional<Campaigns> CampanaDelete = campaignsRepository.findById(campaignid);
						   String module = "Campañas";
						   //  String Descmodule = "Se eliminó : " + CampanaDelete.get().getName();
						     String Descmodule = "Se eliminó la Campaña con Nombre: " + CampanaDelete.get().getName() + " y Id:" + campaignid;
						    
					         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); 
						
						// Borro el rol boolean existeUsers = ;
						int valor = 0;
						try {
						//usersRepository.deleteusersbyid(userid,fechaDate,valor);	
						campaignsRepository.deleteCampaignsbyid(campaignid);	
						respuestaValueDto= new RespuestaValueDto(campaignid);
						
						
						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);
				}
			} else {
				respuesta.setMsg("Sesión expirada o inválida");
				estatus=HttpStatus.UNAUTHORIZED;
				return new ResponseEntity(respuesta, estatus);
				
			}

			
		}
		
	}	


}
