// 
// Decompiled by Procyon v0.6.0
// 

package io.netty.handler.ssl;

import io.netty.util.internal.ObjectUtil;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Collections;
import java.util.Arrays;
import java.util.List;

public final class OpenSslCertificateCompressionConfig implements Iterable<AlgorithmConfig>
{
    private final List<AlgorithmConfig> pairList;
    
    private OpenSslCertificateCompressionConfig(final AlgorithmConfig... pairs) {
        this.pairList = Collections.unmodifiableList((List<? extends AlgorithmConfig>)Arrays.asList((T[])pairs));
    }
    
    @Override
    public Iterator<AlgorithmConfig> iterator() {
        return this.pairList.iterator();
    }
    
    public static Builder newBuilder() {
        return new Builder();
    }
    
    public static final class Builder
    {
        private final List<AlgorithmConfig> algorithmList;
        
        private Builder() {
            this.algorithmList = new ArrayList<AlgorithmConfig>();
        }
        
        public Builder addAlgorithm(final OpenSslCertificateCompressionAlgorithm algorithm, final AlgorithmMode mode) {
            this.algorithmList.add(new AlgorithmConfig(algorithm, mode));
            return this;
        }
        
        public OpenSslCertificateCompressionConfig build() {
            return new OpenSslCertificateCompressionConfig(this.algorithmList.toArray(new AlgorithmConfig[0]), null);
        }
    }
    
    public static final class AlgorithmConfig
    {
        private final OpenSslCertificateCompressionAlgorithm algorithm;
        private final AlgorithmMode mode;
        
        private AlgorithmConfig(final OpenSslCertificateCompressionAlgorithm algorithm, final AlgorithmMode mode) {
            this.algorithm = ObjectUtil.checkNotNull(algorithm, "algorithm");
            this.mode = ObjectUtil.checkNotNull(mode, "mode");
        }
        
        public AlgorithmMode mode() {
            return this.mode;
        }
        
        public OpenSslCertificateCompressionAlgorithm algorithm() {
            return this.algorithm;
        }
    }
    
    public enum AlgorithmMode
    {
        Compress, 
        Decompress, 
        Both;
    }
}
