import ngModule from '../../module';
import Section from 'salix/components/section';

class Controller extends Section {
    constructor($element, $, vnEmail) {
        super($element, $);
        this.vnEmail = vnEmail;
        this.filter = {
            include: {
                relation: 'company',
                scope: {
                    fields: ['code'],
                },
            }
        };
    }

    get companyId() {
        if (!this._companyId)
            this.companyId = this.vnConfig.companyFk;

        return this._companyId;
    }

    set companyId(value) {
        this._companyId = value;

        if (value) this.getData();
    }

    get balances() {
        return this._balances;
    }

    set balances(value) {
        this._balances = value;

        const riskModel = this.$.riskModel;
        if (value && riskModel.data)
            this.getBalances();
    }

    get isAdministrative() {
        return this.aclService.hasAny(['administrative']);
    }

    getData() {
        return this.$.model.applyFilter(null, {
            clientId: this.$params.id,
            companyId: this.companyId
        }).then(() => this.$.riskModel.applyFilter({
            where: {
                clientFk: this.$params.id,
                companyFk: this.companyId
            }
        })).then(() => this.getBalances());
    }

    getCurrentBalance() {
        const clientRisks = this.$.riskModel.data;
        const selectedCompany = this.companyId;
        const currentBalance = clientRisks.find(balance => {
            return balance.companyFk === selectedCompany;
        });

        return currentBalance && currentBalance.amount;
    }

    getBalances() {
        const balances = this.$.model.data;
        balances.forEach((balance, index) => {
            if (index === 0)
                balance.balance = this.getCurrentBalance();
            if (index > 0) {
                let previousBalance = balances[index - 1];
                balance.balance = previousBalance.balance - (previousBalance.debit - previousBalance.credit);
            }
        });
    }

    showInvoiceOutDescriptor(event, balance) {
        if (!balance.isInvoice) return;
        if (event.defaultPrevented) return;

        this.$.invoiceOutDescriptor.show(event.target, balance.id);
    }

    changeDescription(balance) {
        const params = {description: balance.description};
        const endpoint = `Receipts/${balance.id}`;
        this.$http.patch(endpoint, params)
            .then(() => this.vnApp.showSuccess(this.$t('Data saved!')));
    }

    sendEmail(balance) {
        return this.vnEmail.send(`Receipts/${balance.id}/balance-compensation-email`);
    }
}

Controller.$inject = ['$element', '$scope', 'vnEmail'];

ngModule.vnComponent('vnClientBalanceIndex', {
    template: require('./index.html'),
    controller: Controller,
});