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

package org.bouncycastle.asn1.cms;

import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.DERTaggedObject;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.ASN1TaggedObject;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.tsp.EvidenceRecord;
import org.bouncycastle.asn1.ASN1Choice;
import org.bouncycastle.asn1.ASN1Object;

public class Evidence extends ASN1Object implements ASN1Choice
{
    private TimeStampTokenEvidence tstEvidence;
    private EvidenceRecord ersEvidence;
    private ASN1Sequence otherEvidence;
    
    public Evidence(final TimeStampTokenEvidence tstEvidence) {
        this.tstEvidence = tstEvidence;
    }
    
    public Evidence(final EvidenceRecord ersEvidence) {
        this.ersEvidence = ersEvidence;
    }
    
    private Evidence(final ASN1TaggedObject asn1TaggedObject) {
        if (asn1TaggedObject.getTagNo() == 0) {
            this.tstEvidence = TimeStampTokenEvidence.getInstance(asn1TaggedObject, false);
        }
        else if (asn1TaggedObject.getTagNo() == 1) {
            this.ersEvidence = EvidenceRecord.getInstance(asn1TaggedObject, false);
        }
        else {
            if (asn1TaggedObject.getTagNo() != 2) {
                throw new IllegalArgumentException("unknown tag in Evidence");
            }
            this.otherEvidence = ASN1Sequence.getInstance(asn1TaggedObject, false);
        }
    }
    
    public static Evidence getInstance(final Object o) {
        if (o == null || o instanceof Evidence) {
            return (Evidence)o;
        }
        if (o instanceof ASN1TaggedObject) {
            return new Evidence(ASN1TaggedObject.getInstance(o, 128));
        }
        throw new IllegalArgumentException("unknown object in getInstance");
    }
    
    public static Evidence getInstance(final ASN1TaggedObject asn1TaggedObject, final boolean b) {
        if (!b) {
            throw new IllegalArgumentException("choice item must be explicitly tagged");
        }
        return getInstance(asn1TaggedObject.getExplicitBaseObject());
    }
    
    public TimeStampTokenEvidence getTstEvidence() {
        return this.tstEvidence;
    }
    
    public EvidenceRecord getErsEvidence() {
        return this.ersEvidence;
    }
    
    @Override
    public ASN1Primitive toASN1Primitive() {
        if (this.tstEvidence != null) {
            return new DERTaggedObject(false, 0, this.tstEvidence);
        }
        if (this.ersEvidence != null) {
            return new DERTaggedObject(false, 1, this.ersEvidence);
        }
        return new DERTaggedObject(false, 2, this.otherEvidence);
    }
}
