using System;
using System.Security.Cryptography;

namespace GostCryptography
{
    static class ExceptionUtility
    {
        public static ArgumentException Argument(string argument, string message = null, params object[] messageParameters)
        {
            return new ArgumentException(FormatErrorMessage(message, messageParameters), argument);
        }

        public static ArgumentNullException ArgumentNull(string argument, string message = null, params object[] messageParameters)
        {
            return new ArgumentNullException(argument, FormatErrorMessage(message, messageParameters));
        }

        public static ArgumentOutOfRangeException ArgumentOutOfRange(string argument, string message = null, params object[] messageParameters)
        {
            return new ArgumentOutOfRangeException(argument, FormatErrorMessage(message, messageParameters));
        }

        public static NotSupportedException NotSupported(string message = null, params object[] messageParameters)
        {
            return new NotSupportedException(FormatErrorMessage(message, messageParameters));
        }

        public static CryptographicException CryptographicException(int nativeError)
        {
            return new CryptographicException(nativeError);
        }

        public static CryptographicException CryptographicException(string message = null, params object[] messageParameters)
        {
            return new CryptographicException(FormatErrorMessage(message, messageParameters));
        }

        public static CryptographicException CryptographicException(Exception innerException, string message = null, params object[] messageParameters)
        {
            return new CryptographicException(FormatErrorMessage(message, messageParameters), innerException);
        }

        private static string FormatErrorMessage(string message, params object[] messageParameters)
        {
            return (message != null && messageParameters != null) ? string.Format(message, messageParameters) : message;
        }
    }
}
