package com.dacrt.SBIABackend.security.controler;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Set;

import javax.validation.Valid;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
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.RestController;

import com.dacrt.SBIABackend.dto.Mensaje;
//import com.dacrt.SBIABackend.entity.LineaOperacion;
//import com.dacrt.SBIABackend.entity.Proceso;
import com.dacrt.SBIABackend.security.dto.AccesoDto;
import com.dacrt.SBIABackend.security.dto.RolAccesoDto;
import com.dacrt.SBIABackend.security.dto.RolRequestDto;
import com.dacrt.SBIABackend.security.entity.OpcionDeBIA;
import com.dacrt.SBIABackend.security.entity.Rol;
import com.dacrt.SBIABackend.security.entity.RolOpcionDeBIA;
import com.dacrt.SBIABackend.security.service.OpcionDeBIAService;
import com.dacrt.SBIABackend.security.service.RolOpcionDeBIAService;
import com.dacrt.SBIABackend.security.service.RolService;

@RestController
@RequestMapping("/roles")
@CrossOrigin(origins = "*")
//@CrossOrigin(origins = "*")
public class RolController {
	
	@Autowired
	RolService rolService;
	
	@Autowired
	OpcionDeBIAService opcionDeBIAService;
	
	@Autowired
	RolOpcionDeBIAService rolOpcionDeBIAService;
	
	Logger logger = LoggerFactory.getLogger(RolController.class);
	
	@PreAuthorize("hasRole('ROLE_ADMIN')")
	@PostMapping("/create")
	public ResponseEntity<?> addRol(@RequestBody final RolRequestDto rolRequestDto,BindingResult bindingResult) {
		
		if (bindingResult.hasErrors())
			return new ResponseEntity(new Mensaje("Campos mal puestos"),HttpStatus.BAD_REQUEST);
		if (rolService.existsByRolNombre(rolRequestDto.getRolNombre()))
			return new ResponseEntity(new Mensaje("Ese nombre ya existe"),HttpStatus.BAD_REQUEST);
		
		try {

			Rol rol = new Rol();
			rol.setRolNombre(rolRequestDto.getRolNombre());
			rol.setActivo(rolRequestDto.getActivo());
			rol.setRegistradoPor(rolRequestDto.getRegistradoPor());
			rol.setFechaRegistro(rolRequestDto.getFechaRegistro());
			rol.setModificadoPor(rolRequestDto.getModificadoPor());
			rol.setFechaModificacion(rolRequestDto.getFechaModificacion());
			rolService.save(rol);
			
			Optional<Rol> optionalRol = rolService.getByRolNombre(rolRequestDto.getRolNombre());
			
			if (optionalRol.isPresent()) {
				for (String opcionDeBIA : rolRequestDto.getOpcionesDeBIA()) {
					String opcion = opcionDeBIA.split("|")[0];
					String modo = opcionDeBIA.split("|")[1];
					Optional<OpcionDeBIA> optionalOpcionDeBIA = opcionDeBIAService.findByOpcion(opcion);
					if (optionalOpcionDeBIA.isPresent()) {
						RolOpcionDeBIA rolOpcionDeBIA = new RolOpcionDeBIA();
						rolOpcionDeBIA.setRol(optionalRol.get());
						rolOpcionDeBIA.setOpcionDeBIA(optionalOpcionDeBIA.get());
						rolOpcionDeBIA.setModo(modo);
						rolOpcionDeBIAService.save(rolOpcionDeBIA);	
					}
				}
			} else {
				return new ResponseEntity<>(new Mensaje("Hubo un problema en la creación de rol."), HttpStatus.OK);
			}
			
			return new ResponseEntity<>(new Mensaje("El proceso fue creado exitosamente"), HttpStatus.OK);
		} catch (DataAccessException ex) {
			logger.error(ex.getMessage());
			return new ResponseEntity(new Mensaje(ex.getMessage()), HttpStatus.METHOD_NOT_ALLOWED);
		}
	}

	@PostMapping("/conectarol")
	public ResponseEntity<AccesoDto> conectarol(@Valid @RequestBody RolAccesoDto rolAccesoDto,BindingResult bindingResult){
		if (bindingResult.hasErrors())
			return new ResponseEntity(new Mensaje("Campos mal puestos"),HttpStatus.BAD_REQUEST);
		
		List<String> accesos = new ArrayList<String>();
		
		Set<RolOpcionDeBIA> rolesOpcionesDeBIA = rolService.buscarOpcionesDeRol(rolAccesoDto.getRolNombre());
		
		for (RolOpcionDeBIA rolOpcionDeBIA : rolesOpcionesDeBIA) {
			accesos.add(rolOpcionDeBIA.getOpcionDeBIA().getOpcion() + "|" + rolOpcionDeBIA.getModo());
		}
		
		AccesoDto accesoDto = new AccesoDto();
		accesoDto.setAccesos(accesos);
		return new ResponseEntity(accesoDto, HttpStatus.OK);
	}
	
	@GetMapping("/listaroles")
	public ResponseEntity<List<RolAccesoDto>> getUnidades() {
		List<RolAccesoDto> rolAccesoDtos = rolService.getRoles();
		return new ResponseEntity<>(rolAccesoDtos, HttpStatus.OK);
	}
	
	
}
