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({
                    message: this.$params.message
                });
            }
        });
    }

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

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

    get hasInvoicing() {
        return this.aclService.hasAny(['invoicing']);
    }

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

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

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

    transferClient() {
        this.$http.get(`Clients/${this.ticket.client.id}`).then(client => {
            const ticket = this.ticket;

            const params =
            {
                clientFk: client.data.id,
                addressFk: client.data.defaultAddressFk,
            };

            this.$http.patch(`Tickets/${ticket.id}`, params).then(() => {
                this.vnApp.showSuccess(this.$t('Data saved!'));
                this.reload();
            });
        });
    }

    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!'));
            });
    }

    showPdfDeliveryNote(type) {
        this.vnReport.show(`tickets/${this.id}/delivery-note-pdf`, {
            recipientId: this.ticket.client.id,
            type: type
        });
    }

    sendPdfDeliveryNote($data) {
        let query = `tickets/${this.id}/delivery-note-email`;
        if (this.hasDocuwareFile) query = `docuwares/${this.id}/delivery-note-email`;

        return this.vnEmail.send(query, {
            recipientId: this.ticket.client.id,
            recipient: $data.email
        });
    }

    showCsvDeliveryNote() {
        this.vnReport.show(`tickets/${this.id}/delivery-note-csv`, {
            recipientId: this.ticket.client.id
        });
    }

    sendCsvDeliveryNote($data) {
        return this.vnEmail.send(`tickets/${this.id}/delivery-note-csv-email`, {
            recipientId: this.ticket.client.id,
            recipient: $data.email
        });
    }

    deleteTicket() {
        return this.$http.post(`Tickets/${this.id}/setDeleted`)
            .then(() => this.reload())
            .then(() => {
                const isInsideTicket = this.$state.current.name.startsWith('ticket');
                if (isInsideTicket)
                    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 = Date.vnNew();
        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.$t('Minimum is needed', params)
        });
    }

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

    sendChangesSms() {
        return this.$http.get(`TicketLogs/${this.id}/getChanges`)
            .then(res => {
                const params = {
                    ticketId: this.id,
                    created: this.ticket.updated,
                    changes: res.data
                };
                this.showSMSDialog({message: this.$t('Send changes', params)});
            });
    }

    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();
    }

    makeInvoice() {
        const params = {ticketsIds: [this.id]};
        /*
            This should call the notification sistem to insert a new notification
            in te queue, yet to check how to handle user permissions,
            as of 08-11-2022 every employee can insert a new notification in the queue

        */
        const client = this.ticket.client;

        if (client.hasElectronicInvoice) {
            this.$http.post(`NotificationQueues`, {
                notificationFk: 'invoice-electronic',
                authorFk: client.id,
                params: JSON.stringify(
                    {
                        'name': client.name,
                        'email': client.email,
                        'ticketId': this.id,
                        'url': window.location.href
                    })
            }).then(() => {
                this.vnApp.showSuccess(this.$t('Invoice sent'));
            });
        }

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

    createPdfInvoice() {
        const invoiceId = this.ticket.invoiceOut.id;
        return this.$http.post(`InvoiceOuts/${invoiceId}/createPdf`)
            .then(() => this.reload())
            .then(() => {
                const snackbarMessage = this.$t(
                    `The invoice PDF document has been regenerated`);
                this.vnApp.showSuccess(snackbarMessage);
            });
    }

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

    async refund() {
        const params = {ticketsIds: [this.id]};
        const query = 'Tickets/refund';
        return this.$http.post(query, params).then(res => {
            const [refundTicket] = res.data;
            this.vnApp.showSuccess(this.$t('The following refund ticket have been created', {
                ticketId: refundTicket.id
            }));
            this.$state.go('ticket.card.sale', {id: refundTicket.id});
        });
    }

    onSmsSend(sms) {
        return this.$http.post(`Tickets/${this.id}/sendSms`, sms)
            .then(() => this.vnApp.showSuccess(this.$t('SMS sent')));
    }

    hasDocuware() {
        this.$http.post(`Docuwares/${this.id}/checkFile`, {fileCabinet: 'deliveryNote', signed: true})
            .then(res => {
                this.hasDocuwareFile = res.data;
            });
    }

    uploadDocuware(force) {
        if (!force)
            return this.$.pdfToTablet.show();

        return this.$http.post(`Docuwares/${this.id}/upload`, {fileCabinet: 'deliveryNote'})
            .then(() => {
                this.vnApp.showSuccess(this.$t('PDF sent!'));
                this.$.balanceCreate.show();
            });
    }
}

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

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