package nl.itopia.corendon.controller;
import javafx.scene.control.Alert;
import javafx.scene.input.KeyEvent;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import nl.itopia.corendon.controller.administrator.AdministratorController;
import nl.itopia.corendon.controller.employee.EmployeeController;
import nl.itopia.corendon.controller.manager.ManagerController;
import nl.itopia.corendon.data.Employee;
import nl.itopia.corendon.model.EmployeeModel;
import nl.itopia.corendon.mvc.Controller;
import nl.itopia.corendon.utils.IO;
import nl.itopia.corendon.utils.Log;
import nl.itopia.corendon.utils.Validation;
/**
*
* @author Jeroentje & wieskueter.com
*/
public class LoginController extends Controller {
@FXML private TextField usernameField;
@FXML private Button loginButton;
@FXML private Button forgottenPasswordbutton, helpButton;
@FXML private TextField passwordField;
private InfoController infoController;
public LoginController(){
// Set view
registerFXML("gui/Inlogscherm.fxml");
usernameField.setOnKeyPressed(this::usernameFieldKeyPressed);
passwordField.setOnKeyPressed(this::passwordFieldKeyPressed);
loginButton.setOnKeyPressed(this::buttonEnterPressed);
forgottenPasswordbutton.setOnKeyPressed(this::buttonEnterPressed);
loginButton.setOnAction(this::loginButtonAction);
forgottenPasswordbutton.setOnAction(this::resetPassword);
view.fxmlPane.setOnKeyReleased(this::keypressHandler);
helpButton.setOnAction(this::helpHandler);
}
private void usernameFieldKeyPressed(KeyEvent event) {
if(event.getCode() == KeyCode.ESCAPE) {
usernameField.clear();
} else if(event.getCode() == KeyCode.ENTER) {
loginAction();
}
}
private void buttonEnterPressed(KeyEvent event) {
if(event.getCode()==KeyCode.ESCAPE) {
passwordField.clear();
} else if(event.getCode() == KeyCode.ENTER) {
loginAction();
}
}
private void passwordFieldKeyPressed(KeyEvent event) {
if(event.getCode() == KeyCode.ENTER) {
loginAction();
}
if(event.getCode() == KeyCode.ESCAPE) {
passwordField.clear();
}
}
private void loginButtonAction(ActionEvent event) {
loginAction();
}
private void loginAction() {
// Store username and password in variable
String userName = usernameField.getText();
String password = passwordField.getText();
// Check if values isn't empty
if(userName.isEmpty() || password.isEmpty()) {
// Show error if values are empty
if(userName.isEmpty()) {
Validation.errorMessage(usernameField, "Please enter a username");
}
if(password.isEmpty()) {
Validation.errorMessage(passwordField, "Please enter a password");
}
} else {
/* User credentials are filled in, create a employee object and check */
login(userName, password);
}
}
private void login(String userName, String password) {
EmployeeModel employeemodel = EmployeeModel.getDefault();
Employee employee = new Employee(0);
employee.username = userName;
employee.password = password;
/* login */
employee = employeemodel.login(employee);
if(employee != null) {
/* SCHERMEN */
Log.display("Logged in as: " + employee.username + " ROLE: " + employee.role.getName());
employeemodel.currentEmployee = employee;
redirectEmployee(employee);
} else {
usernameField.requestFocus();
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setTitle("Error");
alert.setHeaderText(null);
alert.setContentText("We couldn't log you in as: "+userName);
alert.showAndWait();
}
}
private void redirectEmployee(Employee employee) {
/* User is logged in, redirect user to the right controller by role name */
switch (employee.role.getName()) {
case "Administrator":
changeController(new AdministratorController());
break;
case "Employee":
changeController(new EmployeeController());
break;
case "Manager":
changeController(new ManagerController());
break;
default:
changeController(new LoginController());
}
}
private void resetPassword(ActionEvent e) {
// Show login reset screen
addController(new InfoController("Reset Password", "test"));
}
/**
* Open F1 InfoWindow
* @param e
*/
private void keypressHandler(KeyEvent e) {
//opens helpfunction with the f1 key
if(e.getEventType() == KeyEvent.KEY_RELEASED) {
if (e.getCode() == KeyCode.F1) {
// If it's already openend, close it
if (infoController == null) {
openHelp();
} else {
removeController(infoController);
infoController = null;
}
}
}
}
private void helpHandler(ActionEvent e) {
if(infoController == null) {
openHelp();
}
//opens help function
}
private void openHelp() {
infoController = new InfoController("Reset Password", IO.get("help/login.htm").toString());
infoController.setControllerDeleteHandler((obj)->{
removeController(infoController);
infoController = null;
});
addController(infoController);
}
}