#pragma once

#include "ehs/EHS.h"
#include "ehs/Str.h"
#include "TCP.h"
#include "Request.h"
#include "Response.h"

typedef struct ssl_ctx_st SSL_CTX;
typedef struct ssl_st SSL;

namespace ehs
{
    /// A class for handling the HTTP(S) TCP socket layer.
	class EHS_LIB_IO SSL : public TCP
    {
    private:
        SSL_CTX* ctx;
        ::SSL* sslHdl;

    public:
        ~SSL() override;

        SSL();

		SSL(const IP type);

		SSL(TCP&& tcp) noexcept;

		SSL(const TCP& tcp);

        SSL(const SSL& ssl);

        SSL& operator=(const SSL& ssl);

        void Initialize() override;

        void Release() override;

		void Bind(const Str_8& address, unsigned short port) override;

        SSL* Accept() override;

        void Connect(const Str_8& address, const UInt_16 port) override;

		UInt_64 Send(const Byte* const buffer, const UInt_32 size) override;

		UInt_64 Receive(Byte* const buffer, const UInt_32 size) override;

		void UseCertificate(const Byte* data, const UInt_64 size);

		void UsePrivateKey(const Byte* data, const UInt_64 size);

		bool IsValid();
    };
}