package azgracompress.compression;

import azgracompress.cache.ICacheFile;
import azgracompress.data.V3i;
import azgracompress.fileformat.QuantizationType;
import azgracompress.io.InputData;

/**
 * Options for the compressor/decompressor.
 */
public class CompressionOptions implements Cloneable {

    public enum CodebookType {
        Individual,
        MiddlePlane,
        Global,
        Invalid
    }

    /**
     * Input image or compressed file.
     */
    private InputData inputDataInfo;

    /**
     * Output image or compressed file.
     */
    private String outputFilePath;

    /**
     * Type of quantization.
     */
    private QuantizationType quantizationType;

    /**
     * Type of the codebook.
     */
    private CodebookType codebookType = CodebookType.Individual;

    /**
     * Directory which contains codebook caches.
     */
    private String codebookCacheFolder = null;

    /**
     * Number of bits, which are used to encode single codebook index.
     */
    private int bitsPerCodebookIndex = 8;

    /**
     * Dimensions of the quantization vector.
     */
    private V3i quantizationVector = new V3i(0);

    /**
     * Number of workers to be used for different operations.
     */
    private int workerCount = 1;

    /**
     * Flag whether the CLI app should be verbose while running.
     */
    private boolean verbose = false;

    public CompressionOptions() {
        final int cores = Runtime.getRuntime().availableProcessors();
        this.workerCount = (cores / 2);
    }

    public CompressionOptions(final ICacheFile codebookCacheFile) {
        this();
        quantizationType = codebookCacheFile.getHeader().getQuantizationType();
        codebookType = CodebookType.Global;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    /**
     * Create clone of this object.
     *
     * @return Cloned object.
     */
    public CompressionOptions createClone() {
        try {
            return (CompressionOptions) clone();
        } catch (final CloneNotSupportedException e) {
            return null;
        }
    }

    public void setVerbose(final boolean verbose) {
        this.verbose = verbose;
    }

    // NOTE(Moravec): Generated getters and setters for the private fields.

    public boolean isVerbose() {
        return verbose;
    }

    public InputData getInputDataInfo() {
        return inputDataInfo;
    }

    public void setInputDataInfo(final InputData ifi) {
        this.inputDataInfo = ifi;
    }

    public String getOutputFilePath() {
        return outputFilePath;
    }

    public void setOutputFilePath(final String outputFilePath) {
        this.outputFilePath = outputFilePath;
    }

    public QuantizationType getQuantizationType() {
        return quantizationType;
    }

    public void setQuantizationType(final QuantizationType quantizationType) {
        this.quantizationType = quantizationType;
    }

    public String getCodebookCacheFolder() {
        return codebookCacheFolder;
    }

    public void setCodebookCacheFolder(final String codebookCacheFolder) {
        this.codebookCacheFolder = codebookCacheFolder;
    }

    public int getBitsPerCodebookIndex() {
        return bitsPerCodebookIndex;
    }

    public void setBitsPerCodebookIndex(final int bitsPerCodebookIndex) {
        this.bitsPerCodebookIndex = bitsPerCodebookIndex;
    }

    public V3i getQuantizationVector() {
        return quantizationVector;
    }

    public void setQuantizationVector(final V3i quantizationVector) {
        this.quantizationVector = quantizationVector;
    }

    public int getWorkerCount() {
        return workerCount;
    }

    public void setWorkerCount(final int workerCount) {
        this.workerCount = workerCount;
    }

    public CodebookType getCodebookType() {
        return codebookType;
    }

    public void setCodebookType(final CodebookType codebookType) {
        this.codebookType = codebookType;
    }

    public boolean isConsoleApplication() {
        return false;
    }

}