import { __assign, __awaiter, __generator, __spreadArray } from "tslib";
import { UploaderDefaultProps } from './props';
import { chooseImage } from '../_util/promisify';
import createValue from '../mixins/value';
import '../_util/assert-component2';
Component({
    props: UploaderDefaultProps,
    mixins: [createValue({
            defaultValueKey: 'defaultFileList',
            valueKey: 'fileList',
            transformValue: function (fileList) {
                if (fileList === void 0) { fileList = []; }
                return {
                    needUpdate: true,
                    value: fileList.map(function (item) {
                        var file = __assign({}, item);
                        if (typeof item.url === 'undefined') {
                            file.url = '';
                        }
                        if (typeof item.uid === 'undefined') {
                            file.uid = String(Math.random());
                        }
                        if (typeof item.status === 'undefined') {
                            item.status = 'done';
                        }
                        return file;
                    }),
                };
            },
        })],
    methods: {
        chooseImage: function () {
            return __awaiter(this, void 0, void 0, function () {
                var _a, onBeforeUpload, onUpload, fileList, _b, maxCount, sourceType, localFileList, chooseImageRes, err_1, beforeUploadRes, err_2, tasks;
                var _this = this;
                return __generator(this, function (_c) {
                    switch (_c.label) {
                        case 0:
                            _a = this.props, onBeforeUpload = _a.onBeforeUpload, onUpload = _a.onUpload;
                            if (!onUpload) {
                                throw new Error('need props onUpload');
                            }
                            fileList = this.getValue();
                            _b = this.props, maxCount = _b.maxCount, sourceType = _b.sourceType;
                            _c.label = 1;
                        case 1:
                            _c.trys.push([1, 3, , 4]);
                            return [4 /*yield*/, chooseImage({
                                    count: typeof maxCount === 'undefined' ? Infinity : (maxCount - fileList.length),
                                    sourceType: sourceType,
                                })];
                        case 2:
                            chooseImageRes = _c.sent();
                            localFileList = (chooseImageRes.tempFiles || chooseImageRes.tempFilePaths || chooseImageRes.apFilePaths || chooseImageRes.filePaths || []).map(function (item) {
                                if (typeof item === 'string') {
                                    return {
                                        path: item,
                                    };
                                }
                                if (item.path) {
                                    return {
                                        path: item.path,
                                        size: item.size,
                                    };
                                }
                            }).filter(function (item) { return !!item; });
                            return [3 /*break*/, 4];
                        case 3:
                            err_1 = _c.sent();
                            if (this.props.onChooseImageError) {
                                this.props.onChooseImageError(err_1);
                            }
                            return [2 /*return*/];
                        case 4:
                            if (!onBeforeUpload) return [3 /*break*/, 8];
                            _c.label = 5;
                        case 5:
                            _c.trys.push([5, 7, , 8]);
                            return [4 /*yield*/, onBeforeUpload(localFileList)];
                        case 6:
                            beforeUploadRes = _c.sent();
                            if (beforeUploadRes === false) {
                                return [2 /*return*/];
                            }
                            if (Array.isArray(beforeUploadRes)) {
                                localFileList = beforeUploadRes;
                            }
                            return [3 /*break*/, 8];
                        case 7:
                            err_2 = _c.sent();
                            return [2 /*return*/];
                        case 8:
                            tasks = localFileList.map(function (file) { return _this.uploadFile(file); });
                            return [4 /*yield*/, Promise.all(tasks)];
                        case 9:
                            _c.sent();
                            return [2 /*return*/];
                    }
                });
            });
        },
        uploadFile: function (localFile) {
            return __awaiter(this, void 0, void 0, function () {
                var onUpload, uid, tempFileList, url, err_3;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            onUpload = this.props.onUpload;
                            uid = String(Math.random());
                            tempFileList = __spreadArray(__spreadArray([], this.getValue(), true), [{
                                    path: localFile.path,
                                    size: localFile.size,
                                    uid: uid,
                                    status: 'uploading'
                                }], false);
                            if (!this.isControlled()) {
                                this.update(tempFileList);
                            }
                            if (this.props.onChange) {
                                this.props.onChange(tempFileList);
                            }
                            _a.label = 1;
                        case 1:
                            _a.trys.push([1, 3, , 4]);
                            return [4 /*yield*/, onUpload(localFile)];
                        case 2:
                            url = _a.sent();
                            if (typeof url !== 'string' || !url) {
                                this.updateFile(uid, {
                                    status: 'error',
                                });
                                return [2 /*return*/];
                            }
                            this.updateFile(uid, {
                                status: 'done',
                                url: url,
                            });
                            return [3 /*break*/, 4];
                        case 3:
                            err_3 = _a.sent();
                            this.updateFile(uid, {
                                status: 'error',
                            });
                            return [3 /*break*/, 4];
                        case 4: return [2 /*return*/];
                    }
                });
            });
        },
        updateFile: function (uid, file) {
            var fileList = this.getValue();
            var tempFileList = fileList.map(function (item) {
                if (item.uid === uid) {
                    return __assign(__assign({}, item), file);
                }
                return item;
            });
            if (!this.isControlled()) {
                this.update(tempFileList);
            }
            if (this.props.onChange) {
                this.props.onChange(tempFileList);
            }
        },
        onRemove: function (e) {
            return __awaiter(this, void 0, void 0, function () {
                var fileList, _a, onRemove, onChange, uid, file, result, tempFileList;
                return __generator(this, function (_b) {
                    switch (_b.label) {
                        case 0:
                            fileList = this.getValue();
                            _a = this.props, onRemove = _a.onRemove, onChange = _a.onChange;
                            uid = e.target.dataset.uid;
                            file = fileList.find(function (item) { return item.uid === uid; });
                            if (!onRemove) return [3 /*break*/, 2];
                            return [4 /*yield*/, onRemove(file)];
                        case 1:
                            result = _b.sent();
                            if (result === false) {
                                return [2 /*return*/];
                            }
                            _b.label = 2;
                        case 2:
                            tempFileList = fileList.filter(function (item) { return item.uid !== uid; });
                            if (!this.isControlled()) {
                                this.update(tempFileList);
                            }
                            if (onChange) {
                                onChange(tempFileList);
                            }
                            return [2 /*return*/];
                    }
                });
            });
        },
        onPreview: function (e) {
            var uid = e.target.dataset.uid;
            var fileList = this.getValue();
            var file = fileList.find(function (item) { return item.uid === uid; });
            if (this.props.onPreview) {
                this.props.onPreview(file);
            }
        },
    }
});
