package com.dacrt.SBIABackend.controler;

import java.io.IOException;
import java.net.URI;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Optional;

import javax.persistence.EntityManager;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.type.TypeReference;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.servlet.http.HttpServletRequest;
import javax.transaction.Transactional;

import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.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.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.dacrt.SBIABackend.dto.DaysDto;
import com.dacrt.SBIABackend.dto.EntryImpactDto;
import com.dacrt.SBIABackend.dto.EntryPeriodoCriticoDto;
import com.dacrt.SBIABackend.dto.EntryPeriodoCriticoDto2;
import com.dacrt.SBIABackend.dto.EvalProcessRecordsDto;
import com.dacrt.SBIABackend.dto.EvalProcessRequestDto;
import com.dacrt.SBIABackend.dto.EvalProcessResponseDto;
import com.dacrt.SBIABackend.dto.EvalprocimpactsActualizarDto;
import com.dacrt.SBIABackend.dto.EvalprocperiodActualizarDto;
import com.dacrt.SBIABackend.dto.ImpactResponseDto;
import com.dacrt.SBIABackend.dto.MonthsDto;
import com.dacrt.SBIABackend.dto.PeriodParResponseDto;
import com.dacrt.SBIABackend.dto.PeriodsResponseDto;
import com.dacrt.SBIABackend.dto.ProcessActualizarDto;
import com.dacrt.SBIABackend.dto.ProcessResponDto;
import com.dacrt.SBIABackend.dto.ProcessTypeDto;
import com.dacrt.SBIABackend.dto.RtoResponseDto;
import com.dacrt.SBIABackend.dto.ScaleResponseDto;
import com.dacrt.SBIABackend.dto.StatusDto;
import com.dacrt.SBIABackend.dto.StatusResponseDto;
import com.dacrt.SBIABackend.dto.TimetableDto;
import com.dacrt.SBIABackend.dto.TotalsResponseDto;
import com.dacrt.SBIABackend.dto.UnitsResponseDto;
import com.dacrt.SBIABackend.entity.Evalprocesses;
import com.dacrt.SBIABackend.entity.Evalprocimpacts;
import com.dacrt.SBIABackend.entity.Evalprocperiods;
import com.dacrt.SBIABackend.entity.Processes;
import com.dacrt.SBIABackend.repository.CampaignsRepository;
import com.dacrt.SBIABackend.repository.EvalprocessesRepository;
import com.dacrt.SBIABackend.repository.EvalprocimpactsRepository;
import com.dacrt.SBIABackend.repository.EvalprocperiodsRepository;
import com.dacrt.SBIABackend.security.dto.AuditRequestDto;
import com.dacrt.SBIABackend.security.dto.PrivilegesAllDto;
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.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 EvalprocperiodsController {
	@Autowired
	private ParamsRepository paramsRepository;
	
	@Autowired
	private UsersRepository usersRepository;
	
	@Autowired
	private AuditRepository auditRepository;
	
	@Autowired
	private RolesPrivilegesRepository rolesPrivilegesRepository;
	
	@Autowired
	UsersService usersService;
	
	@Autowired
	ParamsService paramsService;
	
	@Autowired
	SecurityService securityService;
	
	@Autowired
	CampaignsRepository campaignsRepository;
	
	
	@Autowired
	MenuService menuService;
	
	@PersistenceContext
    private EntityManager entityManager;
	
	@Autowired
    private ObjectMapper objectMapper;
	
	@Autowired
	EvalprocperiodsRepository evalprocperiodsRepository;
	
	@Autowired
	EvalprocessesRepository evalprocessesRepository;
	
	Logger logger = LoggerFactory.getLogger(EvalprocperiodsController.class);
	
	@GetMapping({"/evalprocesses/{evalprocessid}/periods", "/evalprocesses/{evalprocessid}/periods/{evalprocperiodid}"})
	public ResponseEntity<EntryPeriodoCriticoDto> ObtenerPeriodo(HttpServletRequest request,
			@PathVariable("evalprocessid") final Integer evalprocessid,
			@PathVariable(name = "evalprocperiodid", required = false) final Integer evalprocperiodid) 
					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 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);
		
		// 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(), 200);
				if (rolisvalid == 0) {
					respuesta.setMsg("No tiene los Privilegios");
					estatus = HttpStatus.FORBIDDEN;
					return new ResponseEntity(respuesta, estatus);
				}

				//Verifico si existe el id de la Evaluaciòn del proceso
			    Optional<Evalprocesses> obtproceso=evalprocessesRepository.findById(evalprocessid);
			    Evalprocperiods evalprocperiods=new Evalprocperiods();
			    //Verifico si encontre el proceso
			    if (!obtproceso.isPresent()) {
			    	respuesta.setMsg("Registro no encontrado");
					return new ResponseEntity(respuesta, HttpStatus.NOT_FOUND);
			    }
			    
				try {
					Query query;
					Query query2;
					Query query3;
					String QueryTotal="";
					//Luego consulto la tabla EvalProcess
					String SentenciaBase = "SELECT ep.id, "
							+ "                    eval.periodst, "
							+ "                    CASE WHEN eval.periodst = 1 THEN 'Abierta' ELSE 'Completada' END AS descStatus,"
							+ "                    ep.evalprocessid, "
							+ "	                   ep.timetable, "
							+ "	                   ep.d1evalprocscalepar, "
							+ "	                   ep.d2evalprocscalepar, "
							+ "	                   ep.d3evalprocscalepar, "
							+ "	                   ep.d4evalprocscalepar, "
							+ "	                   ep.d5evalprocscalepar, "
							+ "	                   ep.d6evalprocscalepar, "
							+ "	                   ep.d7evalprocscalepar, "
							+ "	                   ep.m1evalprocscalepar, "
							+ "	                   ep.m2evalprocscalepar, "
							+ "	                   ep.m3evalprocscalepar, "
							+ "	                   ep.m4evalprocscalepar, "
							+ "	                   ep.m5evalprocscalepar, "
							+ "	                   ep.m6evalprocscalepar, "
							+ "	                   ep.m7evalprocscalepar, "
							+ "	                   ep.m8evalprocscalepar, "
							+ "	                   ep.m9evalprocscalepar, "
							+ "	                   ep.m10evalprocscalepar, "
							+ "	                   ep.m11evalprocscalepar, "
							+ "	                   ep.m12evalprocscalepar, "
							+ "                    ep.notes "
							+ " FROM main.evalprocperiods ep, "
							+ "      main.evalprocesses eval "
							+ " WHERE ep.evalprocessid = eval.id "
							+ "   AND ep.evalprocessid = :evalprocessid ";
					
					if (evalprocperiodid != null) {
						QueryTotal = SentenciaBase + " AND ep.id= :evalprocperiodid ";
					}else {
						QueryTotal = SentenciaBase;
					}
					
					System.out.println(QueryTotal);
					query = entityManager.createNativeQuery(QueryTotal);
					query.setParameter("evalprocessid", evalprocessid);
					if (evalprocperiodid != null) {
						query.setParameter("evalprocperiodid", evalprocperiodid);
					}
					cuantosregistro = (long) query.getResultList().size();
					query.setFirstResult(offsetIn);
					query.setMaxResults(numofrecordsIn);
					List<Object[]> resultados = query.getResultList();
					
					String QueryPeriod = "SELECT CAST(elem AS TEXT) " 
					        + "	FROM main.params pa, "
							+ "	jsonb_array_elements(CAST(pa.value AS jsonb)) AS elem "
							+ "	WHERE pa.paramname = 'EVALPROC_PERIOD' ";

					String QueryScale = "SELECT CAST(elem AS TEXT) " 
					        + "	FROM main.params pa, "
							+ "	jsonb_array_elements(CAST(pa.value AS jsonb)) AS elem "
							+ "	WHERE pa.paramname = 'EVALPROC_SCALEPER' ";
					
					EntryPeriodoCriticoDto entryPeriodoCriticoDto = new EntryPeriodoCriticoDto();
					EntryPeriodoCriticoDto2 entryPeriodoCriticoDto2 = new EntryPeriodoCriticoDto2();
					
					StatusDto status = new StatusDto();
					TimetableDto timetableDto = new TimetableDto();
					DaysDto daysDto = new DaysDto();
					List<DaysDto> daysDtoList = new ArrayList();
					MonthsDto monthsDto = new MonthsDto();
					List<MonthsDto> monthsDtoList = new ArrayList();
					
					ScaleResponseDto scaleResponseDto = new ScaleResponseDto();
					PeriodsResponseDto periodsResponseDto = new PeriodsResponseDto();
					List<ScaleResponseDto> scaleResponseDtoList = new ArrayList();
					List<PeriodsResponseDto> periodsResponseDtoList = new ArrayList();
					List<StatusDto> statusDtoList = new ArrayList();
					
					query2 = entityManager.createNativeQuery(QueryPeriod);
					List<Object[]> resultadosPeriod = query2.getResultList();
					
					JSONObject jsonObject;
					String jsonStringPeriod = "";
					if (resultadosPeriod.size() > 0) {
						for (Object period : resultadosPeriod) {
							jsonStringPeriod = (String) period; // Recupera el JSON como String
							jsonObject = new JSONObject(jsonStringPeriod); // Convierte String a JSONObject
							// Extrae los valores del JSONObject
							String dsc = jsonObject.getString("dsc");
							String value = jsonObject.getString("value");

							periodsResponseDto.setDsc(dsc);
							periodsResponseDto.setValue(value);
							periodsResponseDtoList.add(periodsResponseDto);
							periodsResponseDto = new PeriodsResponseDto();
						}
					}
					
					query3 = entityManager.createNativeQuery(QueryScale);
					List<Object[]> resultadosScale= query3.getResultList();
					
					String jsonStringScale = "";
					if (resultadosScale.size() > 0) {
						for (Object scale : resultadosScale) {
							jsonStringScale = (String) scale; // Recupera el JSON como String
							jsonObject = new JSONObject(jsonStringScale); // Convierte String a JSONObject
							// Extrae los valores del JSONObject
							String dsc = jsonObject.getString("dsc");
							String value = jsonObject.getString("value");

							scaleResponseDto.setDsc(dsc);
							scaleResponseDto.setValue(value);
							scaleResponseDtoList.add(scaleResponseDto);
							scaleResponseDto = new ScaleResponseDto();
						}
					}
					
					Integer filter=0;
					Integer periodo=0;
					if (cuantosregistro > 0) {
						for (Object[]
								fila : resultados) {
							entryPeriodoCriticoDto2.setId((Integer) fila[0]);
							status.setId((Integer) fila[1]);
							status.setName((String) fila[2]);
							statusDtoList.add(status);
							
							String timetableJsonStr = (String) fila[4];
							
							// Reemplazar comillas simples por comillas dobles
						    String correctedTimetableJsonStr = timetableJsonStr.replace("'", "\"");

						    try {
						        List<TimetableDto> timetableDtos = objectMapper.readValue(correctedTimetableJsonStr, new TypeReference<List<TimetableDto>>() {});
						        entryPeriodoCriticoDto2.setTimetable(timetableDtos);
						    } catch (IOException e) {
						    	entryPeriodoCriticoDto2.setTimetable(Collections.emptyList());
						        e.printStackTrace(); // Log the error
						    }
						    
							entryPeriodoCriticoDto2.setStatus(status);
							daysDto.setMon((String) fila[5]);
							daysDto.setTue((String) fila[6]);
							daysDto.setWed((String) fila[7]);
							daysDto.setThu((String) fila[8]);
							daysDto.setFri((String) fila[9]);
							daysDto.setSat((String) fila[10]);
							daysDto.setSun((String) fila[11]);
							
							monthsDto.setJan((String) fila[12]);
							monthsDto.setFeb((String) fila[13]);
							monthsDto.setMar((String) fila[14]);
							monthsDto.setApr((String) fila[15]);
							monthsDto.setMay((String) fila[16]);
							monthsDto.setJun((String) fila[17]);
							monthsDto.setJul((String) fila[18]);
							monthsDto.setAug((String) fila[19]);
							monthsDto.setSep((String) fila[20]);
							monthsDto.setOct((String) fila[21]);
							monthsDto.setNov((String) fila[22]);
							monthsDto.setDec((String) fila[23]);
							
							entryPeriodoCriticoDto2.setNotes((String) fila[24]);
							entryPeriodoCriticoDto2.setDays(daysDto);
							entryPeriodoCriticoDto2.setMonths(monthsDto);
							status = new StatusDto();
							timetableDto = new TimetableDto();
							daysDto = new DaysDto();
							monthsDto = new MonthsDto();
							
						}
					
						entryPeriodoCriticoDto2.setPeriods(periodsResponseDtoList);
						entryPeriodoCriticoDto2.setScale(scaleResponseDtoList);
						entryPeriodoCriticoDto.setEntry(entryPeriodoCriticoDto2);
						entryPeriodoCriticoDto.setSessionvalidthru(fechaComoCadena);
						
						
					}else {
						entryPeriodoCriticoDto2.setId(0);
						status.setId(0);
						status.setName("Abierta");
						statusDtoList.add(status);
						entryPeriodoCriticoDto2.setStatus(status);
						TimetableDto time = new TimetableDto();
						time.setFrom("");
						time.setName("");
						time.setTo("");
						List<TimetableDto> timetableDtos = new ArrayList();
						timetableDtos.add(time);
						entryPeriodoCriticoDto2.setTimetable(timetableDtos);
						daysDto.setMon("");
						daysDto.setTue("");
						daysDto.setWed("");
						daysDto.setThu("");
						daysDto.setFri("");
						daysDto.setSat("");
						daysDto.setSun("");
						
						monthsDto.setJan("");
						monthsDto.setFeb("");
						monthsDto.setMar("");
						monthsDto.setApr("");
						monthsDto.setMay("");
						monthsDto.setJun("");
						monthsDto.setJul("");
						monthsDto.setAug("");
						monthsDto.setSep("");
						monthsDto.setOct("");
						monthsDto.setNov("");
						monthsDto.setDec("");
						entryPeriodoCriticoDto2.setNotes("");
						entryPeriodoCriticoDto2.setDays(daysDto);
						entryPeriodoCriticoDto2.setMonths(monthsDto);
						
						entryPeriodoCriticoDto2.setPeriods(periodsResponseDtoList);
						entryPeriodoCriticoDto2.setScale(scaleResponseDtoList);
						entryPeriodoCriticoDto.setEntry(entryPeriodoCriticoDto2);
						entryPeriodoCriticoDto.setSessionvalidthru(fechaComoCadena);
					}
						
						return new ResponseEntity(entryPeriodoCriticoDto, 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({"/evalprocesses/{evalprocessid}/periods", "/evalprocesses/{evalprocessid}/periods/{evalprocperiodid}"})
	public ResponseEntity<?> actualizarPeriodo(HttpServletRequest request,
			@RequestBody EvalprocperiodActualizarDto evalprocperiodActualizarDto,
			@PathVariable("evalprocessid") final Integer evalprocessid,
			@PathVariable(name = "evalprocperiodid", required = false) final Integer evalprocperiodid) 
					throws ParseException {
		RespuestaMsgDto respuesta = new RespuestaMsgDto("");
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		long cuantosregistro = 0;

		String sessionid = request.getHeader("Authorization");
		Date fecha = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dataFormattata = formatter.format(fecha);
		AuditRequestDto auditDto = new AuditRequestDto();
		
		String contentIn = "";
		int orderIn = 0;
		int offsetIn = 0;
		int numofrecordsIn = 0;
		int rolisvalid = 0;

		Date fecha3 = new Date();
		SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dataFormattata2 = formatter.format(fecha3);
		Date fechaDate2 = formatter.parse(dataFormattata2);
		
		Optional<Params> deSessDuration = paramsRepository.findByParamname("SESSION_DURATION");
		String SessionDuration = deSessDuration.get().getValue();
		int duracionSession = Integer.parseInt(SessionDuration);
		Date fecha2 = new Date();
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(fecha2); // tuFechaBase es un Date;
		// calendar.add(Calendar.MINUTE, minutosASumar); //minutosASumar es int.
		calendar.add(Calendar.MINUTE, duracionSession); // horasASumar es int.
		// lo que más quieras sumar
		Date ValidThrufechaSalida = calendar.getTime(); // Y ya tienes la fecha sumada.
		SimpleDateFormat salida = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // 2024-12-23 23:00
		String fechaComoCadena = salida.format(ValidThrufechaSalida);
		System.out.println(fechaComoCadena);
		
		// Verifico la session
		if (sessionid == null) {
			respuesta.setMsg("Llamada al servicio malformado");
			estatus = HttpStatus.BAD_REQUEST;
			return new ResponseEntity(respuesta, estatus);
		} else {
			
			int statusCampaigns =campaignsRepository.findStatusCampaignByProcessId(evalprocessid);
			 
			 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);
			// 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(), 201);
				if (rolisvalid == 0) {
					respuesta.setMsg("No tiene los Privilegios");
					estatus = HttpStatus.FORBIDDEN;
					return new ResponseEntity(respuesta, estatus);
				}

				/*if (evalprocperiodActualizarDto.getEvalprocrtoperiodpar()==null || 
					evalprocimpactsActualizarDto.getRtocustomerpar()=="" ||
					evalprocimpactsActualizarDto.getRtofinantialpar()=="" ||
					evalprocimpactsActualizarDto.getRtolegalpar()=="" ||
					evalprocimpactsActualizarDto.getRtooperativepar()=="" ||
					evalprocimpactsActualizarDto.getRtoreputationalpar()=="" ||
					evalprocimpactsActualizarDto.getRtoqty()==null ||
					evalprocimpactsActualizarDto.getStatus()==null) {
					respuesta.setMsg("Llamada al servicio malformado");
					estatus = HttpStatus.BAD_REQUEST;
					return new ResponseEntity(respuesta, estatus);
				}*/
				//Verifico si existe el id de la Evaluaciòn del proceso
				Optional<Evalprocesses> obtproceso=evalprocessesRepository.findById(evalprocessid);	    
				Evalprocperiods evalprocperiods=new Evalprocperiods();
			    //Verifico si encontre el proceso
			    if (!obtproceso.isPresent()) {
			    	respuesta.setMsg("Registro no encontrado");
					return new ResponseEntity(respuesta, HttpStatus.NOT_FOUND);
			    }
			    
			    String module,Descmodule="";
			    
				
				if (evalprocperiodid!=0) {//actualizar periodo
					try {
						//verifico si tiene el privilegio
						rolisvalid =	auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 201); 
						if (rolisvalid == 0) {
							respuesta.setMsg("No tiene los Privilegios"); 
							estatus = HttpStatus.FORBIDDEN;
							return new ResponseEntity(respuesta, estatus); 
						}	
							 
						//Verifico si existe el id de la Evaluaciòn del proceso
					    Optional<Evalprocperiods> obtPeriodo=evalprocperiodsRepository.findByEvalprocessidPeriodsid(evalprocessid,evalprocperiodid);
					    Evalprocperiods evalprocperiods2=new Evalprocperiods();
					    Evalprocperiods evalprocperiods3=new Evalprocperiods();
					    Evalprocesses evalprocesses=new Evalprocesses();
					    //Verifico si encontre el proceso
					    if (!obtPeriodo.isPresent()) {
					    	respuesta.setMsg("Registro no encontrado");
							return new ResponseEntity(respuesta, HttpStatus.NOT_FOUND);
					    }
					    
					    Optional<Evalprocesses> obtproceso2=evalprocessesRepository.findById(evalprocessid);
					    evalprocesses=obtproceso2.get();
					    //Vamos actualizar 
					    evalprocperiods2=obtPeriodo.get();
					    evalprocperiods2.setTimetable(evalprocperiodActualizarDto.getTimetable());
					    evalprocperiods2.setD1evalprocscalepar(evalprocperiodActualizarDto.getD1evalprocscalepar());
					    evalprocperiods2.setD2evalprocscalepar(evalprocperiodActualizarDto.getD2evalprocscalepar());
					    evalprocperiods2.setD3evalprocscalepar(evalprocperiodActualizarDto.getD3evalprocscalepar());
					    evalprocperiods2.setD4evalprocscalepar(evalprocperiodActualizarDto.getD4evalprocscalepar());
					    evalprocperiods2.setD5evalprocscalepar(evalprocperiodActualizarDto.getD5evalprocscalepar());
					    evalprocperiods2.setD6evalprocscalepar(evalprocperiodActualizarDto.getD6evalprocscalepar());
					    evalprocperiods2.setD7evalprocscalepar(evalprocperiodActualizarDto.getD7evalprocscalepar());
					    evalprocperiods2.setM1evalprocscalepar(evalprocperiodActualizarDto.getM1evalprocscalepar());
					    evalprocperiods2.setM2evalprocscalepar(evalprocperiodActualizarDto.getM2evalprocscalepar());
					    evalprocperiods2.setM3evalprocscalepar(evalprocperiodActualizarDto.getM3evalprocscalepar());
					    evalprocperiods2.setM4evalprocscalepar(evalprocperiodActualizarDto.getM4evalprocscalepar());
					    evalprocperiods2.setM5evalprocscalepar(evalprocperiodActualizarDto.getM5evalprocscalepar());
					    evalprocperiods2.setM6evalprocscalepar(evalprocperiodActualizarDto.getM6evalprocscalepar());
					    evalprocperiods2.setM7evalprocscalepar(evalprocperiodActualizarDto.getM7evalprocscalepar());
					    evalprocperiods2.setM8evalprocscalepar(evalprocperiodActualizarDto.getM8evalprocscalepar());
					    evalprocperiods2.setM9evalprocscalepar(evalprocperiodActualizarDto.getM9evalprocscalepar());
					    evalprocperiods2.setM10evalprocscalepar(evalprocperiodActualizarDto.getM10evalprocscalepar());
					    evalprocperiods2.setM11evalprocscalepar(evalprocperiodActualizarDto.getM11evalprocscalepar());
					    evalprocperiods2.setM12evalprocscalepar(evalprocperiodActualizarDto.getM12evalprocscalepar());
					    evalprocperiods2.setNotes(evalprocperiodActualizarDto.getNotes());
					    evalprocperiods2.setModifiedat(fechaDate2);
					    evalprocperiodsRepository.save(evalprocperiods2);
					   
					    //Auditoría
					     module = "Evaluación de Procesos de Períodos Críticos";
					     Descmodule = "Se actualizó la Evaluación de Procesos de Periodos Críticos: " + evalprocperiodid;
						 auditDto.setIpaddr(HttpReqRespUtils.getClientIpAddressIfServletRequestExist());
						 String singo1 = "(";
						 String singo2 = ")";
						 String usryemail = encontreSessionUsuario.get().getUsr().concat(" ").concat(singo1)
									.concat(encontreSessionUsuario.get().getEmail().concat(singo2));
						 auditDto.setUserref(usryemail);
						 auditDto.setModule(module);
						 auditDto.setDesc(Descmodule);
						 auditDto.setCreatedat(fechaDate2);
						 usersService.registrarAuditSesion(auditDto);
						 
						 RespuestaValueDto respuestaValueDto = new RespuestaValueDto(evalprocperiodid); 
						 URI location = URI.create("/evalprocesses/"+evalprocessid+"/periods/"+evalprocperiodid); // O la URL correcta para // tu recurso
						 
						 return ResponseEntity.created(location).body(respuestaValueDto);
						 
					}catch(Exception e) {
							respuesta.setMsg("Error interno del servidor " + e.getMessage());
							estatus = HttpStatus.INTERNAL_SERVER_ERROR;
					}finally {
				        if (entityManager != null && entityManager.isOpen()) {
				            entityManager.close();
				        }
					} 
			    }else {
			    	try {
						//verifico si tiene el privilegio
						rolisvalid =	auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 202); 
						if (rolisvalid == 0) {
							respuesta.setMsg("No tiene los Privilegios"); 
							estatus = HttpStatus.FORBIDDEN;
							return new ResponseEntity(respuesta, estatus); 
						}	
						
						Optional<Evalprocperiods> evalprocperiod = evalprocperiodsRepository.findByEvalprocessid(evalprocessid);
							 
						if (evalprocperiod.isPresent()) {
							respuesta.setMsg("Ya existe una Evaluación de Proceso de Períodos Criticos"); 
							estatus = HttpStatus.FORBIDDEN;
							return new ResponseEntity(respuesta, estatus); 
						}
						
						Evalprocperiods evalprocperiods2=new Evalprocperiods();
						Evalprocperiods evalprocperiods3=new Evalprocperiods();
						Evalprocesses evalprocesses=new Evalprocesses();
						Optional<Evalprocesses> obtproceso2=evalprocessesRepository.findById(evalprocessid);
					    evalprocesses=obtproceso2.get();
					    
					    evalprocperiods2.setEvalprocessid(evalprocesses);
					    evalprocperiods2.setTimetable(evalprocperiodActualizarDto.getTimetable());
					    evalprocperiods2.setD1evalprocscalepar(evalprocperiodActualizarDto.getD1evalprocscalepar());
					    evalprocperiods2.setD2evalprocscalepar(evalprocperiodActualizarDto.getD2evalprocscalepar());
					    evalprocperiods2.setD3evalprocscalepar(evalprocperiodActualizarDto.getD3evalprocscalepar());
					    evalprocperiods2.setD4evalprocscalepar(evalprocperiodActualizarDto.getD4evalprocscalepar());
					    evalprocperiods2.setD5evalprocscalepar(evalprocperiodActualizarDto.getD5evalprocscalepar());
					    evalprocperiods2.setD6evalprocscalepar(evalprocperiodActualizarDto.getD6evalprocscalepar());
					    evalprocperiods2.setD7evalprocscalepar(evalprocperiodActualizarDto.getD7evalprocscalepar());
					    evalprocperiods2.setM1evalprocscalepar(evalprocperiodActualizarDto.getM1evalprocscalepar());
					    evalprocperiods2.setM2evalprocscalepar(evalprocperiodActualizarDto.getM2evalprocscalepar());
					    evalprocperiods2.setM3evalprocscalepar(evalprocperiodActualizarDto.getM3evalprocscalepar());
					    evalprocperiods2.setM4evalprocscalepar(evalprocperiodActualizarDto.getM4evalprocscalepar());
					    evalprocperiods2.setM5evalprocscalepar(evalprocperiodActualizarDto.getM5evalprocscalepar());
					    evalprocperiods2.setM6evalprocscalepar(evalprocperiodActualizarDto.getM6evalprocscalepar());
					    evalprocperiods2.setM7evalprocscalepar(evalprocperiodActualizarDto.getM7evalprocscalepar());
					    evalprocperiods2.setM8evalprocscalepar(evalprocperiodActualizarDto.getM8evalprocscalepar());
					    evalprocperiods2.setM9evalprocscalepar(evalprocperiodActualizarDto.getM9evalprocscalepar());
					    evalprocperiods2.setM10evalprocscalepar(evalprocperiodActualizarDto.getM10evalprocscalepar());
					    evalprocperiods2.setM11evalprocscalepar(evalprocperiodActualizarDto.getM11evalprocscalepar());
					    evalprocperiods2.setM12evalprocscalepar(evalprocperiodActualizarDto.getM12evalprocscalepar());
					    evalprocperiods2.setNotes(evalprocperiodActualizarDto.getNotes());
					    evalprocperiods2.setModifiedat(fechaDate2);
					    evalprocperiods2.setCreatedat(fechaDate2);
					    
					    evalprocperiods3=evalprocperiodsRepository.save(evalprocperiods2);
					   
					    
					    //Auditoría
					    module = "Evaluación de Procesos de Períodos Críticos";
					    Descmodule = "Se agregó la Evaluación de Procesos de Períodos Críticos: " + evalprocperiods3.getId();
						auditDto.setIpaddr(HttpReqRespUtils.getClientIpAddressIfServletRequestExist());
						String singo1 = "(";
						String singo2 = ")";
						String usryemail = encontreSessionUsuario.get().getUsr().concat(" ").concat(singo1)
									.concat(encontreSessionUsuario.get().getEmail().concat(singo2));
						auditDto.setUserref(usryemail);
						auditDto.setModule(module);
						auditDto.setDesc(Descmodule);
						auditDto.setCreatedat(fechaDate2);
						usersService.registrarAuditSesion(auditDto);
						 
						RespuestaValueDto respuestaValueDto = new RespuestaValueDto(evalprocperiods3.getId()); 
						URI location = URI.create("/evalprocesses/"+evalprocessid+"/periods/"+evalprocperiods3.getId()); // O la URL correcta para // tu recurso
						 
						return ResponseEntity.created(location).body(respuestaValueDto);
						    
					}catch(Exception e) {
							respuesta.setMsg("Error interno del servidor " + e.getMessage());
							estatus = HttpStatus.INTERNAL_SERVER_ERROR;
					}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);
		}
	}
}
