namespace Renci.SshNet.TestTools.OpenSSH
{
    public sealed class Cipher
    {
        public static readonly Cipher TripledesCbc = new Cipher("3des-cbc");
        public static readonly Cipher Aes128Cbc = new Cipher("aes128-cbc");
        public static readonly Cipher Aes192Cbc = new Cipher("aes192-cbc");
        public static readonly Cipher Aes256Cbc = new Cipher("aes256-cbc");
        public static readonly Cipher RijndaelCbc = new Cipher("rijndael-cbc@lysator.liu.se");
        public static readonly Cipher Aes128Ctr = new Cipher("aes128-ctr");
        public static readonly Cipher Aes192Ctr = new Cipher("aes192-ctr");
        public static readonly Cipher Aes256Ctr = new Cipher("aes256-ctr");
        public static readonly Cipher Aes128Gcm = new Cipher("aes128-gcm@openssh.com");
        public static readonly Cipher Aes256Gcm = new Cipher("aes256-gcm@openssh.com");
        public static readonly Cipher Arcfour = new Cipher("arcfour");
        public static readonly Cipher Arcfour128 = new Cipher("arcfour128");
        public static readonly Cipher Arcfour256 = new Cipher("arcfour256");
        public static readonly Cipher BlowfishCbc = new Cipher("blowfish-cbc");
        public static readonly Cipher Cast128Cbc = new Cipher("cast128-cbc");
        public static readonly Cipher Chacha20Poly1305 = new Cipher("chacha20-poly1305@openssh.com");

        public Cipher(string name)
        {
            Name = name;
        }

        public string Name { get; }

        public override bool Equals(object? obj)
        {
            if (obj == null)
            {
                return false;
            }

            if (obj is Cipher otherCipher)
            {
                return otherCipher.Name == Name;
            }

            return false;
        }

        public override int GetHashCode()
        {
            return Name.GetHashCode();
        }

        public override string ToString()
        {
            return Name;
        }
    }
}
