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

class Controller extends Section {
    constructor($element, $, vnReport, vnEmail) {
        super($element, $);
        this.vnReport = vnReport;
        this.vnEmail = vnEmail;
    }

    get ticketId() {
        return this._ticketId;
    }

    set ticketId(value) {
        this._ticketId = value;
        this.id = value;
    }

    get id() {
        return this._id;
    }

    set id(value) {
        this._id = value;

        if (!value) return;

        this.loadData().then(() => {
            if (this.$params.sendSMS)
                this.showSMSDialog();
        });
    }

    loadData() {
        const filter = {
            include: [{
                relation: 'address',
            }, {
                relation: 'client',
                scope: {
                    fields: [
                        'salesPersonFk',
                        'name',
                        'isActive',
                        'isFreezed',
                        'isTaxDataChecked',
                        'credit',
                        'email',
                        'phone',
                        'mobile'
                    ],
                    include: {
                        relation: 'salesPersonUser',
                        scope: {
                            fields: ['id', 'name']
                        }
                    }
                }
            },
            {relation: 'ship'},
            {relation: 'stowaway'}]
        };

        return this.$http.get(`Tickets/${this.ticketId}`, {filter})
            .then(res => this.ticket = res.data)
            .then(() => {
                this.canStowaway();
                this.isTicketEditable();
            });
    }

    reload() {
        return this.loadData().then(() => {
            if (this.parentReload)
                this.parentReload();
        });
    }

    get isInvoiced() {
        return this.ticket.refFk !== null;
    }

    get isTicketModule() {
        return this.$state.getCurrentPath()[1].state.name === 'ticket';
    }

    isTicketEditable() {
        if (!this.ticket) return;

        this.$http.get(`Tickets/${this.id}/isEditable`).then(res => {
            this.isEditable = res.data;
        });
    }

    addTurn(day) {
        const params = {
            ticketFk: this.id,
            weekDay: day,
            agencyModeFk: this.ticket.agencyModeFk
        };
        return this.$http.patch(`TicketWeeklies`, params)
            .then(() => {
                this.$.addTurn.hide();
                this.vnApp.showSuccess(this.$t('Data saved!'));
            });
    }

    showDeliveryNote() {
        this.vnReport.show('delivery-note', {
            recipientId: this.ticket.client.id,
            ticketId: this.id,
        });
    }

    sendDeliveryNote() {
        return this.vnEmail.send('delivery-note', {
            recipientId: this.ticket.client.id,
            recipient: this.ticket.client.email,
            ticketId: this.id
        });
    }

    deleteTicket() {
        return this.$http.post(`Tickets/${this.id}/setDeleted`)
            .then(() => this.reload())
            .then(() => {
                this.$state.go('ticket.index');
                this.vnApp.showSuccess(this.$t('Ticket deleted. You can undo this action within the first hour'));
            });
    }

    get canRestoreTicket() {
        const isDeleted = this.ticket.isDeleted;
        const now = new Date();
        const maxDate = new Date(this.ticket.updated);
        maxDate.setHours(maxDate.getHours() + 1);

        return isDeleted && (now <= maxDate);
    }

    restoreTicket() {
        return this.$http.post(`Tickets/${this.id}/restore`)
            .then(() => this.reload())
            .then(() => this.vnApp.showSuccess(this.$t('Data saved!')));
    }

    showChangeShipped() {
        this.newShipped = this.ticket.shipped;
        this.$.changeShippedDialog.show();
    }

    changeShipped() {
        const data = {shipped: this.newShipped};
        return this.$http.post(`Tickets/${this.id}/updateEditableTicket`, data)
            .then(() => this.reload())
            .then(() => this.vnApp.showSuccess(this.$t('Shipped hour updated')));
    }

    sendImportSms() {
        const params = {
            ticketId: this.id,
            created: this.ticket.updated
        };
        this.showSMSDialog({
            message: this.$params.message || this.$t('Minimum is needed', params)
        });
    }

    sendPaymentSms() {
        this.showSMSDialog({
            message: this.$params.message || this.$t('Make a payment')
        });
    }

    showSMSDialog(params) {
        const address = this.ticket.address;
        const client = this.ticket.client;
        const phone = this.$params.phone
            || address.mobile
            || address.phone
            || client.mobile
            || client.phone;

        this.newSMS = Object.assign({
            ticketId: this.id,
            destinationFk: this.ticket.clientFk,
            destination: phone
        }, params);
        this.$.sms.open();
    }

    canStowaway() {
        this.canShowStowaway = false;
        if (!this.isTicketModule || !this.ticket) return;

        this.$http.get(`Tickets/${this.id}/canHaveStowaway`)
            .then(res => this.canShowStowaway = !!res.data);
    }

    get canDeleteStowaway() {
        if (!this.ticket || !this.isTicketModule)
            return false;

        return this.ticket.stowaway || this.ticket.ship;
    }

    deleteStowaway() {
        return this.$http.post(`Tickets/${this.id}/deleteStowaway`)
            .then(() => this.reload())
            .then(() => this.vnApp.showSuccess(this.$t('Data saved!')));
    }

    makeInvoice() {
        return this.$http.post(`Tickets/${this.id}/makeInvoice`)
            .then(() => this.reload())
            .then(() => this.vnApp.showSuccess(this.$t('Ticket invoiced')));
    }

    regenerateInvoice() {
        const invoiceId = this.ticket.invoiceOut.id;
        return this.$http.post(`InvoiceOuts/${invoiceId}/regenerate`)
            .then(() => {
                const snackbarMessage = this.$t(
                    `Invoice sent for a regeneration, will be available in a few minutes`);
                this.vnApp.showSuccess(snackbarMessage);
            });
    }

    recalculateComponents() {
        return this.$http.post(`Tickets/${this.id}/recalculateComponents`)
            .then(() => this.reload())
            .then(() => this.vnApp.showSuccess(this.$t('Data saved!')));
    }
}

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

ngModule.vnComponent('vnTicketDescriptorMenu', {
    template: require('./index.html'),
    controller: Controller,
    bindings: {
        ticketId: '<',
        parentReload: '&'
    }
});