/*
 * SPDX-FileCopyrightText: Copyright OpenBMC Authors
 * SPDX-License-Identifier: Apache-2.0
 */

#pragma once

#include "MctpRequester.hpp"

#include <NvidiaGpuMctpVdm.hpp>
#include <sdbusplus/asio/connection.hpp>
#include <sdbusplus/asio/object_server.hpp>

#include <array>
#include <cstddef>
#include <cstdint>
#include <memory>
#include <string>
#include <utility>
#include <vector>

struct NvidiaEthPortMetrics :
    public std::enable_shared_from_this<NvidiaEthPortMetrics>
{
  public:
    NvidiaEthPortMetrics(
        std::shared_ptr<sdbusplus::asio::connection>& conn,
        mctp::MctpRequester& mctpRequester, const std::string& name,
        const std::string& deviceName, const std::string& path, uint8_t eid,
        uint16_t portNumber, sdbusplus::asio::object_server& objectServer,
        const std::vector<std::pair<uint8_t, uint64_t>>& addresses);

    ~NvidiaEthPortMetrics();

    NvidiaEthPortMetrics(const NvidiaEthPortMetrics&) = delete;
    NvidiaEthPortMetrics& operator=(const NvidiaEthPortMetrics&) = delete;
    NvidiaEthPortMetrics(NvidiaEthPortMetrics&&) = delete;
    NvidiaEthPortMetrics& operator=(NvidiaEthPortMetrics&&) = delete;

    void update();

  private:
    static constexpr size_t maxTelemetryValues = 64;

    void processResponse(const std::error_code& sendRecvMsgResult,
                         std::span<const uint8_t> response);

    static double mapPcieGenToLinkSpeedGbps(uint32_t value);

    uint8_t eid;

    uint16_t portNumber;

    std::string path;

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

    mctp::MctpRequester& mctpRequester;

    sdbusplus::asio::object_server& objectServer;

    std::array<uint8_t, gpu::getEthernetPortTelemetryCountersRequestSize>
        request{};

    bool requestEncoded{false};

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

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

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

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

    std::array<std::shared_ptr<sdbusplus::asio::dbus_interface>,
               maxTelemetryValues>
        metricValueInterface{};

    std::array<std::shared_ptr<sdbusplus::asio::dbus_interface>,
               maxTelemetryValues>
        metricAssociationInterfaces;
};
