#pragma once

#include "common/instance_id.hpp"

#include <unistd.h>

#include <cstring>
#include <filesystem>

static constexpr uintmax_t pldmMaxInstanceIds = 32;

class TestInstanceIdDb : public pldm::InstanceIdDb
{
  public:
    TestInstanceIdDb() : TestInstanceIdDb(createDb()) {}

    ~TestInstanceIdDb()
    {
        std::filesystem::remove(dbPath);
    };

  private:
    static std::filesystem::path createDb()
    {
        static const char dbTmpl[] = "/tmp/db.XXXXXX";
        char dbName[sizeof(dbTmpl)] = {};

        ::strncpy(dbName, dbTmpl, sizeof(dbName));
        ::close(::mkstemp(dbName));

        std::filesystem::path dbPath(dbName);
        std::filesystem::resize_file(
            dbPath, static_cast<uintmax_t>(PLDM_MAX_TIDS) * pldmMaxInstanceIds);

        return dbPath;
    };

    TestInstanceIdDb(std::filesystem::path dbPath) :
        InstanceIdDb(dbPath), dbPath(dbPath)
    {}

    std::filesystem::path dbPath;
};