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

//office creation
var officeIdentifierInput = $(".mat-input-infix input[placeholder='Identifier']");
var officeNameInput = $("fims-text-input[controlname='name'] input");
var officeDescriptionInput = $("fims-text-input[controlname='description'] input");
var streetInput = $("fims-text-input[controlname='street'] input");
var cityInput = $("fims-text-input[controlname='city'] input");
var postalCodeInput = $("fims-text-input[controlname='postalCode'] input");
var regionInput = $("fims-text-input[controlname='region'] input");
var countryInput = $("input[formcontrolname='country']");

//teller creation
var numberInput = $(".mat-input-infix input[placeholder='Number']");
var passwordInput = $("input[formcontrolname='password']");
var withdrawalLimitInput = $("fims-text-input[controlname='cashdrawLimit'] input");
var tellerAccountInput = $("fims-account-select[formcontrolname='tellerAccountIdentifier'] input");
var vaultAccountInput =$("fims-account-select[formcontrolname='vaultAccountIdentifier'] input");
var chequesReceivableAccountInput = $("fims-account-select[formcontrolname='chequesReceivableAccount'] input");

//open teller
var assignedEmployeeInput = $("fims-employee-auto-complete[formcontrolname='assignedEmployeeIdentifier'] input");
var amountInput = $("fims-text-input[controlname='amount'] input");
var radioNone = $$("md-radio-group[formcontrolname='adjustment'] md-radio-button").first();
var radioCashIn = $$("md-radio-group[formcontrolname='adjustment'] md-radio-button").last();
var radioCashOut = $$("md-radio-group[formcontrolname='adjustment'] md-radio-button").last();


//general elements
var primaryButton = $$(".mat-raised-button.mat-primary");
var createOfficeButton = $$(".mat-raised-button.mat-primary").first();


//Actions specific to the Offices section, including Teller management

var EC = protractor.ExpectedConditions;

