/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2022-2024. All rights reserved.
 */
package zip4cj.tasks

public abstract class AbstractZipTaskParameters {
    protected var zip4cjConfig: Zip4cjConfig

    protected init(zip4cjConfig: Zip4cjConfig) {
        this.zip4cjConfig = zip4cjConfig
    }
}

public class ExtractAllFilesTaskParameters <: AbstractZipTaskParameters {
    let outputPath: String

    public ExtractAllFilesTaskParameters(outputPath: String, zip4cjConfig: Zip4cjConfig) {
        super(zip4cjConfig)
        this.outputPath = outputPath
    }
}

public class RemoveFilesFromZipTaskParameters <: AbstractZipTaskParameters {
    let filesToRemove: Array<String>

    public init(filesToRemove: Array<String>, zip4cjConfig: Zip4cjConfig) {
        super(zip4cjConfig)
        this.filesToRemove = filesToRemove
    }
}

public class AddFolderToZipTaskParameters <: AbstractZipTaskParameters {
    let folderToAdd: Path
    let zipParameters: ZipParameters

    public init(folderToAdd: Path, zipParameters: ZipParameters, zip4cjConfig: Zip4cjConfig) {
        super(zip4cjConfig)
        this.folderToAdd = folderToAdd
        this.zipParameters = zipParameters
    }
}

public class AddStreamToZipTaskParameters <: AbstractZipTaskParameters {
    let inputStream: InputStream
    let zipParameters: ZipParameters

    public AddStreamToZipTaskParameters(
        inputStream: InputStream,
        zipParameters: ZipParameters,
        zip4cjConfig: Zip4cjConfig
    ) {
        super(zip4cjConfig)
        this.inputStream = inputStream
        this.zipParameters = zipParameters
    }
}

public class ExtractFileTaskParameters <: AbstractZipTaskParameters {
    var outputPath: String
    var fileToExtract: String
    var newFileName: ?String

    public ExtractFileTaskParameters(
        outputPath: String,
        fileToExtract: String,
        newFileName: ?String,
        zip4cjConfig: Zip4cjConfig
    ) {
        super(zip4cjConfig)
        this.outputPath = outputPath
        this.fileToExtract = fileToExtract
        this.newFileName = newFileName
    }
}

public class MergeSplitZipFileTaskParameters <: AbstractZipTaskParameters {
    var outputZipFile: Path

    public MergeSplitZipFileTaskParameters(outputZipFile: Path, zip4cjConfig: Zip4cjConfig) {
        super(zip4cjConfig)
        this.outputZipFile = outputZipFile
    }
}

public class RenameFilesTaskParameters <: AbstractZipTaskParameters {
    let fileNamesMap: Map<String, String>

    public RenameFilesTaskParameters(fileNamesMap: Map<String, String>, zip4cjConfig: Zip4cjConfig) {
        super(zip4cjConfig)
        this.fileNamesMap = fileNamesMap
    }
}

public class SetCommentTaskTaskParameters <: AbstractZipTaskParameters {
    var comment: String

    public SetCommentTaskTaskParameters(comment: String, zip4cjConfig: Zip4cjConfig) {
        super(zip4cjConfig)
        this.comment = comment
    }
}

public class AddFilesToZipTaskParameters <: AbstractZipTaskParameters {
    let filesToAdd: Array<Path>
    let zipParameters: ZipParameters

    public init(filesToAdd: Array<Path>, zipParameters: ZipParameters, zip4cjConfig: Zip4cjConfig) {
        super(zip4cjConfig)
        this.filesToAdd = filesToAdd
        this.zipParameters = zipParameters
    }
}