//Login.js

var Common = require('./Common.js');

//actions specific to logging in, logging out, changing password

var EC = protractor.ExpectedConditions;
var inputTenant = $(".mat-input-element[formcontrolname='tenant']");
var inputUsername = $(".mat-input-element[formcontrolname='username']");
var inputPassword = $(".mat-input-element[formcontrolname='password']");
var inputNewPassword = $(".mat-input-element[formcontrolname='newPassword']");
var inputConfirmNewPassword = $(".mat-input-element[formcontrolname='confirmNewPassword']");
var userAccountButton =$$("mat-toolbar-row .mat-icon-button").get(1);
var buttonSignOut = $$(".mat-menu-panel .mat-menu-item").get(2);

module.exports = {

    enterTextInInputFieldForTenant: function(text){
        browser.wait(EC.visibilityOf(inputTenant), 5000);
        inputTenant.click().sendKeys(text);
    },
    enterTextInInputFieldForUsername: function(text){
        browser.wait(EC.visibilityOf(inputUsername), 5000);
        inputUsername.click().sendKeys(text);
    },
    enterTextInInputFieldForPassword: function(text) {
        browser.wait(EC.visibilityOf(inputPassword), 5000);
        inputPassword.click().sendKeys(text);
    },
    clickEnabledSignInOrChangePasswordButton: function(){
        expect($(".mat-raised-button.mat-primary").isEnabled()).toBeTruthy();
        $(".mat-raised-button.mat-primary").click();
        browser.wait(EC.not(EC.presenceOf($('.td-loading'))), 10000);
    },
    verifyMessageForUnsuccessfulLoginIsDisplayed: function(){
        browser.wait(EC.visibilityOf($("div p.mat-caption")), 2000);
        message = $("div p.mat-caption").getText();
        expect(message).toEqual("Sorry, that login did not work.");
    },
    clearInputFieldForUsername: function(){
        inputUsername.clear();
    },
    clearInputFieldForTenant: function(){
        inputTenant.clear();
    },
    clearInputFieldForPassword: function(){
        inputPassword.clear();
    },
    verifyUserIsOnChangePasswordPage: function(){
        browser.wait(EC.visibilityOf($(".mat-card .mat-card-title")));
        expect($(".mat-card .mat-card-title").getText()).toEqual("Change password");
    },
    enterTextInInputFieldForNewPassword: function(text){
        browser.wait(EC.visibilityOf(inputNewPassword), 5000);
        inputNewPassword.click().sendKeys(text);
    },
    enterTextInInputFieldForConfirmNewPassword: function(text){
        inputConfirmNewPassword.click().sendKeys(text);
    },
    verifyMessageThatPasswordsMustMatchIsDisplayed: function(){
        browser.wait(EC.visibilityOf($(".tc-red-700")), 2000);
        message = $(".tc-red-700").getText();
        expect(message).toEqual("Passwords must match.");
    },
    clearInputFieldForNewPassword: function(){
        inputNewPassword.clear();
    },
    clearInputFieldForConfirmNewPassword: function(){
        inputConfirmNewPassword.clear();
    },
    verifySignInOrChangePasswordButtonIsDisabled: function(){
        expect($(".mat-raised-button.mat-primary").isEnabled()).toBeFalsy();
    },
    verifySignInOrChangePasswordButtonIsEnabled: function(){
        expect($(".mat-raised-button.mat-primary").isEnabled()).toBeTruthy();
    },
    clickButtonToOpenUserAccountMenu: function() {
        userAccountButton.click();
        browser.wait(EC.visibilityOf($$(".mat-menu-item span").first()), 5000);
    },
    verifyUserIsLoggedIn: function(text) {
        loggedInUser=$$(".mat-menu-item span").first().getText();
        expect(loggedInUser).toEqual(text);
    },
    closeOpenUserAccountMenu: function(){
        $$(".mat-menu-item span").first().click();
    },
    clickMenuItemSignOut: function() {
        browser.wait(EC.visibilityOf(buttonSignOut, 2000));
        buttonSignOut.click();
    },
    clickMenuItemSettings: function() {
        browser.wait(EC.visibilityOf($$(".mat-menu-panel .mat-menu-item").get(1), 2000));
        $$(".mat-menu-panel .mat-menu-item").get(1).click();
    },
    verifyNewPasswordInputFieldMarkedAsRequired: function(){
        expect(inputNewPassword.getAttribute('aria-invalid')).toEqual('true');
        expect($(".mat-input-error").getText()).toEqual("Required");
    },
    logInWithTenantUserAndPassword: function(tenant, user, password){
        this.enterTextInInputFieldForTenant(tenant);
        this.enterTextInInputFieldForUsername(user);
        this.enterTextInInputFieldForPassword(password);
        this.clickEnabledSignInOrChangePasswordButton();
        Common.waitForThePageToFinishLoading();
    },
    logInForFirstTimeWithTenantUserAndPassword: function(tenant, user, initialPassword, newPassword){
        this.enterTextInInputFieldForTenant(tenant);
        this.enterTextInInputFieldForUsername(user);
        this.enterTextInInputFieldForPassword(initialPassword);
        this.clickEnabledSignInOrChangePasswordButton();
        this.enterTextInInputFieldForNewPassword(newPassword);
        this.enterTextInInputFieldForConfirmNewPassword(newPassword);
        this.clickEnabledSignInOrChangePasswordButton();
        this.enterTextInInputFieldForTenant(tenant);
        this.enterTextInInputFieldForUsername(user);
        this.enterTextInInputFieldForPassword(newPassword);
        this.clickEnabledSignInOrChangePasswordButton();
        Common.waitForThePageToFinishLoading();
    },
    signOut: function(){
        this.clickButtonToOpenUserAccountMenu();
        this.clickMenuItemSignOut();
    }
};