//Accounting.js

//Actions specific to the Accounting section

var EC = protractor.ExpectedConditions;
var createLedger = $("a[href='/accounting/create']");
var accountIdentifierInput = $("fims-id-input[controlname='identifier'] input");
var accountNameInput = $("fims-text-input[controlname='name'] input");
var descriptionInput = $("input[formcontrolname='description']");
var accountBalanceInput = $("fims-text-input[controlname='balance'] input");
var primaryButton = $$(".mat-raised-button.mat-primary");
var radioButtonAsset = $$("md-radio-button").get(0);
var radioButtonRevenue = $$("md-radio-button").get(4);

//journal entries
var accountSearchInputField = $("fims-text-input[controlname='account'] input");

module.exports = {
    goToAccountingViaSidePanel: function() {
        browser.wait(EC.visibilityOf($$("a[href='/accounting']").first()), 3000);
        $$("a[href='/accounting']").first().click();$$("a[href='/accounting']").first().click();
    },
    verifyCardHasTitleGeneralLedger: function() {
        form_title=$("fims-layout-card-over .mat-toolbar-row div").getText();
        expect(form_title).toEqual("General Ledger");
    },
    clickButtonOrLinkCreateNewLedger: function(){
        browser.wait(EC.visibilityOf(createLedger), 5000);
        createLedger.click();
    },
    goToTransactionTypes: function() {
        browser.wait(EC.visibilityOf($("a[href='/accounting/transactiontypes']")), 3000);
        $("a[href='/accounting/transactiontypes']").click();
    },
    goToChartOfAccounts: function() {
        browser.wait(EC.visibilityOf($("a[href='/accounting/chartOfAccounts']")), 3000);
        $("a[href='/accounting/chartOfAccounts']").click();
    },
    goToJournalEntries: function() {
        browser.wait(EC.visibilityOf($("a[href='/accounting/journalEntries']")), 3000);
        $("a[href='/accounting/journalEntries']").click();
    },
    goToChequeClearing: function() {
        browser.wait(EC.visibilityOf($("a[href='/accounting/cheques']")), 3000);
        $("a[href='/accounting/cheques']").click();
    },
    goToTrialBalance: function() {
        browser.wait(EC.visibilityOf($("a[href='/accounting/trialBalance']")), 3000);
        $("a[href='/accounting/trialBalance']").click();
    },
    goToPayrolls: function() {
        browser.wait(EC.visibilityOf($("a[href='/accounting/payrolls']")), 3000);
        $("a[href='/accounting/payrolls']").click();
    },
    viewAccountEntriesForAccount: function(accountIdentifier){
        link = "/accounting/accounts/detail/" + accountIdentifier + "/entries";
        browser.wait(EC.visibilityOf($('a[href="'+ link + '"]')));
        $('a[href="'+ link + '"]').click();
        browser.sleep(1000);
    },
    goToTasksForAccount: function(accountIdentifier){
        link = "/accounting/accounts/detail/" + accountIdentifier + "/tasks";
        browser.wait(EC.visibilityOf($('a[href="'+ link + '"]')));
        $('a[href="'+ link + '"]').click();
        browser.sleep(1000);
    },
    goToSubledgersForAccount: function(accountIdentifier){
        link = "/accounting/ledgers/detail/" + accountIdentifier + "/ledgers";
        browser.wait(EC.visibilityOf($('a[href="'+ link + '"]')));
        $('a[href="'+ link + '"]').click();
        browser.sleep(1000);
    },
    clickLinkShowForAccountWithName: function(name) {
        browser.wait(EC.invisibilityOf($("div[class='md-padding'] h3")), 5000);
        browser.sleep(1000);
        browser.wait(EC.textToBePresentInElement($$("tbody tr .td-data-table-cell").last(), "SHOW"), 5000);
        $$('tbody tr').filter(function(elem, index) {
            return elem.$$(".td-data-table-cell").get(1).getText().then(function(text) {
                return text === name;
            });
        }).$$(".td-data-table-cell").last().click();
    },
    clickLinkShowForAccountWithIdentifier: function(identifier) {
        browser.wait(EC.invisibilityOf($("div[class='md-padding'] h3")), 5000);
        browser.sleep(1000);
        browser.wait(EC.textToBePresentInElement($$("tbody tr .td-data-table-cell").last(), "SHOW"), 5000);
        $$('tbody tr').filter(function(elem, index) {
            return elem.$$(".td-data-table-cell").get(0).getText().then(function(text) {
                return text === identifier;
            });
        }).$$(".td-data-table-cell").last().click();
    },
    verifyAccountStatus: function(expectedStatus){
        browser.wait(EC.visibilityOf($("fims-state-display")), 2000);
        expect($("fims-state-display .mat-list-text .mat-line").getText().then(function(text){
                return text === expectedStatus;
            })).toBe(true);
    },
    verifyAccountInfo: function(heading, value) {
        expect($$(".md-list-item .mat-list-text").filter(function (elem, index) {
            return elem.$("h3").getText().then(function (text) {
                return text === heading;
            }).$(p).getText().then(function (text) {
                return text === value;
            }).toBe(true);
        }));
    },
    verifyTransactionTypeForRow: function(type, row) {
        browser.wait(EC.visibilityOf($("table tbody")), 3000);
        expect($$("table tbody tr").get(row - 1).$$(".td-data-table-cell").get(1).getText()).toEqual(type);
    },
    verifyTransactionMessageForRow: function(message, row) {
        browser.wait(EC.visibilityOf($("table tbody")), 3000);
        expect($$("table tbody tr").get(row - 1).$$(".td-data-table-cell").get(2).getText()).toEqual(message);
    },
    verifyTransactionAmountForRow: 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);
    },
    verifyTransactionBalanceForRow: function(balance, row) {
        browser.wait(EC.visibilityOf($("table tbody")), 3000);
        expect($$("table tbody tr").get(row - 1).$$(".td-data-table-cell").get(4).getText()).toEqual(balance);
    },
    clickCreateNewAccountInLedger: function(ledger){
        link = "/accounting/ledgers/detail/" + ledger + "/accounts/create";
        browser.wait(EC.visibilityOf($('a[href="'+ link + '"]')));
        $('a[href="'+ link + '"]').click();
    },
    enterTextIntoAccountIdentifierInputField: function(text) {
        browser.wait(EC.visibilityOf(accountIdentifierInput), 5000);
        accountIdentifierInput.click().sendKeys(text);
    },
    enterTextIntoAccountNameInputField: function(text) {
        browser.wait(EC.visibilityOf(accountNameInput), 5000);
        accountNameInput.click().sendKeys(text);
    },
    enterTextIntoAccountBalanceInputField: function(text) {
        browser.wait(EC.visibilityOf(accountBalanceInput), 5000);
        accountBalanceInput.click().sendKeys(text);
    },
    clickButtonCreateAccount: function(){
        primaryButton.filter(function(elem, index) {
            return elem.$("span").getText().then(function(text) {
                return text === "CREATE ACCOUNT";
            });
        }).click();
    },
    verifyRadioAssetToBeSelected: function() {
        expect(radioButtonAsset.getAttribute("class")).toMatch("mat-radio-checked");
    },
    verifyRadioAssetToBeDisabled: function() {
        expect(radioButtonAsset.getAttribute("class")).toMatch("mat-radio-disabled");
    },
    verifyRadioRevenueToBeSelected: function() {
        expect(radioButtonRevenue.getAttribute("class")).toMatch("mat-radio-checked");
    },

    //Journal entries
    enterTextIntoSearchAccountInputField: function(account) {
        browser.wait(EC.visibilityOf(accountSearchInputField), 5000);
        accountSearchInputField.click().sendKeys(account);
    },
    clickSearchButton: function(){
       $$("button").filter(function(elem, index) {
            return elem.$("span md-icon").getText().then(function(text) {
                return text === "search";
            });
        }).click();
       browser.sleep(1000);
    },
    verifyFirstJournalEntry: function(transactionType, transactionAmount){
        browser.sleep(500);
        expect($$("fims-layout-card-over .mat-list-item .mat-list-text p").first().getText().then(function(text){
            return text === transactionType;
        })).toBe(true);
        expect($$("fims-layout-card-over .mat-list-item .mat-list-text p").get(1).getText().then(function(text){
            return text === transactionAmount;
        })).toBe(true);
    },
    verifySecondJournalEntry: function(transactionType, transactionAmount){
        expect($$("fims-layout-card-over .mat-list-item .mat-list-text p").get(2).getText().then(function(text){
            return text === transactionType;
        })).toBe(true);
        expect($$("fims-layout-card-over .mat-list-item .mat-list-text p").get(3).getText().then(function(text){
            return text === transactionAmount;
        })).toBe(true);
    },
    clickSecondJournalEntry: function(){
        $$("fims-layout-card-over md-nav-list a").get(1).click();
        browser.sleep(500);
    },
    clickThirdJournalEntry: function(){
        $$("fims-layout-card-over md-nav-list a").get(2).click();
        browser.sleep(500);
    },
    clickJournalEntry: function(number){
        $$("fims-layout-card-over md-nav-list a").get(number-1).click();
        browser.sleep(500);
    },
    verifyThirdJournalEntry: function(transactionType, transactionAmount){
        expect($$("fims-layout-card-over .mat-list-item .mat-list-text p").get(4).getText().then(function(text){
            return text === transactionType;
        })).toBe(true);
        expect($$("fims-layout-card-over .mat-list-item .mat-list-text p").get(5).getText().then(function(text){
            return text === transactionAmount;
        })).toBe(true);
    },
    verifyFourthJournalEntry: function(transactionType, transactionAmount){
        browser.sleep(500);
        expect($$("fims-layout-card-over .mat-list-item .mat-list-text p").get(6).getText().then(function(text){
            return text === transactionType;
        })).toBe(true);
        expect($$("fims-layout-card-over .mat-list-item .mat-list-text p").get(7).getText().then(function(text){
            return text === transactionAmount;
        })).toBe(true);
    },
    verifyFifthJournalEntry: function(transactionType, transactionAmount){
        browser.sleep(500);
        expect($$("fims-layout-card-over .mat-list-item .mat-list-text p").get(8).getText().then(function(text){
            return text === transactionType;
        })).toBe(true);
        expect($$("fims-layout-card-over .mat-list-item .mat-list-text p").get(9).getText().then(function(text){
            return text === transactionAmount;
        })).toBe(true);
    },
    verifyAccountHasBeenDebitedWithAmountInRow: function(account, amount, row) {
        browser.wait(EC.visibilityOf($("table tbody")), 3000);
        expect($$("table tbody tr").get(row - 1).$$(".td-data-table-cell").get(0).getText()).toEqual(account);
        expect($$("table tbody tr").get(row - 1).$$(".td-data-table-cell").get(2).getText()).toEqual(amount);
    },
    verifyAccountHasBeenCreditedWithAmountInRow: function(account, amount, row) {
        browser.wait(EC.visibilityOf($("table tbody")), 3000);
        expect($$("table tbody tr").get(row - 1).$$(".td-data-table-cell").get(1).getText()).toEqual(account);
        expect($$("table tbody tr").get(row - 1).$$(".td-data-table-cell").get(2).getText()).toEqual(amount);
    },
    verifyClerkForJournalEntryIs: function (clerk){
        expect($$("md-card .mat-list-text h3").filter(function(elem, index) {
            return elem.getText().then(function(text) {
                return text === "Clerk";
            });
        }).first().element(by.xpath("..")).$("p").getText().then(function(text){
            return text == clerk;
        })).toBe(true);
    },
    verifyMessageForJournalEntryIs: function (message){
        expect($$("md-card .mat-list-text h3").filter(function(elem, index) {
            return elem.getText().then(function(text) {
                return text === "Message";
            });
        }).first().element(by.xpath("..")).$("p").getText().then(function(text){
            console.log(text);
            return text == message;
        })).toBe(true);
    },
    verifyNoteForJournalEntryIs: function (note){
        expect($$("md-card .mat-list-text h3").filter(function(elem, index) {
            return elem.getText().then(function(text) {
                return text === "Note";
            });
        }).first().element(by.xpath("..")).$("p").getText().then(function(text){
            console.log(text);
            return text == note;
        })).toBe(true);
    },
    //tasks for accounts
    clickButtonToExecuteAction: function(action){
        $$(".mat-raised-button.mat-accent span").filter(function(elem, index) {
            return elem.getText().then(function(text){
                return text === action;
            });
        }).first().click();
    },
};