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

package org.bouncycastle.oer.its.ieee1609dot2;

import java.math.BigInteger;
import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.oer.OEROptional;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.ASN1Integer;
import org.bouncycastle.asn1.ASN1Object;

public class PsidGroupPermissions extends ASN1Object
{
    private final SubjectPermissions subjectPermissions;
    private final ASN1Integer minChainLength;
    private final ASN1Integer chainLengthRange;
    private final EndEntityType eeType;
    
    private PsidGroupPermissions(final ASN1Sequence asn1Sequence) {
        if (asn1Sequence.size() != 4) {
            throw new IllegalArgumentException("expected sequence size of 4");
        }
        this.subjectPermissions = SubjectPermissions.getInstance(asn1Sequence.getObjectAt(0));
        this.minChainLength = OEROptional.getInstance(asn1Sequence.getObjectAt(1)).getObject(ASN1Integer.class);
        this.chainLengthRange = OEROptional.getInstance(asn1Sequence.getObjectAt(2)).getObject(ASN1Integer.class);
        this.eeType = OEROptional.getInstance(asn1Sequence.getObjectAt(3)).getObject(EndEntityType.class);
    }
    
    public PsidGroupPermissions(final SubjectPermissions subjectPermissions, final ASN1Integer minChainLength, final ASN1Integer chainLengthRange, final EndEntityType eeType) {
        this.subjectPermissions = subjectPermissions;
        this.minChainLength = minChainLength;
        this.chainLengthRange = chainLengthRange;
        this.eeType = eeType;
    }
    
    public static PsidGroupPermissions getInstance(final Object o) {
        if (o instanceof PsidGroupPermissions) {
            return (PsidGroupPermissions)o;
        }
        if (o != null) {
            return new PsidGroupPermissions(ASN1Sequence.getInstance(o));
        }
        return null;
    }
    
    public static Builder builder() {
        return new Builder();
    }
    
    public SubjectPermissions getSubjectPermissions() {
        return this.subjectPermissions;
    }
    
    public ASN1Integer getMinChainLength() {
        return this.minChainLength;
    }
    
    public EndEntityType getEeType() {
        return this.eeType;
    }
    
    @Override
    public ASN1Primitive toASN1Primitive() {
        return new DERSequence(new ASN1Encodable[] { this.subjectPermissions, OEROptional.getInstance(this.minChainLength), OEROptional.getInstance(this.chainLengthRange), OEROptional.getInstance(this.eeType) });
    }
    
    public ASN1Integer getChainLengthRange() {
        return this.chainLengthRange;
    }
    
    public static class Builder
    {
        private SubjectPermissions subjectPermissions;
        private ASN1Integer minChainLength;
        private ASN1Integer chainLengthRange;
        private EndEntityType eeType;
        
        public Builder setSubjectPermissions(final SubjectPermissions subjectPermissions) {
            this.subjectPermissions = subjectPermissions;
            return this;
        }
        
        public Builder setMinChainLength(final BigInteger bigInteger) {
            this.minChainLength = new ASN1Integer(bigInteger);
            return this;
        }
        
        public Builder setMinChainLength(final long n) {
            this.minChainLength = new ASN1Integer(n);
            return this;
        }
        
        public Builder setChainLengthRange(final ASN1Integer chainLengthRange) {
            this.chainLengthRange = chainLengthRange;
            return this;
        }
        
        public Builder setMinChainLength(final ASN1Integer minChainLength) {
            this.minChainLength = minChainLength;
            return this;
        }
        
        public Builder setChainLengthRange(final BigInteger bigInteger) {
            this.chainLengthRange = new ASN1Integer(bigInteger);
            return this;
        }
        
        public Builder setChainLengthRange(final long n) {
            this.chainLengthRange = new ASN1Integer(n);
            return this;
        }
        
        public Builder setEeType(final EndEntityType eeType) {
            this.eeType = eeType;
            return this;
        }
        
        public PsidGroupPermissions createPsidGroupPermissions() {
            return new PsidGroupPermissions(this.subjectPermissions, this.minChainLength, this.chainLengthRange, this.eeType);
        }
    }
}
