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

package org.bouncycastle.oer.its.ieee1609dot2;

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.oer.its.ieee1609dot2.basetypes.GroupLinkageValue;
import org.bouncycastle.oer.its.ieee1609dot2.basetypes.LinkageValue;
import org.bouncycastle.oer.its.ieee1609dot2.basetypes.IValue;
import org.bouncycastle.asn1.ASN1Object;

public class LinkageData extends ASN1Object
{
    private final IValue iCert;
    private final LinkageValue linkageValue;
    private final GroupLinkageValue groupLinkageValue;
    
    public LinkageData(final IValue iCert, final LinkageValue linkageValue, final GroupLinkageValue groupLinkageValue) {
        this.iCert = iCert;
        this.linkageValue = linkageValue;
        this.groupLinkageValue = groupLinkageValue;
    }
    
    private LinkageData(final ASN1Sequence asn1Sequence) {
        if (asn1Sequence.size() != 3) {
            throw new IllegalArgumentException("expected sequence size of 3");
        }
        this.iCert = IValue.getInstance(asn1Sequence.getObjectAt(0));
        this.linkageValue = LinkageValue.getInstance(asn1Sequence.getObjectAt(1));
        this.groupLinkageValue = OEROptional.getValue(GroupLinkageValue.class, asn1Sequence.getObjectAt(2));
    }
    
    public static LinkageData getInstance(final Object o) {
        if (o instanceof LinkageData) {
            return (LinkageData)o;
        }
        if (o != null) {
            return new LinkageData(ASN1Sequence.getInstance(o));
        }
        return null;
    }
    
    public IValue getICert() {
        return this.iCert;
    }
    
    public LinkageValue getLinkageValue() {
        return this.linkageValue;
    }
    
    public GroupLinkageValue getGroupLinkageValue() {
        return this.groupLinkageValue;
    }
    
    @Override
    public ASN1Primitive toASN1Primitive() {
        return new DERSequence(new ASN1Encodable[] { this.iCert, this.linkageValue, OEROptional.getInstance(this.groupLinkageValue) });
    }
    
    public static Builder builder() {
        return new Builder();
    }
    
    public static class Builder
    {
        private IValue iCert;
        private LinkageValue linkageValue;
        private GroupLinkageValue groupLinkageValue;
        
        public Builder setICert(final IValue iCert) {
            this.iCert = iCert;
            return this;
        }
        
        public Builder setLinkageValue(final LinkageValue linkageValue) {
            this.linkageValue = linkageValue;
            return this;
        }
        
        public Builder setGroupLinkageValue(final GroupLinkageValue groupLinkageValue) {
            this.groupLinkageValue = groupLinkageValue;
            return this;
        }
        
        public LinkageData createLinkageData() {
            return new LinkageData(this.iCert, this.linkageValue, this.groupLinkageValue);
        }
    }
}
