#pragma once

#include "NVMeSubsys.hpp"

#include <boost/asio.hpp>
#include <sdbusplus/asio/connection.hpp>
#include <sdbusplus/asio/object_server.hpp>
#include <xyz/openbmc_project/Inventory/Item/Volume/server.hpp>
#include <xyz/openbmc_project/Nvme/Volume/server.hpp>

#include <memory>

using VolumeBase =
    sdbusplus::xyz::openbmc_project::Inventory::Item::server::Volume;
using NvmeVolumeBase = sdbusplus::xyz::openbmc_project::Nvme::server::Volume;

class NVMeSubsystem;

// Object.Delete implemented manually at present, to allow async method call
// for .Delete

// using DeleteBase =
//     sdbusplus::xyz::openbmc_project::Object::server::Delete;

class NVMeVolume :
    public VolumeBase,
    public NvmeVolumeBase,
    public std::enable_shared_from_this<NVMeVolume>
{
  public:
    static std::shared_ptr<NVMeVolume>
        create(sdbusplus::asio::object_server& objServer,
               const std::shared_ptr<sdbusplus::asio::connection>& conn,
               const std::shared_ptr<NVMeSubsystem>& subsys,
               const NVMeNSIdentify& ns);
    ~NVMeVolume() override;

    const std::string path;

  private:
    template <nvme_identify_cns CNS, class ClockType>
    friend class IdentifyMetric;

    NVMeVolume(sdbusplus::asio::object_server& objServer,
               const std::shared_ptr<sdbusplus::asio::connection>& conn,
               const std::shared_ptr<NVMeSubsystem>& subsys,
               const NVMeNSIdentify& ns);
    void init();

    void formatLuks(std::vector<uint8_t> password,
                    VolumeBase::FilesystemType type) override;

    void erase(VolumeBase::EraseMethod eraseType) override;

    void lock() override;

    void unlock(std::vector<uint8_t> password) override;

    void changePassword(std::vector<uint8_t> oldPassword,
                        std::vector<uint8_t> newPassword) override;

    std::shared_ptr<sdbusplus::asio::dbus_interface> deleteInterface;

    sdbusplus::asio::object_server& objServer;

    std::shared_ptr<sdbusplus::asio::connection> conn;

    std::weak_ptr<NVMeSubsystem> subsys;

    std::optional<MetricStore> metricStore;
};
