#pragma once

#include "interface.hpp"
#include "internal/sys.hpp"
#include "io.hpp"
#include "pci.hpp"
#include "progress.hpp"

#include <ipmiblob/blob_interface.hpp>

#include <cstdint>
#include <vector>

constexpr std::size_t aspeedP2aConfig = 0x0f000;
constexpr std::size_t aspeedP2aBridge = 0x0f004;
constexpr std::uint32_t p2ABridgeEnabled = 0x1;

struct PciDeviceInfo
{
    std::uint16_t VID;
    std::uint16_t DID;
    std::size_t Offset;
    std::size_t Length;
    std::uint16_t bar;
};

namespace host_tool
{

class P2aDataHandler : public DataInterface
{
  public:
    P2aDataHandler(ipmiblob::BlobInterface* blob, HostIoInterface* io,
                   PciUtilInterface* pci, ProgressInterface* progress,
                   const internal::Sys* sys = &internal::sys_impl) :
        blob(blob),
        io(io), pci(pci), progress(progress), sys(sys)
    {}

    bool sendContents(const std::string& input, std::uint16_t session) override;
    ipmi_flash::FirmwareFlags::UpdateFlags supportedType() const override
    {
        return ipmi_flash::FirmwareFlags::UpdateFlags::p2a;
    }

  private:
    ipmiblob::BlobInterface* blob;
    HostIoInterface* io;
    PciUtilInterface* pci;
    ProgressInterface* progress;
    const internal::Sys* sys;

    constexpr struct PciDeviceInfo static aspeedPciDeviceInfo = {
        0x1a03, 0x2000, 0x10000, 0x10000, 1};
    constexpr struct PciDeviceInfo static nuvotonPciDeviceInfo = {
        0x1050, 0x0750, 0x0, 0x4000, 0};
    const std::vector<PciDeviceInfo> PCIDeviceList = {aspeedPciDeviceInfo,
                                                      nuvotonPciDeviceInfo};
};
} // namespace host_tool
