package com.dacrt.SBIABackend.controler;

import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
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.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.transaction.Transactional;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders;
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.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.EvalProcessRecordsDto;
import com.dacrt.SBIABackend.dto.EvalProcessRequestDto;
import com.dacrt.SBIABackend.dto.EvalProcessResponseDto;
import com.dacrt.SBIABackend.dto.EvalUnitsRecordDto;
import com.dacrt.SBIABackend.dto.OperationlineDto;
import com.dacrt.SBIABackend.dto.ProcessResponDto;
import com.dacrt.SBIABackend.dto.StatusDto2;
import com.dacrt.SBIABackend.dto.StatusEvalUnitsResponseDto;
import com.dacrt.SBIABackend.dto.StatusResponseDto;
import com.dacrt.SBIABackend.dto.TotalPosiResUnitsDto;
import com.dacrt.SBIABackend.dto.TotalsResponseDto;
import com.dacrt.SBIABackend.dto.UnitsResponseDto;
import com.dacrt.SBIABackend.dto.requestDto.StatusEvalProcessRequestDto;
import com.dacrt.SBIABackend.dto.responseDto.EvalUnitsResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.RespuestaEstatusUpdateDto;
import com.dacrt.SBIABackend.entity.Applications;
import com.dacrt.SBIABackend.entity.Evalprocapps;
import com.dacrt.SBIABackend.entity.Evalprocesses;
import com.dacrt.SBIABackend.repository.ApplicationsRepository;
import com.dacrt.SBIABackend.repository.CampaignsRepository;
import com.dacrt.SBIABackend.repository.EvalprocappsRepository;
import com.dacrt.SBIABackend.repository.EvalprocessesRepository;
import com.dacrt.SBIABackend.repository.EvalprosuppliersRepository;
import com.dacrt.SBIABackend.repository.EvalunitsRepository;
import com.dacrt.SBIABackend.security.dto.AuditRequestDto;
import com.dacrt.SBIABackend.security.dto.ParamsDto;
import com.dacrt.SBIABackend.security.dto.ParamsResponseDto;
import com.dacrt.SBIABackend.security.dto.PrivilegesAllDto;
import com.dacrt.SBIABackend.security.dto.PrivilegesDto;
import com.dacrt.SBIABackend.security.dto.RespuestaMsgDto;
import com.dacrt.SBIABackend.security.dto.RespuestaValueDto;
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
@CrossOrigin(origins = "*")
public class EvalunitsController {
	@Autowired
	private ParamsRepository paramsRepository;
	
	@Autowired
	private UsersRepository usersRepository;
	
	@Autowired
	private AuditRepository auditRepository;
	
	@Autowired
	private RolesPrivilegesRepository rolesPrivilegesRepository;
	
	@Autowired
	UsersService usersService;
	
	@Autowired
	SecurityService securityService;
	
	@Autowired
	MenuService menuService;
	
	@Autowired
	CampaignsRepository campaignsRepository;
	
	@Autowired
	EvalunitsRepository evalunitsRepository;
	
	@Autowired
	ApplicationsRepository applicationsRepository;
	
	@Autowired
	EvalprocappsRepository evalprocappsRepository;
	
	@Autowired
    private JdbcTemplate jdbcTemplate;
	
	@Value("${var.ambiente}")
	private String urlAmbiente;
	
	@Value("${spring.datasource.url}")
	private String conexion;
	
	@Value("${spring.datasource.username}")
	private String userbd;
	
	@Value("${spring.datasource.password}")
	private String passbd;
	
	
	@PersistenceContext
    private EntityManager entityManager;
	
	@Autowired
	EvalprocessesRepository evalprocessesRepository;
	
