package com.dacrt.SBIABackend.security.controler;

import java.text.ParseException;
import java.text.SimpleDateFormat;
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.TypedQuery;
import javax.servlet.http.HttpServletRequest;

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.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.dacrt.SBIABackend.security.dto.AuditRequestDto;
import com.dacrt.SBIABackend.security.dto.MenuDto;
import com.dacrt.SBIABackend.security.dto.MenuResponseDto;
import com.dacrt.SBIABackend.security.dto.RespuestaDto;
import com.dacrt.SBIABackend.security.dto.RespuestaMsgDto;
import com.dacrt.SBIABackend.security.entity.Audit;
import com.dacrt.SBIABackend.security.entity.Params;
import com.dacrt.SBIABackend.security.entity.Users;
import com.dacrt.SBIABackend.security.repository.ParamsRepository;
import com.dacrt.SBIABackend.security.repository.UsersRepository;
import com.dacrt.SBIABackend.security.service.MenuService;
import com.dacrt.SBIABackend.security.service.SecurityService;

@RestController
@RequestMapping("/home")
@CrossOrigin(origins = "*")
//@CrossOrigin(origins = "")
public class MenuControler {
	@Autowired
	MenuService menuService;

	@Autowired
	private ParamsRepository paramsRepository;

	@Autowired
	private UsersRepository usersRepository;
	
	@PersistenceContext
	private EntityManager entityManager;
	
	@Autowired
	private SecurityService securityService;

	Logger logger = LoggerFactory.getLogger(MenuControler.class);
	// @RequestBody final Users email

	// @GetMapping("/menus)
	// public ResponseEntity<MenuResponseDto> menu(@PathVariable final String
	// sessionid) throws ParseException {
	@GetMapping("/menus")
	public ResponseEntity<MenuResponseDto> menu(HttpServletRequest request) throws ParseException {

		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();
      
		// Obtener el menu segùn la sesiòn del usuario
		// private static final String AUTHORIZATION_HEADER = "Authorization";
		try {

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

				sessionid = sessionid.substring(7);
				Optional<Users> encontreSessionUsuario = usersRepository.getBySessionid(sessionid);
				if (encontreSessionUsuario.isPresent()) { // si la sesión del usuario existe
					
					
					String fechaComoCadena;
					Date fecha2 = new Date();
					   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=="") {
							   
							   
						    	RespuestaMsgDto respuestaDto2;
							    String var2 = "";
								boolean bloked2 = false;
								respuestaDto2 = new RespuestaMsgDto(var2);
								//respuestaDto.setBlocked(bloked);
								respuestaDto2.setMsg("Sesión expirada o inválida"); 
								return new ResponseEntity(respuestaDto2, HttpStatus.UNAUTHORIZED);
							   
						    }
			  }
		  	}
			/*
			 * if (sessionid.isBlank()) { String var = ""; boolean bloked = false;
			 * RespuestaDto respuestaDto = new RespuestaDto(var, bloked);
			 * respuestaDto.setBlocked(bloked);
			 * respuestaDto.setMsg("Llamada al servicio malformado"); //Error 400 return new
			 * ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST); }
			 */

			if (menuService.getMenu(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.UNAUTHORIZED);

			}
			// Obtener el menu segùn la sesiòn del usuario

		} catch (Exception e) {
			String var = e.getMessage();
			boolean bloked = false;
			RespuestaDto respuestaDto = new RespuestaDto(var, bloked);
			respuestaDto.setBlocked(bloked);
			respuestaDto.setMsg("Error interno del servidor");
			respuestaDto.setMsg(var);

			return new ResponseEntity(respuestaDto, HttpStatus.INTERNAL_SERVER_ERROR);
		}

		Optional<Users> encontreSessionUsuario = usersRepository.getBySessionid(sessionid);

		// String singo1 = "(";
		// String singo2 = ")";
		// String usryemail =
		// encontreSessionUsuario.get().getUsr().concat("").concat(singo1).concat(encontreSessionUsuario.get().getEmail().concat(singo2));
		// auditDto.setUserref(usryemail);
		// Guardar en la tabla de auditoria
		// Audit audit = new Audit(fecha,"/Audit","Acceso al Menu de GCN -
		// OK",auditDto.getIpaddr(),usryemail);
		
		
		
		return ResponseEntity.ok(menuService.getMenu(sessionid));

	}
}
