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

public class ZipModel {
    private var localFileHeaders: ArrayList<LocalFileHeader> = ArrayList<LocalFileHeader>()

    private var dataDescriptors: ArrayList<DataDescriptor> = ArrayList<DataDescriptor>()

    private var archiveExtraDataRecord: ArchiveExtraDataRecord = ArchiveExtraDataRecord()

    private var centralDirectory: ?CentralDirectory = CentralDirectory()

    private var endOfCentralDirectoryRecord: EndOfCentralDirectoryRecord = EndOfCentralDirectoryRecord()

    private var zip64EndOfCentralDirectoryLocator: ?Zip64EndOfCentralDirectoryLocator = Zip64EndOfCentralDirectoryLocator()

    private var zip64EndOfCentralDirectoryRecord: Zip64EndOfCentralDirectoryRecord = Zip64EndOfCentralDirectoryRecord()

    private var splitArchive: Bool = false

    private var splitLength: Int64

    private var zipFile: Path = unsafe { zeroValue<Path>() }
    private var hasZipFile: Bool = false

    private var isZip64FormatBool: Bool = false

    private var isNestedZipFileBool: Bool = false

    private var start: Int64 = 0

    private var end: Int64 = 0

    public init() {
        splitLength = -1
    }

    public func getLocalFileHeaders(): ArrayList<LocalFileHeader> {
        return localFileHeaders
    }

    public func setLocalFileHeaders(localFileHeaderList: ArrayList<LocalFileHeader>): Unit {
        this.localFileHeaders = localFileHeaderList
    }

    public func getDataDescriptors(): ArrayList<DataDescriptor> {
        return dataDescriptors
    }

    public func setDataDescriptors(dataDescriptors: ArrayList<DataDescriptor>): Unit {
        this.dataDescriptors = dataDescriptors
    }

    public func getCentralDirectory(): ?CentralDirectory {
        return centralDirectory
    }

    public func setCentralDirectory(centralDirectory: ?CentralDirectory): Unit {
        this.centralDirectory = centralDirectory
    }

    public func getEndOfCentralDirectoryRecord(): EndOfCentralDirectoryRecord {
        return endOfCentralDirectoryRecord
    }

    public func setEndOfCentralDirectoryRecord(endOfCentralDirectoryRecord: EndOfCentralDirectoryRecord): Unit {
        this.endOfCentralDirectoryRecord = endOfCentralDirectoryRecord
    }

    public func getArchiveExtraDataRecord(): ArchiveExtraDataRecord {
        return archiveExtraDataRecord
    }

    public func setArchiveExtraDataRecord(archiveExtraDataRecord: ArchiveExtraDataRecord): Unit {
        this.archiveExtraDataRecord = archiveExtraDataRecord
    }

    public func isSplitArchive(): Bool {
        return splitArchive
    }

    public func setSplitArchive(splitArchive: Bool): Unit {
        this.splitArchive = splitArchive
    }

    public func getZipFile(): Path {
        return if (hasZipFile) {
            zipFile
        } else {
            throw NoneValueException("zipFile is null")
        }
    }

    public func setZipFile(zipFile: Path): Unit {
        this.hasZipFile = true
        this.zipFile = zipFile
    }

    public func getZip64EndOfCentralDirectoryLocator(): ?Zip64EndOfCentralDirectoryLocator {
        return zip64EndOfCentralDirectoryLocator
    }

    public func setZip64EndOfCentralDirectoryLocator(
        zip64EndOfCentralDirectoryLocator: ?Zip64EndOfCentralDirectoryLocator): Unit {
        this.zip64EndOfCentralDirectoryLocator = zip64EndOfCentralDirectoryLocator
    }

    public func getZip64EndOfCentralDirectoryRecord(): Zip64EndOfCentralDirectoryRecord {
        return zip64EndOfCentralDirectoryRecord
    }

    public func setZip64EndOfCentralDirectoryRecord(zip64EndOfCentralDirectoryRecord: Zip64EndOfCentralDirectoryRecord): Unit {
        this.zip64EndOfCentralDirectoryRecord = zip64EndOfCentralDirectoryRecord
    }

    public func isZip64Format(): Bool {
        return isZip64FormatBool
    }

    public func setZip64Format(isZip64FormatBool: Bool): Unit {
        this.isZip64FormatBool = isZip64FormatBool
    }

    public func isNestedZipFile(): Bool {
        return isNestedZipFileBool
    }

    public func setNestedZipFile(isNestedZipFileBool: Bool): Unit {
        this.isNestedZipFileBool = isNestedZipFileBool
    }

    public func getStart(): Int64 {
        return start
    }

    public func setStart(start: Int64): Unit {
        this.start = start
    }

    public func getEnd(): Int64 {
        return end
    }

    public func setEnd(end: Int64): Unit {
        this.end = end
    }

    public func getSplitLength(): Int64 {
        return splitLength
    }

    public func setSplitLength(splitLength: Int64): Unit {
        this.splitLength = splitLength
    }

    public func clone(): ZipModel {
        var zipModel: ZipModel = ZipModel()
        zipModel.setLocalFileHeaders(this.getLocalFileHeaders())
        zipModel.setDataDescriptors(this.getDataDescriptors())
        zipModel.setCentralDirectory(this.getCentralDirectory())
        zipModel.setEndOfCentralDirectoryRecord(this.getEndOfCentralDirectoryRecord())
        zipModel.setArchiveExtraDataRecord(this.getArchiveExtraDataRecord())
        zipModel.setSplitArchive(this.isSplitArchive())
        if (this.hasZipFile) {
            zipModel.setZipFile(this.zipFile)
        }
        zipModel.setZip64EndOfCentralDirectoryLocator(this.getZip64EndOfCentralDirectoryLocator())
        zipModel.setZip64EndOfCentralDirectoryRecord(this.getZip64EndOfCentralDirectoryRecord())
        zipModel.setZip64Format(this.isZip64Format())
        zipModel.setNestedZipFile(this.isNestedZipFile())
        zipModel.setStart(this.getStart())
        zipModel.setEnd(this.getEnd())
        zipModel.setSplitLength(this.getSplitLength())
        return zipModel
    }
}