	Logger logger = LoggerFactory.getLogger(EvalprocessesController.class);
	
	
	@Transactional
	@PostMapping("/evalunits")
	public ResponseEntity<EvalUnitsResponseDto> evalunits(HttpServletRequest request,HttpServletResponse response,@RequestBody EvalProcessRequestDto evalProcessRequestDto) 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);

		String searchIn = "";
		int statusIn = 0;
		int campaingIn=0;

		String searchModule = "";
		String searchUsr = "";
		String contentIn = "";
		int orderIn = 0;
		int offsetIn = 0;
		int numofrecordsIn = 0;
		int rolisvalid = 0;

		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);
		StatusDto2 detalleStatusDto2 = new StatusDto2();
		Long resource= 0L;
		Long positions= 0L;
		
		// 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);
				}
				
				// Obtengo el rol de usuario y verifico si corresponde al privilegio del usuario
				rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 210);
				if (rolisvalid == 0) {
					respuesta.setMsg("No tiene los Privilegios");
					estatus = HttpStatus.FORBIDDEN;
					return new ResponseEntity(respuesta, estatus);
				}
				
				// Obtengo los datos del Body
				//searchIn = evalProcessRequestDto.getFilters().getSearch();// dato de busqueda por nombre
				searchIn = evalProcessRequestDto.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(evalProcessRequestDto.getFilters().getSearch());	  
				statusIn = evalProcessRequestDto.getFilters().getStatus();// dato de busqueda por status
				campaingIn = evalProcessRequestDto.getFilters().getCampaignid();
				
				orderIn = evalProcessRequestDto.getOrder(); // Orden Ascedente o Descendente
				offsetIn = evalProcessRequestDto.getOffset();// Primer registro a mostrar
				numofrecordsIn = evalProcessRequestDto.getNumofrecords();// Número de registros a mostrar
				contentIn = evalProcessRequestDto.getContent();
				
				
                  int formatIn = 0;
				
				  try {
					  formatIn = evalProcessRequestDto.getFormat();

				    } catch (Exception e) {
					   formatIn = 0;

				   }
				   // Verifico los Shorcouts
				if (contentIn != null && contentIn != "")  {
					menuService.iscontentdiffnull(contentIn, encontreSessionUsuario.get().getId());
				}
				
				try {
					Query query,query2,query3;
					Integer idUsuario2=encontreSessionUsuario.get().getId();
					//Cantidad de procesos a evaluar
					
					String sentenciaCantidadProcesos2= "SELECT count(up.id) "
					+ " FROM  main.campaigns c "
					+ "  INNER JOIN main.campaignunits cu "
					+ "  ON c.id= :campanaid AND cu.campaingid=c.id "
					+ " INNER JOIN main.units up "
					+ " ON up.id=cu.unitid "
					+ "   INNER JOIN main.userunits US "
					+ "  ON US.unitid=UP.id and US.userid = :idUsuario";
					query = entityManager.createNativeQuery(sentenciaCantidadProcesos2);
					query.setParameter("campanaid", campaingIn);
					query.setParameter("idUsuario", idUsuario2);
					Object resultadoCantidadProcesos2 = query.getSingleResult();
					Integer cantidadProcesos2 = ((Number) resultadoCantidadProcesos2).intValue();
					
					
					String sentenciaCantidadCerrados2= "SELECT SUM(CASE WHEN ep.positionst = 1 THEN 1 ELSE 0 END) AS positions, "
							+ " SUM(CASE WHEN ep.resourcest = 1 THEN 1 ELSE 0 END) AS resource "
							+ " FROM main.campaigns c  "
					+ " INNER JOIN main.campaignunits cu ON c.id = :campanaid AND cu.campaingid = c.id  "
				    + "  INNER JOIN main.units up ON up.id = cu.unitid  "
					+ " INNER JOIN main.userunits US ON US.unitid = UP.id AND US.userid = :idUsuario "
					+ " INNER JOIN main.evalunits ep ON cu.id = ep.campaingunitid ";
					query = entityManager.createNativeQuery(sentenciaCantidadCerrados2);
					query.setParameter("campanaid", campaingIn);
					query.setParameter("idUsuario", idUsuario2);
					List<Object[]> resultadoCantidadCerrados2 = query.getResultList();
					cuantosregistro = (long) query.getResultList().size();														
					
					
					if (cuantosregistro > 0) {
						for (Object[] fila : resultadoCantidadCerrados2) {
							positions = (fila[0] != null) ? ((Number) fila[0]).longValue() : 0L;
							resource = (fila[1] != null) ? ((Number) fila[1]).longValue() : 0L;
						}
					}
					cuantosregistro=0;
					
			
					
					//Primero verifico e inserto en la la tabla EvalProcess
					String SentenciaInsert = " INSERT INTO main.evalunits (campaingunitid) "
							+ "		SELECT ORI.campaingunitid "
							+ "		FROM "
							+ "		( SELECT  CU.id campaingunitid, UP.id unit "
							+ "		FROM  main.campaignunits CU "
							+ "		INNER JOIN main.units UP "
							+ "		ON CU.unitid=UP.id and UP.status=1 "
							+ "		INNER JOIN main.userunits US"
							+ "		ON US.unitid=UP.id and US.userid = :idUsuario"
							+ "     INNER JOIN main.campaigns ca on CU.campaingid = ca.id and ca.status = 1 and ca.id = :campanaid ) ORI "
							+ "		LEFT JOIN "
							+ "		( SELECT campaingunitid "
							+ "		FROM main.evalunits "
							+ "		 ) DES "
							+ "		ON ORI.campaingunitid=DES.campaingunitid "
							+ "		WHERE DES.campaingunitid IS NULL  ";
	                // agregar condicion de que el estatus de la campana sea 1				
					System.out.println(SentenciaInsert);
					query2 = entityManager.createNativeQuery(SentenciaInsert);
					query2.setParameter("idUsuario", idUsuario2);
					query2.setParameter("campanaid", campaingIn);
					int cuantosregistro2 = query2.executeUpdate();
					
					//Luego query de consulta
					
					/////////////ejecutar el delete por este patron
					
					// borrar las entradas de evaluacion de evalunit que ya fueron insertadas
					// se deben borrar donde el estatus de la unidad este desactivado y la marca positionst y resourcest sean 0
					// y la campana debe estar activa
					
					
					String SentenciaDelete = " DELETE FROM main.evalunits where id in  (select eu.id from main.evalunits eu "
							+ " inner join main.campaignunits cu on eu.campaingunitid = cu.id "
							+ " inner join main.units u on cu.unitid = u.id and u.status = 0 "
							+ " INNER JOIN main.userunits us ON us.unitid=u.id and us.userid = :idUsuario " 
							+ " inner join main.campaigns c on cu.campaingid = c.id and c.status = 1 and c.id = :campanaid "
							+ " and eu.positionst = 0 and eu.resourcest = 0)  ";
	                // agregar condicion de que el estatus de la campana sea 1				
					System.out.println(SentenciaDelete);
					query3 = entityManager.createNativeQuery(SentenciaDelete);
					query3.setParameter("idUsuario", idUsuario2);
					query3.setParameter("campanaid", campaingIn);
					int cuantosregistro3 = query3.executeUpdate();
					System.out.println(cuantosregistro3);
					///////////////////////////////fin del delete////////////////////////////////
					
					String QueryTotal="";
					String LowerSearch = searchIn.toLowerCase(); // se convierte en minúscula
					
					
					 String SentenciaBase  = "SELECT e.id, u.id AS idUnidad ,u.name AS nombre_unidad, "
							 + "  CASE WHEN e.positionst = 1 THEN true ELSE false END AS positions, "
							 + " CASE WHEN e.resourcest = 1 THEN true ELSE false END AS resource,u.status, "
							 + " CASE WHEN u.status = 1 THEN 'Activo' ELSE 'Inactivo' END AS desestatus  "
		                     + " FROM main.evalunits e,  "
		                     + "    main.campaignunits cu,  "
		                     + "    main.units u, 	"							 
	                         + "    main.userunits us "
	                         + " WHERE e.campaingunitid = cu.id "
	                         + "  AND us.unitid=u.id "
	                         + "  AND cu.unitid=u.id "
	                          + " AND us.userid = :idUsuario " ;
					
					if (searchIn!=null) {
						switch (searchIn) {
							case "":
								QueryTotal = SentenciaBase + " AND 1=1 ";
								break;
							default: // viene con el parametro para buscar por el like
								QueryTotal = SentenciaBase + " AND  main.sinacentos(lower(u.name)) LIKE  " + "'%" + LowerSearch + "%'" ;
								//QueryTotal = SentenciaBase + " AND lower(u.name) LIKE  " + "'%" + LowerSearch + "%'" ;
								break;
						}
					}else {
						 respuesta.setMsg("Llamada al servicio malformado");
						 estatus = HttpStatus.BAD_REQUEST;
						 return new ResponseEntity(respuesta, estatus);
				 	 }

					
						switch (statusIn) {
							case 0:
								QueryTotal = QueryTotal + " AND 1=1 ";
								break;
							case 1:
								QueryTotal = QueryTotal + " AND ( e.positionst <> 0 AND e.resourcest <> 0)";
								break;
							case 2:
								QueryTotal = QueryTotal + " AND ( e.positionst  = 0 OR e.resourcest = 0) ";
								break;
							default:
								respuesta.setMsg("Llamada al servicio malformado");
								estatus = HttpStatus.BAD_REQUEST;
								return new ResponseEntity(respuesta, estatus);
						 }
					
					
					switch (campaingIn) {
						case 0:
							QueryTotal = QueryTotal + " AND 1=1 ";
							break;
						default:
							QueryTotal = QueryTotal + " AND cu.campaingid =" + campaingIn;
					}
					
					switch (orderIn) {
						case 1: // ordena por nombre de unidad
							QueryTotal = QueryTotal + " ORDER BY u.name ASC ";
							break;
	
						case 2:// ordena por nombre de proceso
							QueryTotal = QueryTotal + " ORDER BY e.positionst ASC ";
							break;
	
						case 3: // ordena por estatus impactst
							QueryTotal = QueryTotal + " ORDER BY e.resourcest ASC";
							break;															
	
						case -1: // ordena por nombre de unidad
							QueryTotal = QueryTotal + " ORDER BY u.name DESC  ";
							break;
	
						case -2:// ordena por nombre de proceso
							QueryTotal = QueryTotal + " ORDER BY e.positionst DESC ";
							break;
	
						case -3: // ordena por estatus impactst
							QueryTotal = QueryTotal + " ORDER BY e.resourcest DESC ";
							break;
	
						default:
							respuesta.setMsg("Llamada al servicio mal formado");
							estatus = HttpStatus.BAD_REQUEST;
							return new ResponseEntity(respuesta, estatus);
					}
					
					query = entityManager.createNativeQuery(QueryTotal);
					query.setParameter("idUsuario", idUsuario2);
					cuantosregistro = (long) query.getResultList().size();
					query.setFirstResult(offsetIn);
					query.setMaxResults(numofrecordsIn);
					List<Object[]> resultados = query.getResultList();
					
					EvalProcessResponseDto evalProcessResponseDto = new EvalProcessResponseDto();
					EvalUnitsResponseDto  evalUnitsResponseDto = new EvalUnitsResponseDto();
					List<EvalUnitsRecordDto> evalUnitsResponseDtoList = new ArrayList();
					EvalUnitsRecordDto evalProcessRecordsDto = new EvalUnitsRecordDto();
					
					UnitsResponseDto unitsResponseDto = new UnitsResponseDto();
					TotalPosiResUnitsDto statusPosiResour = new TotalPosiResUnitsDto();
					OperationlineDto operationDto = new OperationlineDto();
					
					ProcessResponDto processResponDto = new ProcessResponDto();
					StatusEvalUnitsResponseDto statusResponseDto= new StatusEvalUnitsResponseDto();
					PrivilegesAllDto detallePrivilege = new PrivilegesAllDto();
					TotalPosiResUnitsDto totalsResponseDto = new TotalPosiResUnitsDto();
					Integer contador=0;
					Integer contadorPosition=0;
					Integer contadorResource=0;
					///////////////////////////////salida por cvs /////////////////// format tipo 2
					
					
					if (formatIn==2) {	
						 
				        // String unit ="UNIDADES";
				         response.setContentType("text/csv");
					     response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"Evaluaciones_por_Unidad.csv\"");
					 try (PrintWriter writer = response.getWriter();
	                // CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT.withHeader( "UNIDADES", "PROCESOS" , "IM" , "AT" ,  "PR" , "RV" , "PC" ,  "IN" , "RR" ))) {
							 CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT.withHeader("UNIDAD", "PERSONAS", "RECURSOS"))) {
					     
					        if (cuantosregistro > 0) {
								for (Object[] filaformat2 : resultados) {   
									 String cadenaunidad="";
									
									 String cadena1 = "";
									 String cadena2 = "";
									
				                // for (int i = 1; i < cuantosregistro; i++) {
				                	  cadenaunidad = (String) filaformat2[2];
				                	  cadenaunidad = cadenaunidad.replace(',', ' ');
				                	  //cadenaOriginal.replace(',', ' ');
				                	
				                     
				                     
				                     if ((boolean) filaformat2[3]==true) {
				                    	 //csvPrinter.printRecord("SI");
				                    	  cadena1="SI"; 
				                    	
				                     } else {
				                    	 //csvPrinter.printRecord("NO");
				                    	  cadena1="NO"; 
				                     }
				                     if ((boolean) filaformat2[4]==true) {
				                    	 // csvPrinter.printRecord("SI");
				                    	  cadena2="SI";
				                     } else {
				                    	 // csvPrinter.printRecord("NO");
				                    	  cadena2="NO"; 
				                     }
				                    
				                  
				                 // }
	                            String Imprimir = "\"" + cadenaunidad+ "\""  + "," + "\"" + cadena1 + "\"" + "," + "\"" + cadena2 + "\"";
	                          csvPrinter.printRecord(Imprimir);
								}
								csvPrinter.flush();
							}  
					        return new ResponseEntity(HttpStatus.OK);
	                  
	                 }
					} 
					///////////////////////////////////////////////////////////////////////////////
					
					
					
					
			if (formatIn==1 || formatIn==0 ) {		
					if (cuantosregistro > 0) {
						for (Object[] fila : resultados) {
							 detalleStatusDto2 = new StatusDto2();
							evalProcessRecordsDto.setId((int) fila[0]);
							
							unitsResponseDto.setId((int) fila[1]);
							unitsResponseDto.setName((String) fila[2]);
							detalleStatusDto2.setId((int) fila[5]);
							detalleStatusDto2.setName((String) fila[6]);
							unitsResponseDto.setStatus(detalleStatusDto2);
							evalProcessRecordsDto.setUnit(unitsResponseDto);
						
							statusResponseDto.setPosition((boolean) fila[3]);
							statusResponseDto.setResource((boolean) fila[4]);
							
							evalProcessRecordsDto.setStatus(statusResponseDto);
							
							if (statusResponseDto.isPosition())
								contadorPosition++;
							
							if (statusResponseDto.isResource())
								contadorResource++;
						
							
						
							
							evalUnitsResponseDtoList.add(evalProcessRecordsDto);
							
							unitsResponseDto = new UnitsResponseDto();
							processResponDto = new ProcessResponDto();
							statusResponseDto= new StatusEvalUnitsResponseDto();
							evalProcessRecordsDto= new EvalUnitsRecordDto();
							contador++;
						}
					
				
						totalsResponseDto.setPosition(positions.toString()+"/"+cantidadProcesos2);
						totalsResponseDto.setResource(resource.toString()+"/"+cantidadProcesos2);
						
						rolisvalid=0;
						detallePrivilege = new PrivilegesAllDto();
						rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 211);
						if (rolisvalid>0)
							detallePrivilege.setUpdate(true);
						else
							detallePrivilege.setUpdate(false);

						rolisvalid=0;
						rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 210);
						if (rolisvalid>0)
							detallePrivilege.setView(true);
						else
							detallePrivilege.setView(false);

						rolisvalid=0;
						rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 212);
						if (rolisvalid>0)
							detallePrivilege.setAdd(true);
						else
							detallePrivilege.setAdd(false);

						rolisvalid=0;
						rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 213);
						if (rolisvalid>0)
							detallePrivilege.setDelete(true);
						else
							detallePrivilege.setDelete(false);
						
						evalUnitsResponseDto.setNumofrecords(cuantosregistro);
						evalUnitsResponseDto.setRecords(evalUnitsResponseDtoList);
						evalUnitsResponseDto.setSessionvalidthru(fechaComoCadena);
						evalUnitsResponseDto.setTotals(totalsResponseDto);
						evalUnitsResponseDto.setPrivileges(detallePrivilege);
						
						
					}else {
						rolisvalid=0;
						detallePrivilege = new PrivilegesAllDto();
						rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 211);
						if (rolisvalid>0)
							detallePrivilege.setUpdate(true);
						else
							detallePrivilege.setUpdate(false);

						rolisvalid=0;
						rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 210);
						if (rolisvalid>0)
							detallePrivilege.setView(true);
						else
							detallePrivilege.setView(false);

						rolisvalid=0;
						rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 212);
						if (rolisvalid>0)
							detallePrivilege.setAdd(true);
						else
							detallePrivilege.setAdd(false);

						rolisvalid=0;
						rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 213);
						if (rolisvalid>0)
							detallePrivilege.setDelete(true);
						else
							detallePrivilege.setDelete(false);
						
						evalUnitsResponseDto.setNumofrecords(cuantosregistro);
						evalUnitsResponseDto.setRecords(evalUnitsResponseDtoList);
						evalUnitsResponseDto.setSessionvalidthru(fechaComoCadena);
						evalUnitsResponseDto.setTotals(totalsResponseDto);
						evalUnitsResponseDto.setPrivileges(detallePrivilege);
					
					}
				}	
						
						return new ResponseEntity(evalUnitsResponseDto, HttpStatus.OK);
				}catch(Exception e) {
					respuesta.setMsg("Error interno del servidor " + e.getMessage());
					estatus = HttpStatus.INTERNAL_SERVER_ERROR;
				}
				finally {
			        if (entityManager != null && entityManager.isOpen()) {
			            entityManager.close();
			        }
			    }
			} else { // Si la sesión que viene es inválida
				respuesta.setMsg("Sesión expirada o inválida");
				estatus = HttpStatus.BAD_REQUEST;
				return new ResponseEntity(respuesta, estatus);
			}
			return new ResponseEntity(respuesta, estatus);
		}
	}
	
	
	  @PostMapping("/evalunits/{evalunitid}")
	    public ResponseEntity<?> updateStatusEvalUnits(HttpServletRequest request,@RequestBody StatusEvalProcessRequestDto datosEvalProcesses, @PathVariable("evalunitid") final Integer evalunitid) throws ParseException {
			
			RespuestaValueDto respuestaValueDto; 
			RespuestaEstatusUpdateDto respuestaEstatusUpdateDto;
			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<>();
		         String queryInsertProcesses = "";
		         String queryInsertUnidades= "";
		         
			 int idparametroEval = evalunitid;
			
			 Optional<Users> encontreSessionUsuario;
			 Optional<Evalprocapps> encontreEvalProcessesApp;
			 Applications encontreApp;
			 
			 Evalprocesses encontreEvalProcesses;
			 
			 //int valor = idparametroEval;
			 int idmensaje=0; 
			 String sessionid = request.getHeader("Authorization");
			 String queryUpdate;
			  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 existeApp = false;	       	       	  		
			   Date fecha2 = new Date();
			   Calendar calendar = Calendar.getInstance();
		
			 
				if (sessionid==null) {
					String var = "";
					boolean bloked = false;
					RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
					//respuestaDto.setBlocked(bloked);
					respuestaDto.setMsg("Llamada al servicio malformado");
					//Error 400
					return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
				} else   {
					
					
					int statusCampaigns =campaignsRepository.findStatusCampaignByEvalUnitId(evalunitid);
		 			//	statusCampaigns = 3;
						 if (statusCampaigns==0) {
							 
							 String var = "";
								boolean bloked = false;
								RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
								//respuestaDto.setBlocked(bloked);
								respuestaDto.setMsg("No tiene los privilegios");
								//Error 400
								return new ResponseEntity(respuestaDto, HttpStatus.FORBIDDEN);
							 
						  } 
		 				
									 
					   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,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)
	  				    //		 int idparametroEval = evalprocessid;
	  					//	 int idparametroEvalApp = evalprocappid;
	  					    
	  					 // boolean existeEvalidPro =  evalprocessesRepository.existsById(idparametroEval);
	  					  boolean existeEvalidPro =  evalunitsRepository.existsById(idparametroEval);
	  					//  
						   if (!existeEvalidPro) {
					    	    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);
					    	  
					       } 		
					   
						   Roles roles = encontreSessionUsuario.get().getRolid();
						   int idrol = roles.getId();
						   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol,210);
						    rolisvalid = 3;
						   if (rolisvalid==0) {
							   
							   String var = "";
								boolean bloked = false;
								RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
								//respuestaDto.setBlocked(bloked);
								respuestaDto.setMsg("No tiene los Privilegios"); 
								return new ResponseEntity(respuestaDto, HttpStatus.FORBIDDEN);
							   
						     }
						   					   					 											 
							 	
					   
					 } else {
							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 {
				

					//Evalprocapps evalprocapp = new Evalprocapps();		
					  Connection conexion2 = DriverManager.getConnection(conexion,userbd, passbd);
		    			//(PreparedStatement sentenciaPreparada = conexion2.prepareStatement(sql))
		    			Statement sentenciaPreparada = null;
		    			sentenciaPreparada = conexion2.createStatement();
		    			
				    //positionst, resourcest
					 int statusnew;
					 
					 switch (datosEvalProcesses.getStatus()) { 
					 					 
					    case 1:  //ordena por dsc ascendente
					    	
					    	statusnew = datosEvalProcesses.getStatus();
		    	            
					     break;
					    case 0:   //ordena por status ascendente
					    	statusnew = datosEvalProcesses.getStatus();			     
		    	         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);
						    
						   }
		    	         
					 String sql = "";
					 String valida = "";
					 switch (datosEvalProcesses.getField()) { 
					    case "positionst":
					    	 valida = "SI";
					     break;
					    case "resourcest":   
					    	 valida = "SI";				    	  		   
		    	         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);
					    
					   }
		
					 String sqlStatus = " SELECT u." +  datosEvalProcesses.getField();
			    	    String FromStatus = " FROM main.evalunits u WHERE u.id = " + idparametroEval;
			    	    sqlStatus = sqlStatus + FromStatus;
			    	    PreparedStatement pstmt = conexion2.prepareStatement(sqlStatus);
			    	    ResultSet rs = pstmt.executeQuery();
			    	    int estatusactual = 0;
			    	    
			    	    if (rs.next()) {
			                // Obtener el valor entero de la primera columna
			                 estatusactual = rs.getInt(1);
			                System.out.println("El valor entero obtenido es: " + estatusactual);
			            } else {
			            	
			            	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);
			            }
			    	    
			    
			    	    
			    	   // if (estatusactual==0) {
			    	    sql = " UPDATE main.evalunits SET " + datosEvalProcesses.getField() ;
			    	    String sql2  = " = " +  statusnew + " WHERE id = " + idparametroEval ;
			    	    String sqlall = sql + sql2;
		                sentenciaPreparada.execute(sqlall);
			    	    //} else {
			    	    	//int estatusobligado = 1;
			    	    //	respuestaValueDto= new RespuestaValueDto(estatusobligado);
							
						//	estatus=HttpStatus.OK;
						//	return new ResponseEntity(respuestaValueDto, estatus);     
			    	    	
			    	    //}
					 
					//evalprocessesRepository.deleteEvalprocappsbyid(evalpidparametroEvalrocappid);
					//idparametroEval
	 			         
				        //////////////////////////INSERCION BLOQUE DE AUDITORIA///////////////////
					     String module = "Evaluación por Unidad";
					     String Descmodule = "Se Actualizo el estatus de la Evaluación de Unidad con Id: " + idparametroEval;
					    
				         auditDto.setIpaddr(HttpReqRespUtils.getClientIpAddressIfServletRequestExist());			        
				         
				         String singo1 = "(";
				         String singo2 = ")";
				         String usryemail = encontreSessionUsuario.get().getUsr().concat(" ").concat(singo1).concat(encontreSessionUsuario.get().getEmail().concat(singo2));
				         auditDto.setUserref(usryemail);
				         auditDto.setModule(module);
				         auditDto.setDesc(Descmodule);
				         auditDto.setCreatedat(fechaDate);
				 		   usersService.registrarAuditSesion(auditDto); 
				 		   
							//respuestaValueDto= new RespuestaValueDto(statusnew);
						    respuestaEstatusUpdateDto = new RespuestaEstatusUpdateDto(statusnew);
							estatus=HttpStatus.OK;
							return new ResponseEntity(respuestaEstatusUpdateDto, estatus);                    					        	         

			
	       
			   } catch (Exception e) {
	            // Manejo de excepciones
				respuesta= new RespuestaMsgDto("Error interno del servidor");
				estatus=HttpStatus.INTERNAL_SERVER_ERROR;            
			   }finally {
			        if (entityManager != null && entityManager.isOpen()) {
			            entityManager.close();
			        }
	        }
			
			return new ResponseEntity(respuesta, estatus);
		
		}
	    


}
