const StreamUnzip = require('./node_stream_zip_changed');
//const StreamUnzip = require('node-stream-zip');

class ZipReader {
    constructor() {
        this.zip = null;
    }

    checkState() {
        if (!this.zip)
            throw new Error('Zip closed');
    }

    async open(zipFile, zipEntries = true) {
        if (this.zip)
            throw new Error('Zip file is already open');

         const zip = new StreamUnzip.async({file: zipFile, skipEntryNameValidation: true});
         
        if (zipEntries)
            this.zipEntries = await zip.entries();

         this.zip = zip;
    }

    get entries() {
        this.checkState();

        return this.zipEntries;
    }

    async extractToBuf(entryFilePath) {
        this.checkState();

        return await this.zip.entryData(entryFilePath);
    }

    async extractToFile(entryFilePath, outputFile) {
        this.checkState();

        await this.zip.extract(entryFilePath, outputFile);
    }

    async extractAllToDir(outputDir) {
        this.checkState();

        await this.zip.extract(null, outputDir);
    }

    async close() {
        if (this.zip) {
            await this.zip.close();
            this.zip = null;
            this.zipEntries = undefined;
        }
    }
}

module.exports = ZipReader;