NamingAuthority
using Org.BouncyCastle.Asn1.X500;
using Org.BouncyCastle.Utilities;
using System;
using System.Collections.Generic;
namespace Org.BouncyCastle.Asn1.IsisMtt.X509
{
    public class NamingAuthority : Asn1Encodable
    {
        public static readonly DerObjectIdentifier IdIsisMttATNamingAuthoritiesRechtWirtschaftSteuern = new DerObjectIdentifier(IsisMttObjectIdentifiers.IdIsisMttATNamingAuthorities?.ToString() + ".1");
        private readonly DerObjectIdentifier namingAuthorityID;
        private readonly string namingAuthorityUrl;
        private readonly DirectoryString namingAuthorityText;
        public virtual DerObjectIdentifier NamingAuthorityID => namingAuthorityID;
        public virtual DirectoryString NamingAuthorityText => namingAuthorityText;
        public virtual string NamingAuthorityUrl => namingAuthorityUrl;
        public static NamingAuthority GetInstance(object obj)
        {
            if (obj == null || obj is NamingAuthority)
                return (NamingAuthority)obj;
            Asn1Sequence asn1Sequence = obj as Asn1Sequence;
            if (asn1Sequence != null)
                return new NamingAuthority(asn1Sequence);
            throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
        }
        public static NamingAuthority GetInstance(Asn1TaggedObject obj, bool isExplicit)
        {
            return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit));
        }
        private NamingAuthority(Asn1Sequence seq)
        {
            if (seq.Count > 3)
                throw new ArgumentException("Bad sequence size: " + seq.Count.ToString());
            IEnumerator<Asn1Encodable> enumerator = seq.GetEnumerator();
            if (enumerator.MoveNext()) {
                Asn1Encodable current = enumerator.Current;
                DerObjectIdentifier derObjectIdentifier = current as DerObjectIdentifier;
                if (derObjectIdentifier != null)
                    namingAuthorityID = derObjectIdentifier;
                else {
                    DerIA5String derIA5String = current as DerIA5String;
                    if (derIA5String != null)
                        namingAuthorityUrl = derIA5String.GetString();
                    else {
                        if (!(current is IAsn1String))
                            throw new ArgumentException("Bad object encountered: " + Platform.GetTypeName(current));
                        namingAuthorityText = DirectoryString.GetInstance(current);
                    }
                }
            }
            if (enumerator.MoveNext()) {
                Asn1Encodable current2 = enumerator.Current;
                DerIA5String derIA5String2 = current2 as DerIA5String;
                if (derIA5String2 != null)
                    namingAuthorityUrl = derIA5String2.GetString();
                else {
                    if (!(current2 is IAsn1String))
                        throw new ArgumentException("Bad object encountered: " + Platform.GetTypeName(current2));
                    namingAuthorityText = DirectoryString.GetInstance(current2);
                }
            }
            if (enumerator.MoveNext()) {
                Asn1Encodable current3 = enumerator.Current;
                if (!(current3 is IAsn1String))
                    throw new ArgumentException("Bad object encountered: " + Platform.GetTypeName(current3));
                namingAuthorityText = DirectoryString.GetInstance(current3);
            }
        }
        public NamingAuthority(DerObjectIdentifier namingAuthorityID, string namingAuthorityUrl, DirectoryString namingAuthorityText)
        {
            this.namingAuthorityID = namingAuthorityID;
            this.namingAuthorityUrl = namingAuthorityUrl;
            this.namingAuthorityText = namingAuthorityText;
        }
        public override Asn1Object ToAsn1Object()
        {
            Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector(3);
            asn1EncodableVector.AddOptional(namingAuthorityID);
            if (namingAuthorityUrl != null)
                asn1EncodableVector.Add(new DerIA5String(namingAuthorityUrl, true));
            asn1EncodableVector.AddOptional(namingAuthorityText);
            return new DerSequence(asn1EncodableVector);
        }
    }
}