#pragma once

#include <NVMeIntf.hpp>
#include <boost/asio.hpp>
#include <sdbusplus/asio/connection.hpp>
#include <sdbusplus/asio/object_server.hpp>
#include <xyz/openbmc_project/Inventory/Decorator/Asset/server.hpp>
#include <xyz/openbmc_project/Inventory/Item/Drive/server.hpp>
#include <xyz/openbmc_project/Inventory/Item/DriveErase/server.hpp>

#include <memory>

using DriveBase =
    sdbusplus::xyz::openbmc_project::Inventory::Item::server::Drive;
using DriveErase =
    sdbusplus::xyz::openbmc_project::Inventory::Item::server::DriveErase;
using EraseAction = sdbusplus::xyz::openbmc_project::Inventory::Item::server::
    DriveErase::EraseAction;
using Asset =
    sdbusplus::xyz::openbmc_project::Inventory::Decorator::server::Asset;

class NVMeSubsystem;

class NVMeSanitizeParams
{
  public:
    explicit NVMeSanitizeParams(EraseAction sanact);
    auto operator<=>(const NVMeSanitizeParams&) const = default;

    enum nvme_sanitize_sanact nvmeAction() const;

    // returns true if the dword10 (from sanitize log page SCDW10) matches
    // these parameters.
    bool matchesDword10(uint32_t dword10) const;

    EraseAction sanact;

    // for overwrite action
    uint8_t passes;
    uint32_t pattern;
    bool patternInvert;
};

class NVMeDrive :
    public DriveBase,
    public DriveErase,
    public Asset,
    public std::enable_shared_from_this<NVMeDrive>
{
  public:
    static constexpr const int sanitizePollIntervalSecs = 4;

    NVMeDrive(boost::asio::io_context& io,
              const std::shared_ptr<sdbusplus::asio::connection>& conn,
              const std::string& path, std::weak_ptr<NVMeSubsystem> subsys);

    ~NVMeDrive() override;

    void erase(EraseAction action) override;

    const std::string path;

  private:
    void sanitizePoll();

    /*
    Parameters of the current/last sanitize operation
    */
    std::optional<NVMeSanitizeParams> sanitizeParams;
    boost::asio::steady_timer sanitizeTimer;
    bool sanitizePollPending = false;

    boost::asio::io_context& io;
    std::weak_ptr<NVMeSubsystem> subsys;
};
