// #pragma once

// #include <cstdint>
// #include <limits>
// #include <vector>
// #include <openssl/ssl.h>

// struct ServerSession
// {
//     bool initialized{false};
//     bool has_session{false};
//     bool dek_ready{false};
//     uint64_t session_handle{std::numeric_limits<uint64_t>::max()};
//     SSL_CTX* ssl_ctx{nullptr};
//     SSL* ssl{nullptr};
//     std::vector<uint8_t> dek_buffer;

//     void Reset()
//     {
//         dek_ready = false;
//         dek_buffer.clear();
//         session_handle = std::numeric_limits<uint64_t>::max();
//         if (ssl)
//         {
//             SSL_free(ssl);
//             ssl = nullptr;
//         }
//         has_session = false;
//     }

//     void Shutdown()
//     {
//         Reset();
//         if (ssl_ctx)
//         {
//             SSL_CTX_free(ssl_ctx);
//             ssl_ctx = nullptr;
//         }
//         initialized = false;
//     }
// };

#pragma once

#include <cstdint>
#include <cstring>
#include <limits>
#include <vector>
#include <openssl/ssl.h>

struct ServerSession
{
    bool initialized{false};
    bool has_session{false};
    bool dek_ready{false};
    bool sealed_dek_ready{false};
    uint64_t session_handle{std::numeric_limits<uint64_t>::max()};
    SSL_CTX* ssl_ctx{nullptr};
    SSL* ssl{nullptr};
    std::vector<uint8_t> dek_buffer;
    std::vector<uint8_t> sealed_dek;

    static void secure_zero(std::vector<uint8_t>& buf)
    {
        if (buf.empty())
            return;
        volatile uint8_t* p =
            reinterpret_cast<volatile uint8_t*>(buf.data());
        for (size_t i = 0; i < buf.size(); ++i)
            p[i] = 0;
        buf.clear();
    }

    void ClearSensitiveBuffers()
    {
        dek_ready = false;
        sealed_dek_ready = false;
        secure_zero(dek_buffer);
        secure_zero(sealed_dek);
    }

    void Reset()
    {
        ClearSensitiveBuffers();
        session_handle = std::numeric_limits<uint64_t>::max();
        if (ssl)
        {
            SSL_free(ssl);
            ssl = nullptr;
        }
        has_session = false;
    }

    void Shutdown()
    {
        Reset();
        if (ssl_ctx)
        {
            SSL_CTX_free(ssl_ctx);
            ssl_ctx = nullptr;
        }
        initialized = false;
    }
};