module.exports = {
    goToManageOfficesViaSidePanel: function() {
        browser.wait(EC.visibilityOf($$("a[href='/offices']").get(0)), 5000);
        $$("a[href='/offices']").first().click();
    },
    clickViewOfficesFromQuickAccess: function() {
        browser.wait(EC.visibilityOf($$("a[href='/offices']").get(1)), 5000);
        $$("a[href='/offices']").get(1).click();
    },
    clickButtonCreateNewOffice: function(){
        browser.wait(EC.visibilityOf($("a[title='Create branch office']")), 5000);
        $("a[title='Create branch office']").click();
    },
    enterTextIntoOfficeIdentifierInputField: function(text) {
        officeIdentifierInput.click().sendKeys(text);
    },
    enterTextIntoOfficeNameInputField: function(text) {
        officeNameInput.click().sendKeys(text);
    },
    enterTextIntoOfficeDescriptionInputField: function(text){
        officeDescriptionInput.click().sendKeys(text);
    },
    clickEnabledContinueButtonForOfficeDetails: function(){
        expect($$(".mat-raised-button").get(0).isEnabled()).toBeTruthy();
        $$(".mat-raised-button").get(0).click();
    },
    clickCreateOfficeButton: function(){
        browser.executeScript("arguments[0].scrollIntoView();", createOfficeButton.getWebElement());
        browser.wait(EC.elementToBeClickable(createOfficeButton), 3000);
        primaryButton.filter(function(elem, index) {
            return elem.$("span").getText().then(function(text) {
                return text === "CREATE OFFICE";
            });
        }).click();
    },
    clickButtonCreateHeadquarter: function(){
        expect($(".mat-raised-button.mat-primary").isEnabled()).toBeTruthy();
        $(".mat-raised-button.mat-primary").click();
    },
    verifyNoHeadquarterExistingYet: function(){
        browser.wait(EC.visibilityOf($(".mat-card-title .material-icons")), 5000);
        title = $(".mat-card .mat-card-title span").getText();
        expect(title).toEqual("No Headquarter found");
    },

    //teller creation, updating, opening and closing
    goToManageTellersForOfficeByIdentifier: function(identifier){
        link = '/offices/detail/' + identifier + '/tellers';
        browser.wait(EC.visibilityOf($('a[href="' + link +'"]')), 5000);
        $('a[href="' + link +'"]').click();
    },

    clickCreateTellerForOfficeByIdentifier: function(identifier){
        link = '/offices/detail/' + identifier + '/tellers/create';
        browser.wait(EC.visibilityOf($('a[href="' + link + '"]')), 5000);
        $('a[href="' + link + '"]').click();
    },
    enterTextIntoTellerNumberInputField: function(text) {
        browser.wait(EC.visibilityOf(numberInput), 5000);
        numberInput.click().sendKeys(text);
    },
    enterTextIntoPasswordInputField: function(text) {
        browser.wait(EC.visibilityOf(passwordInput), 5000);
        passwordInput.click().clear().sendKeys(text);
    },
    enterTextIntoCashWithdrawalLimitInputField: function(text) {
        withdrawalLimitInput.click().clear().sendKeys(text);
    },
    verifyCashWithdrawalLimitInputFieldHasError: function(text) {
        expect(withdrawalLimitInput.getAttribute("class")).toMatch("ng-invalid");
        expect(withdrawalLimitInput.element(by.xpath("..")).element(by.xpath("..")).element(by.xpath("..")).$("md-error").getText()).toEqual(text);
    },
    enterTextIntoTellerAccountInputFieldAndSelectMatchingEntry: function(text) {
        tellerAccountInput.click().clear().sendKeys(text);
        browser.wait(EC.visibilityOf($(".mat-option")), 5000);
        $$(".mat-option").first().click();
    },
    enterTextIntoVaultAccountInputFieldAndSelectMatchingEntry: function(text) {
        vaultAccountInput.click().clear().sendKeys(text);
        browser.wait(EC.visibilityOf($(".mat-option")), 5000);
        $$(".mat-option").first().click();
    },
    enterTextIntoVaultAccountInputField: function(text) {
        vaultAccountInput.click().clear().sendKeys(text);
    },
    verifyVaultAccountInputFieldHasError: function(text) {
        expect(vaultAccountInput.getAttribute("class")).toMatch("ng-invalid");
        expect(vaultAccountInput.element(by.xpath("..")).element(by.xpath("..")).element(by.xpath("..")).$("md-error").getText()).toEqual(text);
    },
    enterTextIntoChequesReceivableAccountInputFieldAndSelectMatchingEntry: function(text) {
        chequesReceivableAccountInput.click().clear().sendKeys(text);
        browser.wait(EC.visibilityOf($(".mat-option")), 5000);
        $$(".mat-option").first().click();
    },
    enterTextIntoChequesReceivableAccountInputField: function(text) {
        chequesReceivableAccountInput.click().clear().sendKeys(text);
    },
    verifyChequesReceivableAccountInputFieldHasError: function(text) {
        browser.wait(EC.presenceOf($("md-hint")), 2500);
        expect(chequesReceivableAccountInput.element(by.xpath("..")).element(by.xpath("..")).element(by.xpath("..")).$("md-hint").getText()).toEqual(text);
    },
    verifyRadioNoneSelected: function(){
        expect(radioNone.getAttribute('class')).toMatch("mat-radio-checked");
    },
    selectRadioCashIn: function(){
        radioCashIn.click();
    },
    selectRadioCashOut: function(){
        browser.wait(EC.elementToBeClickable(radioCashOut), 2500);
        radioCashOut.click();
    },
    verifyAmountInputDisabledIfNoneSelected: function(){
        expect(amountInput.isEnabled()).toBe(false);
    },
    verifyAmountInputEnabledIfCashInSelected: function(){
        expect(amountInput.isEnabled()).toBe(true);
    },
    enterTextIntoAmountInputField: function(text) {
        amountInput.click().sendKeys(text);
    },
    enterTextIntoAssignedEmployeeInputField: function(text) {
        assignedEmployeeInput.click().sendKeys(text);
    },
    selectOptionInListByName: function(name){
        browser.wait(EC.visibilityOf($(".mat-option")), 3000);
        element(by.cssContainingText('.mat-option', name)).click();
    },
    clickCreateTellerButton: function(){
        browser.executeScript("arguments[0].scrollIntoView();", primaryButton.get(0).getWebElement());
        browser.sleep(1000);
        primaryButton.filter(function(elem, index) {
            return elem.$("span").getText().then(function(text) {
                return text === "CREATE TELLER";
            });
        }).click();
    },
    verifyCreateTellerButtonIsDisabled: function(){
        browser.executeScript("arguments[0].scrollIntoView();", primaryButton.get(0).getWebElement());
        expect(primaryButton.filter(function(elem, index) {
            return elem.$("span").getText().then(function(text) {
                return text === "CREATE TELLER";
            });
        }).first().isEnabled()).toBe(false);
    },
    verifyCreateTellerButtonIsEnabled: function(){
        browser.executeScript("arguments[0].scrollIntoView();", primaryButton.get(0).getWebElement());
        browser.sleep(1000);
        expect(primaryButton.filter(function(elem, index) {
            return elem.$("span").getText().then(function(text) {
                return text === "CREATE TELLER";
            });
        }).first().isEnabled()).toBe(true);
    },
    clickUpdateTellerButton: function(){
        browser.executeScript("arguments[0].scrollIntoView();", primaryButton.get(0).getWebElement());
        primaryButton.filter(function(elem, index) {
            return elem.$("span").getText().then(function(text) {
                return text === "UPDATE TELLER";
            });
        }).click();
    },
    clickActionOpenForTellerOfOffice: function(teller, office){
        link = '/offices/detail/' + office + '/tellers/detail/' + teller + '/command?action=OPEN';
        browser.wait(EC.elementToBeClickable($('a[href="' + link + '"]')), 5000);
        $('a[href="' + link + '"]').click();
    },
    clickActionCloseForTellerOfOffice: function(teller, office){
        link = '/offices/detail/' + office + '/tellers/detail/' + teller + '/command?action=CLOSE';
        browser.wait(EC.elementToBeClickable($('a[href="' + link + '"]')), 5000);
        $('a[href="' + link + '"]').click();
    },
    clickButtonEditForTellerInOffice: function(teller, office){
        link = '/offices/detail/' + office + '/tellers/detail/' + teller + '/edit';
        browser.wait(EC.elementToBeClickable($('a[href="' + link + '"]')), 5000);
        $('a[href="' + link + '"]').click();
    },
    clickEnabledOpenTellerButton: function(){
        browser.wait(EC.visibilityOf($(".mat-raised-button.mat-primary")), 5000);
        browser.sleep(1000);
        //expect($(".mat-raised-button.mat-primary").isEnabled()).toBeTruthy();
        $(".mat-raised-button.mat-primary").click();
    },
    clickCloseTellerButton: function(){
        browser.wait(EC.visibilityOf($(".mat-raised-button.mat-primary")), 5000);
        browser.sleep(1000);
        //expect($(".mat-raised-button.mat-primary").isEnabled()).toBeTruthy();
        $(".mat-raised-button.mat-primary").click();
    },
    verifyTellerStatusIs: function(expectedStatus){
        browser.wait(EC.visibilityOf($("fims-state-display")), 5000);
        status = $("fims-state-display .mat-list-text .mat-line").getText();
        expect(status).toEqual(expectedStatus);
    },
    verifyMessageDisplayed: function(message){
        expect($("td-message .td-message-label").getText()).toEqual(message);
    },
    verifyAssignedEmployeeForTellerIs: function(assignedEmployee) {
        expect($$("fims-layout-card-over .mat-list-text").filter(function (elem, index) {
            return elem.$("h3").getText().then(function (text) {
                return text === "Assigned employee";
            });
        }).first().$("p").getText().then(function (text) {
            return text === assignedEmployee;
        })).toBe(true);
    },
    verifyNumberForTellerIs: function(tellerNumber) {
        expect($$("fims-layout-card-over .mat-list-text").filter(function (elem, index) {
            return elem.$("h3").getText().then(function (text) {
                return text === "Number";
            });
        }).first().$("p").getText().then(function (text) {
            return text === tellerNumber;
        })).toBe(true);
    },
    verifyCashWithdrawalLimitIs: function(limit) {
        expect($$("fims-layout-card-over .mat-list-text").filter(function (elem, index) {
            return elem.$("h3").getText().then(function (text) {
                return text === "Cash withdrawal limit";
            });
        }).first().$("p").getText().then(function (text) {
            return text === limit;
        })).toBe(true);
    },
    verifyTellerAccountIs: function(account) {
        expect($$("fims-layout-card-over .mat-list-text").filter(function (elem, index) {
            return elem.$("h3").getText().then(function (text) {
                return text === "Teller account";
            });
        }).first().$("p").getText().then(function (text) {
            return text === account;
        })).toBe(true);
    },
    verifyVaultAccountIs: function(account) {
        expect($$("fims-layout-card-over .mat-list-text").filter(function (elem, index) {
            return elem.$("h3").getText().then(function (text) {
                return text === "Vault account";
            });
        }).first().$("p").getText().then(function (text) {
            return text === account;
        })).toBe(true);
    },
    verifyChequesReceivableAccountIs: function(account) {
        expect($$("fims-layout-card-over .mat-list-text").filter(function (elem, index) {
            return elem.$("h3").getText().then(function (text) {
                return text === "Cheques receivable account";
            });
        }).first().$("p").getText().then(function (text) {
            return text === account;
        })).toBe(true);
    },
    verifyCreatedByForTellerIs: function(createdBy){
        expect($$("fims-layout-card-over .mat-list-text").filter(function (elem, index) {
            return elem.$("h3").getText().then(function (text) {
                return text === "Created by";
            });
        }).first().$("p").getText().then(function (text) {
            return text.indexOf(createdBy) >= 0;
        })).toBe(true);
    },
    verifyLastModifiedByForTellerIs: function(modifiedBy){
        expect($$("fims-layout-card-over .mat-list-text").filter(function (elem, index) {
            return elem.$("h3").getText().then(function (text) {
                return text === "Last modified by";
            });
        }).first().$("p").getText().then(function (text) {
            return text.indexOf(modifiedBy) >= 0;
        })).toBe(true);
    },
    viewTellerBalanceForTellerInOffice: function(tellerIdentifier, officeIdentifier){
        link = "/offices/detail/" + officeIdentifier + "/tellers/detail/" + tellerIdentifier + "/balance";
        browser.wait(EC.visibilityOf($("a[href='"+link+"']")), 2000);
        $("a[href='"+link+"']").click();
        browser.wait(EC.textToBePresentInElement($$("fims-layout-card-over .mat-toolbar-row span").get(1), "Teller balance"), 2000);
    },
    verifyCurrentTellerBalance: function(balance){
        expect($$('tbody tr').filter(function (elem, index) {
            return elem.$(".td-data-table-cell").getText().then(function (text) {
                return text === "Current balance";
            });
        }).$$(".td-data-table-cell").get(2).getText().then(function (text){
            return text === balance;
        })).toBe(true);
    },
    verifyTellerTransactionMessageForRow: function(message, row) {
        browser.wait(EC.visibilityOf($("table tbody")), 3000);
        browser.wait(EC.textToBePresentInElement($$("table tbody tr").get(row - 1).$$(".td-data-table-cell").get(1), message));
    },
    verifyTellerCreditTransactionAmountForRow: function(amount, row) {
        browser.wait(EC.visibilityOf($("table tbody")), 3000);
        expect($$("table tbody tr").get(row - 1).$$(".td-data-table-cell").get(3).getText()).toEqual(amount);
    },
    verifyTellerDebitTransactionAmountForRow: function(amount, row) {
        browser.wait(EC.visibilityOf($("table tbody")), 3000);
        expect($$("table tbody tr").get(row - 1).$$(".td-data-table-cell").get(2).getText()).toEqual(amount);
    },
    clickButtonCancel: function(){
        $$(".mat-button span").filter(function(elem, index){
            return elem.getText().then(function(text){
                return text == "CANCEL";
            })
        }).click();
    }
}
