using System.Net.Security;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;

namespace NetCoreServer
{
    /// <summary>
    /// SSL context
    /// </summary>
    public class SslContext
    {
        /// <summary>
        /// Initialize SSL context with default protocols
        /// </summary>
        public SslContext() : this(SslProtocols.Tls13) {}
        /// <summary>
        /// Initialize SSL context with given protocols
        /// </summary>
        /// <param name="protocols">SSL protocols</param>
        public SslContext(SslProtocols protocols) { Protocols = protocols; }
        /// <summary>
        /// Initialize SSL context with given protocols and validation callback
        /// </summary>
        /// <param name="protocols">SSL protocols</param>
        /// <param name="certificateValidationCallback">SSL certificate</param>
        public SslContext(SslProtocols protocols, RemoteCertificateValidationCallback certificateValidationCallback)
        {
            Protocols = protocols;
            CertificateValidationCallback = certificateValidationCallback;
        }
        /// <summary>
        /// Initialize SSL context with given protocols and certificate
        /// </summary>
        /// <param name="protocols">SSL protocols</param>
        /// <param name="certificate">SSL certificate</param>
        public SslContext(SslProtocols protocols, X509Certificate certificate) : this(protocols, certificate, null) {}
        /// <summary>
        /// Initialize SSL context with given protocols, certificate and validation callback
        /// </summary>
        /// <param name="protocols">SSL protocols</param>
        /// <param name="certificate">SSL certificate</param>
        /// <param name="certificateValidationCallback">SSL certificate</param>
        public SslContext(SslProtocols protocols, X509Certificate certificate, RemoteCertificateValidationCallback certificateValidationCallback)
        {
            Protocols = protocols;
            Certificate = certificate;
            CertificateValidationCallback = certificateValidationCallback;
        }
        /// <summary>
        /// Initialize SSL context with given protocols and certificates collection
        /// </summary>
        /// <param name="protocols">SSL protocols</param>
        /// <param name="certificates">SSL certificates collection</param>
        public SslContext(SslProtocols protocols, X509Certificate2Collection certificates) : this(protocols, certificates, null) {}
        /// <summary>
        /// Initialize SSL context with given protocols, certificates collection and validation callback
        /// </summary>
        /// <param name="protocols">SSL protocols</param>
        /// <param name="certificates">SSL certificates collection</param>
        /// <param name="certificateValidationCallback">SSL certificate</param>
        public SslContext(SslProtocols protocols, X509Certificate2Collection certificates, RemoteCertificateValidationCallback certificateValidationCallback)
        {
            Protocols = protocols;
            Certificates = certificates;
            CertificateValidationCallback = certificateValidationCallback;
        }

        /// <summary>
        /// SSL protocols
        /// </summary>
        public SslProtocols Protocols { get; set; }
        /// <summary>
        /// SSL certificate
        /// </summary>
        public X509Certificate Certificate { get; set; }
        /// <summary>
        /// SSL certificates collection
        /// </summary>
        public X509Certificate2Collection Certificates { get; set; }
        /// <summary>
        /// SSL certificate validation callback
        /// </summary>
        public RemoteCertificateValidationCallback CertificateValidationCallback { get; set; }

        /// <summary>
        /// Is the client is asked for a certificate for authentication.
        /// Note that this is only a request - if no certificate is provided, the server still accepts the connection request.
        /// </summary>
        public bool ClientCertificateRequired { get; set; }
    }
}