#pragma once

#include "MctpEndpoint.hpp"
#include "NVMeIntf.hpp"
#include "NVMeSubsys.hpp"

#include <chrono>
#include <memory>

class NVMeDevice : public std::enable_shared_from_this<NVMeDevice>
{
    struct Private
    {};

  public:
    static std::shared_ptr<NVMeDevice>
        create(NVMeIntf intf, const std::shared_ptr<NVMeSubsystem>& subsys)
    {
        return std::make_shared<NVMeDevice>(Private(), std::move(intf), subsys);
    }

    static std::shared_ptr<NVMeDevice> create(
        boost::asio::io_context& io, const std::shared_ptr<MctpDevice>& dev,
        NVMeIntf intf, const std::shared_ptr<NVMeSubsystem>& subsys,
        std::chrono::seconds gracePeriod = std::chrono::seconds(5))
    {
        return std::make_shared<NVMeDevice>(Private(), io, dev, std::move(intf),
                                            subsys, gracePeriod);
    }

    NVMeDevice(Private /*unused*/, NVMeIntf intf,
               const std::shared_ptr<NVMeSubsystem>& subsys) :
        intf(std::move(intf)), subsys(subsys)
    {}
    NVMeDevice(Private /*unused*/, boost::asio::io_context& io,
               const std::shared_ptr<MctpDevice>& dev, NVMeIntf intf,
               const std::shared_ptr<NVMeSubsystem>& subsys,
               std::chrono::seconds gracePeriod) :
        dev(dev), intf(std::move(intf)), subsys(subsys), timer(io),
        gracePeriod{gracePeriod}
    {}
    ~NVMeDevice() = default;
    void start();
    void stop();

  private:
    void setup();
    void restart();
    void degraded(const std::shared_ptr<MctpEndpoint>& ep);
    void available(const std::shared_ptr<MctpEndpoint>& ep);
    void removed(const std::shared_ptr<MctpEndpoint>& ep);
    void finalize(const std::error_code& ec,
                  const std::shared_ptr<MctpEndpoint>& ep);

    std::shared_ptr<MctpDevice> dev;
    NVMeIntf intf;
    std::shared_ptr<NVMeSubsystem> subsys;
    std::optional<boost::asio::steady_timer> timer;
    std::optional<std::chrono::seconds> gracePeriod;
    bool recovering{};
};
