const { getUserDataPath, readJsonSync, makeDirSync, writeFileSync, copyFile, downloadFile, writeFile, deleteFile, rmdirSync, unzip, isOutOfStorage } = window.fsUtils;

var cacheManager = {

    // 以下为单向属性,修改会同步到 Worker 中
    _cacheDir: 'gamecaches',
    get cacheDir() {
        return this._cacheDir;
    },
    set cacheDir(v) {
        worker.cacheManager.set_cacheDir([this._cacheDir = v]);
    },

    _cachedFileName: 'cacheList.json',
    get cachedFileName() {
        return this._cachedFileName;
    },
    set cachedFileName(v) {
        worker.cacheManager.set_cachedFileName([this._cachedFileName = v]);
    },

    _cacheEnabled: true,
    get cacheEnabled() {
        return this._cacheEnabled;
    },
    set cacheEnabled(v) {
        worker.cacheManager.set_cacheEnabled([this._cacheEnabled = v]);
    },

    _autoClear: true,
    get autoClear() {
        return this._autoClear;
    },
    set autoClear(v) {
        worker.cacheManager.set_autoClear([this._autoClear = v]);
    },

    _cacheInterval: 500,
    get cacheInterval() {
        return this._cacheInterval;
    },
    set cacheInterval(v) {
        worker.cacheManager.set_cacheInterval([this._cacheInterval = v]);
    },

    _deleteInterval: 500,
    get deleteInterval() {
        return this._deleteInterval;
    },
    set deleteInterval(v) {
        worker.cacheManager.set_deleteInterval([this._deleteInterval = v]);
    },

    // 以下属性未暴露,仅在 Worker 中保留
    // writeFileInterval: 2000,
    // outOfStorage: false,
    // tempFiles: null,
    // cacheQueue: {},

    // 以下为只读属性,并且在变动时从 Worker 中同步,需注意 lastTime 可能不是最新的
    cachedFiles: null,

    // 以下为只读属性
    version: '1.0',

    // 增加 download 函数以在 Worker 执行下载逻辑
    download(url, func, options, onFileProgress, onComplete) {
        // 暂未实现 onFileProgress 回调
        worker.cacheManager.download(
            [url, options.reload, options.header, options.cacheEnabled, options.__cacheBundleRoot__],
            ([errMsg, path]) => {
                if (errMsg) {
                    onComplete(new Error(errMsg), null);
                    return;
                }
                func(path, options, (err, data) => {
                    if (err) {
                        this.removeCache(url);
                    }
                    onComplete(err, data);
                });
            },
        );
    },

    // 增加 handleZip 函数以在 Worker 执行处理逻辑
    handleZip(url, options, onComplete) {
        // 暂未实现 options.onFileProgress 回调
        worker.cacheManager.handleZip(
            [url, options.header, options.__cacheBundleRoot__],
            ([errMsg, path]) => {
                if (errMsg) {
                    onComplete(new Error(errMsg), null);
                } else {
                    onComplete(null, path);
                }
            },
        );
    },

    getCache(url) {
        return this.cachedFiles.has(url) ? this.cachedFiles.get(url).url : '';
    },

    // getTemp 改为异步函数
    getTempAsync(url, callback) {
        worker.cacheManager.getTemp([url], ([url]) => {
            callback(url);
        });
    },

    init() {
        this._cacheDir = getUserDataPath() + '/' + this.cacheDir;
        worker.cacheManager.init(null, ([cachedFiles]) => {
            this.cachedFiles = new cc.AssetManager.Cache(cachedFiles);
        });
    },

    clearCache() {
        worker.cacheManager.clearCache(null, () => {
            this.cachedFiles.clear();
        });
    },

    clearLRU() {
        worker.cacheManager.clearLRU(null, ([deletedFiles]) => {
            for (let i = 0, l = deletedFiles.length; i < l; i++) {
                this.cachedFiles.remove(deletedFiles[i]);
            }
        });
    },

    removeCache(url) {
        worker.cacheManager.removeCache([url], () => {
            this.cachedFiles.remove(url);
        });
    },

    makeBundleFolder(bundleName) {
        makeDirSync(this.cacheDir + '/' + bundleName, true);
    },
};

cc.assetManager.cacheManager = module.exports = cacheManager;