#include "NVMeStorage.hpp"

#include "NVMeError.hpp"

RelPerf relativePerformanceFromRP(uint8_t rp)
{
    switch (rp)
    {
        case 0:
            return RelPerf::Best;
        case 1:
            return RelPerf::Better;
        case 2:
            return RelPerf::Good;
        default:
            return RelPerf::Degraded;
    }
}

NVMeStorage::NVMeStorage(sdbusplus::asio::object_server& objServer,
                         sdbusplus::bus_t& bus, const char* path) :
    StorageBase(bus, path), objServer(objServer), path(path)
{}

NVMeStorage::~NVMeStorage()
{
    objServer.remove_interface(nvmeStorageInterface);
    emit_removed();
}

void NVMeStorage::init(const std::shared_ptr<NVMeStorage>& self)
{
    self->nvmeStorageInterface = self->objServer.add_interface(
        self->path, "xyz.openbmc_project.Nvme.Storage");
    self->nvmeStorageInterface->register_method(
        "CreateVolume", [weak{std::weak_ptr<NVMeStorage>(self)}](
                            boost::asio::yield_context yield, uint64_t size,
                            size_t lbaFormat, bool metadataAtEnd) {
        if (auto self = weak.lock())
        {
            return self->createVolume(std::move(yield), size, lbaFormat,
                                      metadataAtEnd);
        }
        // TODO: (b/375054188) Exception handling to be refactored
        // NOLINTNEXTLINE(cert-err09-cpp,cert-err60-cpp,cert-err61-cpp,misc-throw-by-value-catch-by-reference)
        throw *makeLibNVMeError("storage removed");
    });

    std::vector<std::tuple<size_t, size_t, size_t, RelPerf>> prop;
    self->nvmeStorageInterface->register_property("SupportedFormats", prop);

    self->nvmeStorageInterface->initialize();
    self->emit_added();
}

void NVMeStorage::setSupportedFormats(const std::vector<LBAFormat>& formats)
{
    std::vector<std::tuple<size_t, size_t, size_t, RelPerf>> prop;
    prop.reserve(formats.size());
    for (const auto& f : formats)
    {
        prop.emplace_back(f.index, f.blockSize, f.metadataSize,
                          f.relativePerformance);
    }
    nvmeStorageInterface->set_property("SupportedFormats", prop);
}
