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

package com.nimbusds.jose.jwk;

import java.util.Set;
import java.util.HashSet;
import java.security.cert.X509Certificate;
import java.text.ParseException;
import java.util.Objects;
import java.io.Serializable;

public final class KeyUse implements Serializable
{
    private static final long serialVersionUID = 1L;
    public static final KeyUse SIGNATURE;
    public static final KeyUse ENCRYPTION;
    private final String identifier;
    
    public KeyUse(final String identifier) {
        if (identifier == null) {
            throw new IllegalArgumentException("The key use identifier must not be null");
        }
        this.identifier = identifier;
    }
    
    public String identifier() {
        return this.identifier;
    }
    
    public String getValue() {
        return this.identifier();
    }
    
    @Override
    public String toString() {
        return this.identifier();
    }
    
    @Override
    public boolean equals(final Object o) {
        if (this == o) {
            return true;
        }
        if (!(o instanceof KeyUse)) {
            return false;
        }
        final KeyUse keyUse = (KeyUse)o;
        return Objects.equals(this.identifier, keyUse.identifier);
    }
    
    @Override
    public int hashCode() {
        return Objects.hash(this.identifier);
    }
    
    public static KeyUse parse(final String s) throws ParseException {
        if (s == null) {
            return null;
        }
        if (s.equals(KeyUse.SIGNATURE.identifier())) {
            return KeyUse.SIGNATURE;
        }
        if (s.equals(KeyUse.ENCRYPTION.identifier())) {
            return KeyUse.ENCRYPTION;
        }
        if (s.trim().isEmpty()) {
            throw new ParseException("JWK use value must not be empty or blank", 0);
        }
        return new KeyUse(s);
    }
    
    public static KeyUse from(final X509Certificate cert) {
        if (cert.getKeyUsage() == null) {
            return null;
        }
        final Set<KeyUse> foundUses = new HashSet<KeyUse>();
        if (cert.getKeyUsage()[0] || cert.getKeyUsage()[1]) {
            foundUses.add(KeyUse.SIGNATURE);
        }
        if (cert.getKeyUsage()[0] && cert.getKeyUsage()[2]) {
            foundUses.add(KeyUse.ENCRYPTION);
        }
        if (cert.getKeyUsage()[0] && cert.getKeyUsage()[4]) {
            foundUses.add(KeyUse.ENCRYPTION);
        }
        if (cert.getKeyUsage()[2] || cert.getKeyUsage()[3] || cert.getKeyUsage()[4]) {
            foundUses.add(KeyUse.ENCRYPTION);
        }
        if (cert.getKeyUsage()[5] || cert.getKeyUsage()[6]) {
            foundUses.add(KeyUse.SIGNATURE);
        }
        if (foundUses.size() == 1) {
            return foundUses.iterator().next();
        }
        return null;
    }
    
    static {
        SIGNATURE = new KeyUse("sig");
        ENCRYPTION = new KeyUse("enc");
    }
}
