#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/Format/server.hpp>
#include <xyz/openbmc_project/Nvme/Volume/server.hpp>

#include <memory>

using VolumeBase =
    sdbusplus::xyz::openbmc_project::Inventory::Item::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 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;
    const NVMeNSIdentify& getNSIdentify() const
    {
        return nsIdentify;
    }
    uint32_t namespaceId() const
    {
        return nsIdentify.namespaceId;
    }
    void updateNSIdentify(const NVMeNSIdentify& ns);

  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 format(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);

    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;
    std::shared_ptr<sdbusplus::asio::dbus_interface> nvmeVolumeInterface;

    sdbusplus::asio::object_server& objServer;

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

    std::weak_ptr<NVMeSubsystem> subsys;

    std::optional<MetricStore> metricStore;

    std::shared_ptr<FeatureStore> featureStore;

    /** Create Metric store and load all the metric implementations
     */
    void initializeMetricStore();
    /** Create Feature store and load all the feature implementations
     */
    void initializeFeatureStore();

    NVMeNSIdentify nsIdentify;
};
