#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");
    });

    self->nvmeStorageInterface->register_method(
        "Format", [weak{std::weak_ptr<NVMeStorage>(self)}](
                      boost::asio::yield_context yield, uint8_t lbaFormat,
                      sdbusplus::xyz::openbmc_project::NVMe::server::Format::
                          SecureEraseSetting secureEraseSetting,
                      sdbusplus::xyz::openbmc_project::NVMe::server::Format::
                          DataProtectionType dataProtectionType) {
        if (auto self = weak.lock())
        {
            self->format(std::move(yield), lbaFormat, secureEraseSetting,
                         dataProtectionType);
            return;
        }
        throw sdbusplus::xyz::openbmc_project::Common::Error::Unavailable();
    });

    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);
}
