package com.dacrt.SBIABackend.controler;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
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.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
import java.util.ArrayList;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import javax.servlet.http.HttpServletRequest;

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.dao.DataAccessException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.validation.BindingResult;
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.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.dacrt.SBIABackend.dto.ChannelDto;
import com.dacrt.SBIABackend.dto.ChannelsDtoStatus;
import com.dacrt.SBIABackend.dto.Mensaje;
import com.dacrt.SBIABackend.dto.ResourcesDto;
import com.dacrt.SBIABackend.dto.ResourcesResponseDto2;
import com.dacrt.SBIABackend.dto.ResourcesStatusDto;
import com.dacrt.SBIABackend.dto.StatusDto;
import com.dacrt.SBIABackend.dto.SuppliersDto;
import com.dacrt.SBIABackend.dto.SuppliersDtoStatus;
import com.dacrt.SBIABackend.dto.UnitsDto;
import com.dacrt.SBIABackend.dto.UnitsUsersDto;
import com.dacrt.SBIABackend.dto.requestDto.ResourcesRequestDto;
import com.dacrt.SBIABackend.dto.requestDto.WorkersRequestBodyDto;
import com.dacrt.SBIABackend.dto.responseDto.ChannelsResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.ResourcesEntryRespondeDto;
import com.dacrt.SBIABackend.dto.responseDto.ResourcesResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.SuppliersRespondeDto;
import com.dacrt.SBIABackend.entity.Positions;
import com.dacrt.SBIABackend.entity.Resources;
import com.dacrt.SBIABackend.entity.Suppliers;
import com.dacrt.SBIABackend.entity.Units;
import com.dacrt.SBIABackend.entity.Userunits;
import com.dacrt.SBIABackend.entity.Workers;
import com.dacrt.SBIABackend.repository.ResourceRepository;
import com.dacrt.SBIABackend.repository.SuppliersRepository;
import com.dacrt.SBIABackend.repository.UnitsRepository;
import com.dacrt.SBIABackend.security.dto.AuditAllDto;
import com.dacrt.SBIABackend.security.dto.AuditRequestDto;
import com.dacrt.SBIABackend.security.dto.EntryDto;
import com.dacrt.SBIABackend.security.dto.ParamsDto;
import com.dacrt.SBIABackend.security.dto.ParamsResponseDto;
import com.dacrt.SBIABackend.security.dto.PrivilegesAllDto;
import com.dacrt.SBIABackend.security.dto.PrivilegesDto;
import com.dacrt.SBIABackend.security.dto.RespuestaDto;
import com.dacrt.SBIABackend.security.dto.RespuestaMsgDto;
import com.dacrt.SBIABackend.security.dto.RespuestaValueDto;
import com.dacrt.SBIABackend.security.dto.RoleDto;
import com.dacrt.SBIABackend.security.dto.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.UserListDto;
import com.dacrt.SBIABackend.security.dto.UsersListDto;
import com.dacrt.SBIABackend.security.dto.UsersUnitDto;
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.enums.RolNombre;
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.RolesRepository;
import com.dacrt.SBIABackend.security.repository.UsersRepository;
import com.dacrt.SBIABackend.security.service.RolesService;
import com.dacrt.SBIABackend.security.service.SecurityService;
import com.dacrt.SBIABackend.security.service.MenuService;
import com.dacrt.SBIABackend.security.service.ParamsService;
import com.dacrt.SBIABackend.security.service.UsersService;
import com.dacrt.SBIABackend.service.ResourcesService;
import com.dacrt.SBIABackend.service.SuppliersService;
import com.dacrt.SBIABackend.service.WorkersService;
import com.dacrt.SBIABackend.utils.HttpReqRespUtils;

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

	@Autowired
	private ParamsRepository paramsRepository;

	@Autowired
	private UsersRepository usersRepository;

	@Autowired
	private AuditRepository auditRepository;

	@Autowired
	private ResourceRepository resourceRepository;

	@Autowired
	private RolesPrivilegesRepository rolesPrivilegesRepository;

	@Autowired
	UsersService usersService;

	@Autowired
	ParamsService paramsService;

	@Autowired
	ResourcesService resourcesService;

	@Autowired
	SecurityService securityService;

	@Autowired
	MenuService menuService;

	@Autowired
	private JdbcTemplate jdbcTemplate;

	@PersistenceContext
	private EntityManager entityManager;

	@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("/menus)
	// public ResponseEntity<MenuResponseDto> menu(@PathVariable final String
	// sessionid) throws ParseException {
	@PostMapping("/resources")
	public ResponseEntity<?> resources(HttpServletRequest request, @RequestBody UsersListDto tiposfiltros)
			throws ParseException {
		RespuestaDto respuesta = new RespuestaDto("", false);
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		// ChannelsResponseDto channelsResponseDto = new ChannelsResponseDto();
		ResourcesResponseDto resourcesResponseDto = new ResourcesResponseDto();
		ResourcesResponseDto2 resourcesResponseDto2 = new ResourcesResponseDto2();

		// ParamsDto detalleParams;
		// ChannelDto detalleSuppliers;
		ResourcesDto detalleResources;
		StatusDto detalleStatus;
		PrivilegesAllDto 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();

		int idrol;
		String searchIn = "";
		String contentIn = "";
		// String searchModule = "";
		int searchStatus = 0;
		int formatList = 0;
		String fechaComoCadena;
		int orderIn = 0;
		int offsetIn = 0;
		int numofrecordsIn = 0;
		Date fecha2 = new Date();

		if (sessionid == null) {
			String var = "";
			boolean bloked = false;
			RespuestaDto respuestaDto = new RespuestaDto(var, bloked);
			respuestaDto.setBlocked(bloked);
			respuestaDto.setMsg("Sesión expirada o inválida");
			// Error 400
			return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
		} else {

			sessionid = sessionid.substring(7);
			Optional<Users> encontreSessionUsuario = usersRepository.getBySessionid(sessionid);
			// String usuarioIN = encontreSessionUsuario.get().getUsr();
			// int position = usuarioIN.indexOf('(');

			if (encontreSessionUsuario.isPresent()) {

				Date FechaReg = encontreSessionUsuario.get().getValidthru();

				// fechaComoCadena = securityService.consultarSessionActiva(FechaReg,fecha2);
				fechaComoCadena = securityService.consultarSessionActiva(FechaReg, fecha2,
						encontreSessionUsuario.get().getId());

				if (fechaComoCadena == "") {

					String var = "";
					boolean bloked = false;
					RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
					// respuestaDto.setBlocked(bloked);
					respuestaDto.setMsg("Sesión expirada o inválida");
					return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);

				}

				// Este proceso permite obtener un listado de los procesos. (Priv 120)
				formatList = tiposfiltros.getFormat();
				int rolisvalid = 0;
				Roles roles = encontreSessionUsuario.get().getRolid();
				idrol = roles.getId();
				rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 470);
				if (formatList != 2) {
					if (rolisvalid == 0) {
						respuesta.setMsg("No tiene los Privilegios");
						estatus = HttpStatus.FORBIDDEN;
						return new ResponseEntity(respuesta, estatus);
					}
				}

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

			// Sentencia General

			String SentenciaBase = "SELECT new com.dacrt.SBIABackend.dto.ResourcesStatusDto (u.id,u.name,u.status,CASE WHEN u.status = 1 then 'Activo' ELSE 'Inactivo' END AS estatus,u.dsc) FROM Resources u";

			String QueryTotal = "";
			String name = "u.name";
			String status = "u.status";
			String descr = "u.dsc";
			String lowername = "LOWER(u.name)";
			String LowerSearch = searchIn.toLowerCase();

			switch (searchIn) {
			case "": // viene sin busqueda por el like
				// QueryTotal = SentenciaBase;
				// QueryTotal = SentenciaBase + " WHERE " + lowername + " LIKE " + "'%" + "" +
				// "%'";
				QueryTotal = SentenciaBase + " WHERE TRUE = TRUE";
				break;

			default: // viene con el parametro para buscar por el like
				QueryTotal = SentenciaBase + " WHERE " + lowername + " LIKE  " + "'%" + LowerSearch + "%'";

			}

			switch (searchStatus) {
			case 0: // Busca por cualquier estatus
				QueryTotal = QueryTotal;
				break;
			case 1: // Busca por estatus activo

				QueryTotal = QueryTotal + " AND " + status + " = " + searchStatus;
				break;
			case 2: // Busca por estatus Inactivo

				// QueryTotal = QueryTotal + " AND " + status + " = " + searchStatus;
				QueryTotal = QueryTotal + " AND " + status + " = " + 0;
				break;

			default: // viene con el parametro para buscar por el like
				String var2 = "";
				boolean bloked = false;
				RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
				respuestaDto = new RespuestaMsgDto("Error interno del servidor");
				estatus = HttpStatus.INTERNAL_SERVER_ERROR;
				return new ResponseEntity(respuestaDto, estatus);

			}

			TypedQuery<ResourcesStatusDto> channelsCount = entityManager.createQuery(QueryTotal,
					ResourcesStatusDto.class);
			cuantosregistro = (long) channelsCount.getResultList().size();

			String ordena = "";
			if (orderIn == 1 || orderIn == 2 || orderIn == 3 || orderIn == 99) {
				ordena = " ASC";
			} else if (orderIn == -1 || orderIn == -2 || orderIn == -3 || orderIn == -99) {
				ordena = " DESC";
			} 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);
			}

			int absolutoOrden = Math.abs(orderIn);

			switch (absolutoOrden) {
			case 1: // ordena por name ascendente

				QueryTotal = QueryTotal + " ORDER BY " + name + ordena;
				break;
			case 2:// ordena por status ascendente

				QueryTotal = QueryTotal + " ORDER BY " + status + ordena;
				break;
			case 3:// ordena por status ascendente

				QueryTotal = QueryTotal + " ORDER BY " + descr + 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);

			}

			// Se mapea la entidad se le pasa el query y lo bota como un tipo de objeto
			// ParamDto-Buscar en los DTO
			TypedQuery<ResourcesStatusDto> channels = entityManager.createQuery(QueryTotal, ResourcesStatusDto.class);
			if (formatList != 2) {
				channels.setFirstResult(offsetIn);
				channels.setMaxResults(numofrecordsIn);
			}

			List<ResourcesStatusDto> listacompleta = channels.getResultList();

			List<ResourcesDto> listasSuppliers = new ArrayList<>();
			detalleResources = new ResourcesDto();
			// Se de be hacer el ciclo para poder llenar el objeto de la descripcion del
			// estatus
			if (formatList != 2) {
				for (ResourcesStatusDto suppliers : listacompleta) {
					detalleResources = new ResourcesDto();

					detalleStatus = new StatusDto();
					detalleResources.setId(suppliers.getId());
					detalleResources.setName(suppliers.getName());
					detalleResources.setDsc(suppliers.getDsc());
					detalleStatus.setId(suppliers.getStatus());
					detalleStatus.setName(suppliers.getEstatus());
					detalleResources.setStatus(detalleStatus);

					// detalleSuppliers.setStatus(detalleStatus);

					listasSuppliers.add(detalleResources);
				}

				detallePrivilege = new PrivilegesAllDto();
				boolean tieneView = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol, 470);
				boolean tieneUpdate = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol, 471);
				boolean tieneAdd = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol, 472);
				boolean tieneDelete = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol, 473);
				// existsByRolidAndPrivilegeid

				detallePrivilege.setView(tieneView);
				detallePrivilege.setUpdate(tieneUpdate);
				detallePrivilege.setAdd(tieneAdd);
				detallePrivilege.setDelete(tieneDelete);

				resourcesResponseDto.setNumofrecords(cuantosregistro);
				// paramsResponseDto.setValidthru(ValidThrufechaSalida);
				resourcesResponseDto.setSessionvalidthru(fechaComoCadena);
				resourcesResponseDto.setRecords(listasSuppliers);
				resourcesResponseDto.setPrivileges(detallePrivilege);

				return ResponseEntity.ok(resourcesResponseDto);

			} else {
				for (ResourcesStatusDto suppliers : listacompleta) {
					detalleResources = new ResourcesDto();

					detalleStatus = new StatusDto();
					detalleResources.setId(suppliers.getId());
					detalleResources.setName(suppliers.getName());
					detalleResources.setDsc(suppliers.getDsc());
					detalleStatus.setId(suppliers.getStatus());
					detalleStatus.setName(suppliers.getEstatus());
					detalleResources.setStatus(detalleStatus);

					// detalleSuppliers.setStatus(detalleStatus);

					listasSuppliers.add(detalleResources);
				}

				resourcesResponseDto2.setSessionvalidthru(fechaComoCadena);
				resourcesResponseDto2.setRecords(listasSuppliers);
				return ResponseEntity.ok(resourcesResponseDto2);
			}

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

		return new ResponseEntity(respuesta, estatus);

	}

	// resources/resourceid
	@GetMapping("/resources/{resourceid}")
	public ResponseEntity<?> getOneResources(HttpServletRequest request,
			@PathVariable("resourceid") final Integer resourceid) throws ParseException {
		RespuestaDto respuesta = new RespuestaDto("", false);
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		// ChannelsResponseDto channelsResponseDto = new ChannelsResponseDto();
		// ResourcesResponseDto resourcesResponseDto = new ResourcesResponseDto();
		ResourcesEntryRespondeDto resourcesResponseDto = new ResourcesEntryRespondeDto();

		// ParamsDto detalleParams;
		// ChannelDto detalleSuppliers;
		ResourcesDto detalleResources;
		StatusDto detalleStatus;
		PrivilegesAllDto 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();

		int idrol;
		String searchIn = "";
		String contentIn = "";
		// String searchModule = "";
		int searchStatus = 0;
		int formatList = 0;
		String fechaComoCadena;
		int orderIn = 0;
		int offsetIn = 0;
		int numofrecordsIn = 0;
		Date fecha2 = new Date();

		if (sessionid == null) {
			String var = "";
			boolean bloked = false;
			RespuestaDto respuestaDto = new RespuestaDto(var, bloked);
			respuestaDto.setBlocked(bloked);
			respuestaDto.setMsg("Sesión expirada o inválida");
			// Error 400
			return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
		} else {

			sessionid = sessionid.substring(7);
			Optional<Users> encontreSessionUsuario = usersRepository.getBySessionid(sessionid);
			// String usuarioIN = encontreSessionUsuario.get().getUsr();
			// int position = usuarioIN.indexOf('(');

			if (encontreSessionUsuario.isPresent()) {

				Date FechaReg = encontreSessionUsuario.get().getValidthru();

				// fechaComoCadena = securityService.consultarSessionActiva(FechaReg,fecha2);
				fechaComoCadena = securityService.consultarSessionActiva(FechaReg, fecha2,
						encontreSessionUsuario.get().getId());

				if (fechaComoCadena == "") {

					String var = "";
					boolean bloked = false;
					RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
					// respuestaDto.setBlocked(bloked);
					respuestaDto.setMsg("Sesión expirada o inválida");
					return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);

				}

				int rolisvalid = 0;
				Roles roles = encontreSessionUsuario.get().getRolid();
				idrol = roles.getId();
				rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 470);

			} 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 {

			// Sentencia General

			String SentenciaBase = "SELECT new com.dacrt.SBIABackend.dto.ResourcesStatusDto (u.id,u.name,u.status,CASE WHEN u.status = 1 then 'Activo' ELSE 'Inactivo' END AS estatus,u.dsc) "
					+ " FROM Resources u WHERE u.id = " + resourceid;

			String QueryTotal = "";
			String name = "u.name";
			String status = "u.status";
			String descr = "u.dsc";
			String lowername = "LOWER(u.name)";
			String LowerSearch = searchIn.toLowerCase();

			// Se mapea la entidad se le pasa el query y lo bota como un tipo de objeto
			// ParamDto-Buscar en los DTO
			TypedQuery<ResourcesStatusDto> channels = entityManager.createQuery(SentenciaBase,
					ResourcesStatusDto.class);

			List<ResourcesStatusDto> listacompleta = channels.getResultList();

			List<ResourcesDto> listasSuppliers = new ArrayList<>();
			detalleResources = new ResourcesDto();
			// Se de be hacer el ciclo para poder llenar el objeto de la descripcion del
			// estatus

			for (ResourcesStatusDto suppliers : listacompleta) {
				detalleResources = new ResourcesDto();

				detalleStatus = new StatusDto();
				detalleResources.setId(suppliers.getId());
				detalleResources.setName(suppliers.getName());
				detalleResources.setDsc(suppliers.getDsc());
				detalleStatus.setId(suppliers.getStatus());
				detalleStatus.setName(suppliers.getEstatus());
				detalleResources.setStatus(detalleStatus);

				// detalleSuppliers.setStatus(detalleStatus);

				// listasSuppliers.add(detalleResources);
			}

			// resourcesResponseDto2.setSessionvalidthru(fechaComoCadena);
			resourcesResponseDto.setEntry(detalleResources);
			return ResponseEntity.ok(resourcesResponseDto);

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

		return new ResponseEntity(respuesta, estatus);

	}

	@PostMapping("/resources/{resourceid}")
	public ResponseEntity<ParamsResponseDto> ResourcesUpdate(HttpServletRequest request,
			@RequestBody ResourcesRequestDto datosResources, @PathVariable("resourceid") final Integer resourceid)
			throws ParseException {

		RespuestaValueDto respuestaValueDto;
		RespuestaMsgDto respuesta = new RespuestaMsgDto("");
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		ParamsResponseDto paramsResponseDto = new ParamsResponseDto();
		ParamsDto detalleParams;
		PrivilegesDto detallePrivilege;
		List<ParamsDto> listasParams = new ArrayList<>();
		List<PrivilegesDto> listasPrivelege = new ArrayList<>();

		int idparametro = resourceid;

		int valor = idparametro;
		String sessionid = request.getHeader("Authorization");
		Date fecha = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dataFormattata = formatter.format(fecha);
		Date fechaDate = formatter.parse(dataFormattata);
		AuditRequestDto auditDto = new AuditRequestDto();
		Optional<Users> encontreSessionUsuario;
		Date fecha2 = new Date();
		Calendar calendar = Calendar.getInstance();

		if (sessionid == null) {
			String var = "";
			boolean bloked = false;
			RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
			// respuestaDto.setBlocked(bloked);
			respuestaDto.setMsg("Llamada al servicio malformado");
			// Error 400
			return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
		} else {

			sessionid = sessionid.substring(7);
			encontreSessionUsuario = usersRepository.getBySessionid(sessionid);
			String fechaComoCadena;

			if (encontreSessionUsuario.isPresent()) {

				Date FechaReg = encontreSessionUsuario.get().getValidthru();
				// Llamada a la funcion que validad el tiempo de Session, retorna la fecha
				// sumandole el tiempo de session activa, y vacio si no esta activa

				// fechaComoCadena = securityService.consultarSessionActiva(FechaReg,fecha2);
				fechaComoCadena = securityService.consultarSessionActiva(FechaReg, fecha2,
						encontreSessionUsuario.get().getId());
				if (fechaComoCadena == "") {

					String var = "";
					boolean bloked = false;
					RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
					// respuestaDto.setBlocked(bloked);
					respuestaDto.setMsg("Sesión expirada o inválida");
					return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);

				}

				// 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, 472);
					// rolisvalid = 3;
					if (rolisvalid == 0) {

						String var = "";
						boolean bloked = false;
						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
						// respuestaDto.setBlocked(bloked);
						respuestaDto.setMsg("No tiene los Privilegios");
						return new ResponseEntity(respuestaDto, HttpStatus.FORBIDDEN);

					}

				} else {

					Roles roles = encontreSessionUsuario.get().getRolid();
					int idrol = roles.getId();
					int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 471);
					// 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);

					}
				}

				String Salida1 = usersService.verificarCaracteresValidosConRegex(datosResources.getName());
				String Salida2 = usersService.verificarCaracteresValidosConRegex(datosResources.getDsc());

				if (Salida1 == "NOOK" || Salida2 == "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 (datosResources.getName() != "") {

						// boolean existeName = unitsRepository.existsByName(datosUnidad.getName());
						String Query2 = "SELECT name FROM main.resources WHERE LOWER(name) = " + "'"
								+ datosResources.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);
						}
					}

				} else {
					boolean existeResources = resourceRepository.existsById(idparametro);
					if (!existeResources) {
						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 {
				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 {

			// Workers tipoWorkers2=null;
			Resources tipoResources2 = null;

			// Workers tipoWorker=null;
			Resources tipoResources = null;

			// Workers tipoWorkerNew2=null;
			Resources tipoResourcesNew2 = null;

			Optional<Resources> nuevoinsertado = null;
			// Userunits tipoUsersUnits = new Userunits();
			// Unitprocesses tipoUsersUnits = new Unitprocesses();

			if (idparametro == 0) {

				// Workers tipoWorkersNew = new Workers();
				Resources tipoResourceNew = new Resources();

				// Workers
				// datosWorker
				tipoResourceNew.setStatus(datosResources.getStatus());
				tipoResourceNew.setModifiedat(fechaDate);
				tipoResourceNew.setCreatedat(fechaDate);
				tipoResourceNew.setName(datosResources.getName());
				tipoResourceNew.setDsc(datosResources.getDsc() == null ? "" : datosResources.getDsc());

				tipoResourcesNew2 = resourcesService.addIdResources(tipoResourceNew);
				tipoResources2 = tipoResourcesNew2;
				nuevoinsertado = resourceRepository.findByName(datosResources.getName());
				int idInsertado = nuevoinsertado.get().getId();
				int idmensaje = idInsertado;

				////////////////////////// INSERCION BLOQUE DE AUDITORIA///////////////////
				String module = "Recursos";
				// String Descmodule = "Actualización de parametro del Sistema con id: " +
				// parmid ;
				String Descmodule = "Se agregó el recurso: " + datosResources.getName() + " con Id: " + idmensaje;

				auditDto.setIpaddr(HttpReqRespUtils.getClientIpAddressIfServletRequestExist());

				String singo1 = "(";
				String singo2 = ")";
				String usryemail = encontreSessionUsuario.get().getUsr().concat(" ").concat(singo1)
						.concat(encontreSessionUsuario.get().getEmail().concat(singo2));
				auditDto.setUserref(usryemail);
				auditDto.setModule(module);
				auditDto.setDesc(Descmodule);
				auditDto.setCreatedat(fechaDate);
				usersService.registrarAuditSesion(auditDto);

				respuestaValueDto = new RespuestaValueDto(idmensaje);
				estatus = HttpStatus.OK;
				return new ResponseEntity(respuestaValueDto, estatus);

			} else {
				// tipoUsers = usersService.getUsersByid(idparametro);
				/// tipoUnits = workersService.getWorkersByid(idparametro);
				tipoResources = resourcesService.getResourcesByid(idparametro);
				// Positions relaposition =
				// positionsRepository.getById(datosWorker.getPositionid());

				tipoResources.setStatus(datosResources.getStatus());
				// tipoUsers.setUsr(datosUsuario.getUsr());

				String reso1 = tipoResources.getName();
				String reso2 = datosResources.getName();
				if (reso1.equals(reso2)) {
					String Validausers = "El recurso es el mismo";

				} else {

					String QueryTotal = "SELECT name FROM main.resources WHERE LOWER(name) = " + "'"
							+ datosResources.getName().toString().toLowerCase() + "'";
					Long validaResource = (long) jdbcTemplate.queryForList(QueryTotal).size();

					if (validaResource > 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 {
						tipoResources.setName(datosResources.getName());
					}
				}

				// tipoUnits.setDsc(datosUnidad.getDsc());

				tipoResources.setModifiedat(fechaDate);
				tipoResources.setDsc(datosResources.getDsc() == null ? "" : datosResources.getDsc());

				tipoResources2 = resourcesService.addIdResources(tipoResources);

				////////////////////////// INSERCION BLOQUE DE AUDITORIA///////////////////
				String module = "Recursos";
				// String Descmodule = "Actualización de parametro del Sistema con id: " +
				// parmid ;
				String Descmodule = "Se actualizó el recurso: " + datosResources.getName() + " con Id: " + resourceid;

				auditDto.setIpaddr(HttpReqRespUtils.getClientIpAddressIfServletRequestExist());

				String singo1 = "(";
				String singo2 = ")";
				String usryemail = encontreSessionUsuario.get().getUsr().concat(" ").concat(singo1)
						.concat(encontreSessionUsuario.get().getEmail().concat(singo2));
				auditDto.setUserref(usryemail);
				auditDto.setModule(module);
				auditDto.setDesc(Descmodule);
				auditDto.setCreatedat(fechaDate);
				usersService.registrarAuditSesion(auditDto);
				////////////////////////// INSERCION BLOQUE DE AUDITORIA///////////////////
				int idmensaje = resourceid;
				respuestaValueDto = new RespuestaValueDto(idmensaje);
				estatus = HttpStatus.OK;
				return new ResponseEntity(respuestaValueDto, estatus);

			}

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

		return new ResponseEntity(respuesta, estatus);

	}

	@DeleteMapping("/resources/{resourceid}")
	public ResponseEntity<?> borrarResources(HttpServletRequest request,
			@PathVariable("resourceid") final Integer resourceid) 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, 473);
				// 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 (resourceRepository.existsById(resourceid)) {

						Optional<Resources> uniDelete = resourceRepository.findById(resourceid);
						String module = "Recursos";
						String Descmodule = "Se eliminó el recurso: " + uniDelete.get().getName() + " con Id: "
								+ resourceid;

						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);
							resourceRepository.deleteResourcebyid(resourceid);
							respuestaValueDto = new RespuestaValueDto(resourceid);

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

					}

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

			}

		}

	}

}
