import ngModule from '../../module';
import Section from 'salix/components/section';
import './style.scss';
import UserError from 'core/lib/user-error';

class Controller extends Section {
    constructor($element, $) {
        super($element, $);
        this.dms = {
            files: [],
            hasFile: false,
            hasFileAttached: false
        };
    }

    get route() {
        return this._route;
    }

    set route(value) {
        this._route = value;

        this.setDefaultParams();
        this.getAllowedContentTypes();
    }

    $onChanges() {
        if (this.$params && this.$params.q)
            this.params = JSON.parse(this.$params.q);
    }

    getAllowedContentTypes() {
        this.$http.get('DmsContainers/allowedContentTypes').then(res => {
            const contentTypes = res.data.join(', ');
            this.allowedContentTypes = contentTypes;
        });
    }

    get contentTypesInfo() {
        return this.$t('ContentTypesInfo', {
            allowedContentTypes: this.allowedContentTypes
        });
    }

    setDefaultParams() {
        const params = {filter: {
            where: {code: 'invoiceIn'}
        }};
        this.$http.get('DmsTypes/findOne', {params}).then(res => {
            const dmsType = res.data && res.data;
            const companyId = this.vnConfig.companyFk;
            const warehouseId = this.vnConfig.warehouseFk;
            const defaultParams = {
                warehouseId: warehouseId,
                companyId: companyId,
                dmsTypeId: dmsType.id,
                description: this.params.supplierName
            };

            this.dms = Object.assign(this.dms, defaultParams);
        });
    }

    onSubmit() {
        if (this.dms.files.length > 1) throw new UserError('You cannot attach more than one document');
        const query = `dms/uploadFile`;
        const options = {
            method: 'POST',
            url: query,
            params: this.dms,
            headers: {
                'Content-Type': undefined
            },
            transformRequest: files => {
                const formData = new FormData();
                formData.append(files[0].name, files[0]);
                return formData;
            },
            data: this.dms.files
        };
        this.$http(options).then(res => {
            if (res) {
                const addedDms = res.data;
                this.$.watcher.updateOriginalData();

                const params = {
                    rows: this.params.rows,
                    dms: addedDms
                };

                this.$http.post('AgencyTerms/createInvoiceIn', params)
                    .then(() => {
                        this.$state.go('route.agencyTerm.index');
                        this.vnApp.showSuccess(this.$t('Data saved!'));
                    });
            }
        });
    }

    onFileChange(files) {
        let hasFileAttached = false;

        if (files.length > 0)
            hasFileAttached = true;

        this.$.$applyAsync(() => {
            this.dms.hasFileAttached = hasFileAttached;
        });
    }
}

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

ngModule.vnComponent('vnAgencyTermCreateInvoiceIn', {
    template: require('./index.html'),
    controller: Controller,
    bindings: {
        route: '<'
    }
});