using System.Configuration;
using Kreta.Core.MessageBroker.Configuration.IntegratedMessageClient;
using Validators = Kreta.Core.Configuration.Validators;
namespace Kreta.MessageBroker.Configuration
{
    /// 
    /// Message client configuration element
    /// 
    class MessageClientConfigurationElement : ConfigurationElement, IIntegratedMessageClientConfiguration
    {
        /// 
        /// Element name
        /// 
        public const string ElementName = "Client";
        /// 
        /// Client name
        /// 
        [ConfigurationProperty(nameof(Name), IsRequired = true, DefaultValue = Validators.StringValidator.SkipValidationForDefaultValue)]
        [Validators.StringValidator(false, MaxLength = 128)]
        public string Name
        {
            get
            {
                return (string)this[nameof(Name)];
            }
        }
        string IIntegratedMessageClientConfiguration.EndpointClientName => this.Name;
        /// 
        /// Message signature key
        /// 
        [ConfigurationProperty(nameof(MessageSignatureKey), IsRequired = true, DefaultValue = Validators.StringValidator.SkipValidationForDefaultValue)]
        [Validators.StringValidator(false, MinLength = 32, MaxLength = 128)]
        public string MessageSignatureKey
        {
            get
            {
                return (string)this[nameof(MessageSignatureKey)];
            }
        }
        [ConfigurationProperty(nameof(QueueSize), DefaultValue = 0)]
        public int QueueSize
        {
            get
            {
                return (int)this[nameof(QueueSize)];
            }
        }
        [ConfigurationProperty(nameof(ClientPoolSize), DefaultValue = 8)]
        [Validators.IntegerValidator(MinValue = 1)]
        public int ClientPoolSize
        {
            get
            {
                return (int)this[nameof(ClientPoolSize)];
            }
        }
        [ConfigurationProperty(nameof(CreateNewClientAfterErrorsCount), DefaultValue = 20)]
        [Validators.IntegerValidator(MinValue = 3)]
        public int CreateNewClientAfterErrorsCount
        {
            get
            {
                return (int)this[nameof(CreateNewClientAfterErrorsCount)];
            }
        }
        int? IIntegratedMessageClientConfiguration.CreateNewClientAfterErrorsCount => this.CreateNewClientAfterErrorsCount == 0 ? (int?)null : this.CreateNewClientAfterErrorsCount;
        /// 
        /// Enable logging
        /// 
        [ConfigurationProperty(nameof(EnableLogging), IsRequired = true)]
        public bool EnableLogging
        {
            get
            {
                return (bool)this[nameof(EnableLogging)];
            }
        }
        bool IIntegratedMessageClientConfiguration.IsLoggingEnabled => this.EnableLogging;
        [ConfigurationProperty(nameof(LoggerType), DefaultValue = LoggerType.Log4Net)]
        public LoggerType LoggerType
        {
            get
            {
                return (LoggerType)this[nameof(LoggerType)];
            }
        }
        [ConfigurationProperty(nameof(SerilogLogger))]
        public SerilogConfigurationElement SerilogLogger
        {
            get
            {
                return (SerilogConfigurationElement)this[nameof(SerilogLogger)];
            }
        }
        [ConfigurationProperty(nameof(CalculateBackOffTimeSpan), DefaultValue = true)]
        public bool CalculateBackOffTimeSpan
        {
            get
            {
                return (bool)this[nameof(CalculateBackOffTimeSpan)];
            }
        }
    }
}