"use strict";
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
Object.defineProperty(exports, "__esModule", { value: true });
const jszip_1 = require("jszip");
const IStorage_1 = require("./IStorage");
const ZipFolder_1 = require("./ZipFolder");
const StorageBase_1 = require("./StorageBase");
const CartoApp_1 = require("../app/CartoApp");
const StorageUtilities_1 = require("./StorageUtilities");
class ZipStorage extends StorageBase_1.default {
    get updatedSinceLoad() {
        if (this.modified === null || (this.lastLoadedOrSaved === null && this.modified === null)) {
            return false;
        }
        else if (this.lastLoadedOrSaved === null) {
            return true;
        }
        return this.modified > this.lastLoadedOrSaved;
    }
    constructor() {
        super();
        this.modified = null;
        this.lastLoadedOrSaved = null;
        ZipStorage.zipFixup();
        this._jsz = new jszip_1.default();
        this.rootFolder = new ZipFolder_1.default(this, this._jsz, null, "", "");
    }
    static zipFixup() {
        if (CartoApp_1.default.hostType === CartoApp_1.HostType.electronNodeJs || CartoApp_1.default.hostType === CartoApp_1.HostType.toolsNodejs) {
            // eslint-disable-next-line
            eval("jszip_1.default = jszip_1");
        }
    }
    static fromJsObject(data) {
        const zs = new ZipStorage();
        const file = zs.rootFolder.ensureFile("d.json");
        let jsonData = undefined;
        jsonData = JSON.stringify(data);
        file.setContent(jsonData);
        file.saveContent();
        return zs;
    }
    static async toJsObject(storage) {
        const file = storage.rootFolder.ensureFile("d.json");
        await file.loadContent();
        return StorageUtilities_1.default.getJsonObject(file);
    }
    updateLastLoadedOrSaved() {
        this.lastLoadedOrSaved = new Date();
    }
    async loadFromBase64(data, name) {
        try {
            await this._jsz.loadAsync(data, {
                base64: true,
                checkCRC32: true,
            });
        }
        catch (e) {
            this.errorMessage = e.toString();
            this.errorStatus = IStorage_1.StorageErrorStatus.unprocessable;
        }
        // Log.fail("Loading zip file from data " + data.length);
        this.name = name;
        this.updateLastLoadedOrSaved();
        await this.rootFolder.load(true);
    }
    async loadFromUint8Array(data, name) {
        try {
            await this._jsz.loadAsync(data, {
                base64: false,
            });
        }
        catch (e) {
            this.errorMessage = e.toString();
            this.errorStatus = IStorage_1.StorageErrorStatus.unprocessable;
        }
        // Log.fail("Loading zip file from data " + data.length);
        this.name = name;
        this.updateLastLoadedOrSaved();
        await this.rootFolder.load(true);
    }
    joinPath(pathA, pathB) {
        let fullPath = pathA;
        if (!fullPath.endsWith(StorageBase_1.default.slashFolderDelimiter)) {
            fullPath += StorageBase_1.default.slashFolderDelimiter;
        }
        fullPath += pathB;
        return fullPath;
    }
    async generateUint8ArrayAsync() {
        const result = await this._jsz.generateAsync({
            type: "uint8array",
        });
        return result;
    }
    async generateCompressedBase64Async() {
        const result = await this._jsz.generateAsync({
            type: "base64",
            compression: "DEFLATE",
            compressionOptions: {
                level: 9,
            },
        });
        return result;
    }
    async generateCompressedUint8ArrayAsync() {
        const result = await this._jsz.generateAsync({
            type: "uint8array",
            compression: "DEFLATE",
            compressionOptions: {
                level: 9,
            },
        });
        return result;
    }
    async generateBlobAsync() {
        let type = "blob";
        if (CartoApp_1.default.isLocalNode) {
            type = "nodebuffer";
        }
        const result = await this._jsz.generateAsync({ type: type });
        return result;
    }
}
exports.default = ZipStorage;

//# sourceMappingURL=../maps/storage/ZipStorage.js.map
