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

package com.google.crypto.tink.internal;

import java.util.Collections;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import java.util.HashMap;
import java.security.GeneralSecurityException;
import java.util.Map;
import com.google.errorprone.annotations.Immutable;

@Immutable
public final class EnumTypeProtoConverter<E extends Enum<E>, O>
{
    private final Map<E, O> fromProtoEnumMap;
    private final Map<O, E> toProtoEnumMap;
    
    private EnumTypeProtoConverter(final Map<E, O> fromProtoEnumMap, final Map<O, E> toProtoEnumMap) {
        this.fromProtoEnumMap = fromProtoEnumMap;
        this.toProtoEnumMap = toProtoEnumMap;
    }
    
    public static <E extends Enum<E>, O> Builder<E, O> builder() {
        return new Builder<E, O>();
    }
    
    public E toProtoEnum(final O objectEnum) throws GeneralSecurityException {
        final E protoEnum = this.toProtoEnumMap.get(objectEnum);
        if (protoEnum == null) {
            throw new GeneralSecurityException("Unable to convert object enum: " + objectEnum);
        }
        return protoEnum;
    }
    
    public O fromProtoEnum(final E protoEnum) throws GeneralSecurityException {
        final O objectEnum = this.fromProtoEnumMap.get(protoEnum);
        if (objectEnum == null) {
            throw new GeneralSecurityException("Unable to convert proto enum: " + protoEnum);
        }
        return objectEnum;
    }
    
    public static final class Builder<E extends Enum<E>, O>
    {
        Map<E, O> fromProtoEnumMap;
        Map<O, E> toProtoEnumMap;
        
        private Builder() {
            this.fromProtoEnumMap = new HashMap<E, O>();
            this.toProtoEnumMap = new HashMap<O, E>();
        }
        
        @CanIgnoreReturnValue
        public Builder<E, O> add(final E protoEnum, final O objectEnum) {
            this.fromProtoEnumMap.put(protoEnum, objectEnum);
            this.toProtoEnumMap.put(objectEnum, protoEnum);
            return this;
        }
        
        public EnumTypeProtoConverter<E, O> build() {
            return new EnumTypeProtoConverter<E, O>(Collections.unmodifiableMap((Map<?, ?>)this.fromProtoEnumMap), Collections.unmodifiableMap((Map<?, ?>)this.toProtoEnumMap), null);
        }
    }
}
