//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 button = $$(".mat-raised-button.mat-accent");
var radioButtonAsset = $$("mat-radio-button").get(0);
var radioButtonEquity = $$("mat-radio-button").get(2);
var radioButtonExpense = $$("mat-radio-button").get(3);
var radioButtonRevenue = $$("mat-radio-button").get(4);

//journal entries
var accountSearchInputField = $("fims-text-input[controlname='account'] input");
var transactionIdentifierInput = $("fims-id-input[controlname='transactionIdentifier'] input");
var transactionTypeInput = $("fims-transaction-type-select[formcontrolname='transactionType'] input");
var debitAccountInput = $$("fims-account-select[formcontrolname='accountNumber'] input").get(0);
var creditAccountInput = $$("fims-account-select[formcontrolname='accountNumber'] input").get(1);
var debitAmountInput = $$("fims-text-input[controlname='amount'] input").get(0);
var creditAmountInput = $$("fims-text-input[controlname='amount'] input").get(1);

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='mat-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='mat-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($$(".mat-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");
    },
    verifyRadioExpenseToBeSelected: function() {
        expect(radioButtonExpense.getAttribute("class")).toMatch("mat-radio-checked");
    },
    verifyRadioEquityToBeSelected: function() {
        expect(radioButtonEquity.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 mat-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 mat-nav-list a").get(1).click();
        browser.sleep(500);
    },
    clickThirdJournalEntry: function(){
        $$("fims-layout-card-over mat-nav-list a").get(2).click();
        browser.sleep(500);
    },
    clickJournalEntry: function(number){
        $$("fims-layout-card-over mat-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);
    },
    verifyAccountHasBeenCreditedWithAmount: function(account, amount) {
        browser.wait(EC.visibilityOf($("table tbody")), 3000);
        expect($$("table tbody tr .td-data-table-cell").filter(function(elem, index) {
            return elem.getText().then(function(text) {
                return text === account;
            });
        }).first().element(by.xpath("..")).$$(".td-data-table-cell").last().getText().then(function(text){
            return text == amount;
        })).toBe(true);
    },
    verifyAccountHasBeenDebitedWithAmount: function(account, amount) {
        browser.wait(EC.visibilityOf($("table tbody")), 3000);
        expect($$("table tbody tr .td-data-table-cell").filter(function(elem, index) {
            return elem.getText().then(function(text) {
                return text === account;
            });
        }).first().element(by.xpath("..")).$$(".td-data-table-cell").last().getText().then(function(text){
            return text == amount;
        })).toBe(true);
    },
    verifyClerkForJournalEntryIs: function (clerk){
        expect($$("mat-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($$("mat-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){
            return text == message;
        })).toBe(true);
    },
    verifyNoteForJournalEntryIs: function (note){
        expect($$("mat-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();
    },

    //journal entries
    clickButtonAddJournalEntry: function() {
        browser.sleep(1000);
        browser.wait(EC.elementToBeClickable($("fims-fab-button a[href='/accounting/journalEntries/create']")), 5000);
        $("fims-fab-button a[href='/accounting/journalEntries/create']").click();
    },
    enterTextIntoTransactionIdentifierInputField: function(text) {
        browser.wait(EC.visibilityOf(transactionIdentifierInput), 5000);
        transactionIdentifierInput.click().sendKeys(text);
    },
    enterTextIntoTransactionTypeInputFieldAndSelectMatchingEntry: function(text) {
        transactionTypeInput.click().clear().sendKeys(text);
        browser.wait(EC.visibilityOf($(".mat-option")), 5000);
        $$(".mat-option").first().click();
    },
    clickButtonContinue: function(){
        button.filter(function(elem, index) {
            return elem.$("span").getText().then(function(text) {
                return text === "CONTINUE";
            });
        }).click();
    },
    enterTextIntoDebitAccountNameInputField: function(text) {
        browser.wait(EC.elementToBeClickable(debitAccountInput), 5000);
        debitAccountInput.click().sendKeys(text);
    },
    enterTextIntoDebitAmountInputField: function(text) {
        browser.wait(EC.visibilityOf(debitAmountInput), 5000);
        debitAmountInput.click().sendKeys(text);
    },
    enterTextIntoCreditAccountNameInputField: function(text) {
        browser.wait(EC.visibilityOf(creditAccountInput), 5000);
        creditAccountInput.click().sendKeys(text);
    },
    enterTextIntoCreditAmountInputField: function(text) {
        browser.wait(EC.visibilityOf(creditAmountInput), 5000);
        creditAmountInput.click().sendKeys(text);
    },
    clickButtonCreateJournalEntry: function(){
        browser.wait(EC.elementToBeClickable(primaryButton.get(0)), 5000);
        primaryButton.filter(function(elem, index) {
            return elem.$("span").getText().then(function(text) {
                return text === "CREATE JOURNAL ENTRY";
            });
        }).click();
    },
};