using Hcs.Client.Internal;
using Hcs.Client.Logger;
using Hcs.Client.MessageCapturer;
using System.Security.Cryptography.X509Certificates;

namespace Hcs.Client
{
    public abstract class ClientBase
    {
        /// <summary>
        /// Идентификатор поставщика данных ГИС ЖКХ
        /// </summary>
        public string OrgPPAGUID { get; set; }

        /// <summary>
        /// Исполнитель/сотрудник ГИС ЖКХ, от которого будут регистрироваться ответы
        /// </summary>
        public string ExecutorGUID { get; set; }

        /// <summary>
        /// Признак, указывающий на то, что используется ли внешний туннель (stunnel)
        /// </summary>
        public bool UseTunnel { get; set; }

        /// <summary>
        /// Если true, то запросы будут выполняться на промышленном стенде, иначе - на тестовом
        /// </summary>
        public bool IsPPAK { get; set; }

        /// <summary>
        /// Роль
        /// </summary>
        public OrganizationRole Role { get; set; }

        /// <summary>
        /// Устанавливаемый пользователем приемник отладочных сообщений
        /// </summary>
        public ILogger Logger { get; set; }

        /// <summary>
        /// Устанавливаемый пользователем механизм перехвата содержимого отправляемых 
        /// и принимаемых пакетов
        /// </summary>
        public IMessageCapturer MessageCapturer { get; set; }

        /// <summary>
        /// Сертификат клиента для применения при формировании запросов
        /// </summary>
        internal X509Certificate2 Certificate { get; set; }

        /// <summary>
        /// Тип криптопровайдера, полученный из сертификата
        /// </summary>
        internal GostXades.CryptoProviderTypeEnum CryptoProviderType { get; set; }

        internal GostCryptography.Base.ProviderType GostCryptoProviderType =>
            (GostCryptography.Base.ProviderType)CryptoProviderType;

        /// <summary>
        /// Отпечаток сертификата
        /// </summary>
        internal string CertificateThumbprint { get; set; }

        /// <summary>
        /// Пароль доступа к сертификату
        /// </summary>
        internal string CertificatePassword { get; set; }

        internal string ComposeEndpointUri(string endpointName)
        {
            if (UseTunnel)
            {
                return $"http://{Constants.URI_TUNNEL}/{endpointName}";
            }

            return IsPPAK
                ? $"https://{Constants.URI_PPAK}/{endpointName}"
                : $"https://{Constants.URI_SIT_02}/{endpointName}";
        }

        /// <summary>
        /// Пробует вывести сообщение в установленный приемник отладочных сообщений
        /// </summary>
        internal void TryLog(string message)
        {
            Logger?.WriteLine(message);
        }

        /// <summary>
        /// Пробует отправить тело сообщения в установленный перехватчик
        /// </summary>
        internal void TryCaptureMessage(bool sent, string messageBody)
        {
            MessageCapturer?.CaptureMessage(sent, messageBody);
        }
    }
}
