package me.corriekay.pokegoutil.gui.controller;
import com.pokegoapi.auth.GoogleUserCredentialProvider;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.StackPane;
import me.corriekay.pokegoutil.BlossomsPoGoManager;
import me.corriekay.pokegoutil.data.enums.LoginType;
import me.corriekay.pokegoutil.data.managers.AccountManager;
import me.corriekay.pokegoutil.data.models.BpmResult;
import me.corriekay.pokegoutil.data.models.LoginData;
import me.corriekay.pokegoutil.utils.helpers.Browser;
/**
* The LoginController is use to handle all login related actions.
*/
public class LoginController extends BaseController<StackPane> {
private final AccountManager accountManager = AccountManager.getInstance();
private LoginData configLoginData = new LoginData();
// UI elements
@FXML
private TextField usernameField;
@FXML
private PasswordField passwordField;
@FXML
private Button ptcLoginBtn;
@FXML
private TextField tokenField;
@FXML
private Button getTokenBtn;
@FXML
private Button googleAuthBtn;
@FXML
private CheckBox saveAuthChkbx;
public LoginController() {
super();
initializeController();
}
/**
* Displays an error dialog with a message.
*
* @param message the error message
*/
private void alertFailedLogin(final String message) {
final Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setTitle("Error Login");
alert.setHeaderText("Unfortunately, your login has failed");
alert.setContentText(message != null ? message : "" + "\nPress OK to try again.");
alert.showAndWait();
}
@Override
public String getFxmlLayout() {
return "layout/Login.fxml";
}
@Override
public void setGuiControllerSettings() {
guiControllerSettings.setTitle("Login");
guiControllerSettings.setResizeable(false);
}
@FXML
private void initialize() {
configLoginData = accountManager.getLoginData();
googleAuthBtn.setOnAction(this::onGoogleAuthBtnClicked);
ptcLoginBtn.setOnAction(this::onPtcLoginBtnClicked);
saveAuthChkbx.setOnAction(this::onSaveAuthChkbxChanged);
getTokenBtn.setOnAction(this::ongetTokenBtnClicked);
final boolean hasSavedCredentials = configLoginData.hasSavedCredentials();
saveAuthChkbx.setSelected(hasSavedCredentials);
if (hasSavedCredentials) {
if (configLoginData.hasUsername()) {
usernameField.setText(configLoginData.getUsername());
usernameField.setDisable(true);
}
if (configLoginData.hasPassword()) {
passwordField.setText(configLoginData.getPassword());
passwordField.setDisable(true);
}
if (configLoginData.hasToken()) {
tokenField.setText("Using Previous Token");
tokenField.setDisable(true);
getTokenBtn.setDisable(true);
}
}
}
/**
* Event handler for saveAuthChkbx.
*
* @param actionEvent event
*/
private void onSaveAuthChkbxChanged(final ActionEvent actionEvent) {
final boolean saveCredentials = ((CheckBox) actionEvent.getSource()).isSelected();
accountManager.setSaveLogin(saveCredentials);
toggleFields(saveCredentials);
}
/**
* Event handler for getTokenBtn.
*
* @param ignored event
*/
private void ongetTokenBtnClicked(final ActionEvent ignored) {
tokenField.setDisable(false);
Browser.openUrl(GoogleUserCredentialProvider.LOGIN_URL);
}
/**
* Event handler for googleAuthBtn.
*
* @param ignored event
*/
private void onGoogleAuthBtnClicked(final ActionEvent ignored) {
final LoginData loginData = new LoginData();
if (configLoginData.hasToken()) {
loginData.setToken(configLoginData.getToken());
loginData.setSavedToken(true);
} else {
loginData.setToken(tokenField.getText());
}
loginData.setLoginType(LoginType.GOOGLE_AUTH);
tryLogin(loginData);
}
/**
* Event handler for ptcLoginBtn.
*
* @param ignored event
*/
private void onPtcLoginBtnClicked(final ActionEvent ignored) {
final LoginData loginData = new LoginData();
loginData.setUsername(usernameField.getText());
loginData.setPassword(passwordField.getText());
loginData.setLoginType(LoginType.PTC);
tryLogin(loginData);
}
private void openMainWindow() {
new MainWindowController();
BlossomsPoGoManager.getPrimaryStage().show();
}
/**
* Handle enabling and disabling of gui if credentials are saved.
*
* @param save save credentials
*/
private void toggleFields(final boolean save) {
if (usernameField.getText().isEmpty() || !save) {
usernameField.setDisable(false);
} else {
usernameField.setDisable(true);
}
if (passwordField.getText().isEmpty() || !save) {
passwordField.setDisable(false);
} else {
passwordField.setDisable(true);
}
if (tokenField.getText().isEmpty() || !save) {
tokenField.setDisable(false);
} else {
tokenField.setDisable(true);
}
getTokenBtn.setDisable(false);
}
/**
* Try to login into pokemon go using the provided login credentials.
*
* @param loginData login credentials
*/
private void tryLogin(final LoginData loginData) {
final BpmResult loginResult = accountManager.login(loginData);
if (loginResult.isSuccess()) {
openMainWindow();
} else {
alertFailedLogin(loginResult.getErrorMessage());
}
}
}