#pragma once

#include <libpldm/pldm_types.h>

#include <nlohmann/json.hpp>

#include <cstdint>
#include <filesystem>
#include <vector>

namespace pldm
{

namespace filetable
{

namespace fs = std::filesystem;
using Handle = uint32_t;
using Json = nlohmann::json;
using Table = std::vector<uint8_t>;

/** @struct FileEntry
 *
 *  Data structure for storing information regarding the files supported by
 *  PLDM File I/O. The file handle is used to uniquely identify the file. The
 *  traits provide information whether the file is Read only, Read/Write and
 *  preserved across firmware upgrades.
 */
struct FileEntry
{
    Handle handle;       //!< File handle
    fs::path fsPath;     //!< File path
    bitfield32_t traits; //!< File traits
};

/** @class FileTable
 *
 *  FileTable class encapsulates the data related to files supported by PLDM
 *  File I/O and provides interfaces to lookup files information based on the
 *  file handle and extract the file attribute table. The file attribute table
 *  comprises of metadata for files. Metadata includes the file handle, file
 *  name, current file size and file traits.
 */
class FileTable
{
  public:
    /** @brief The file table is initialised by parsing the config file
     *         containing information about the files.
     *
     * @param[in] fileTableConfigPath - path to the json file containing
     *                                  information
     */
    FileTable(const std::string& fileTableConfigPath);
    FileTable() = default;
    ~FileTable() = default;
    FileTable(const FileTable&) = default;
    FileTable& operator=(const FileTable&) = default;
    FileTable(FileTable&&) = default;
    FileTable& operator=(FileTable&&) = default;

    /** @brief Get the file attribute table
     *
     * @return Table- contents of the file attribute table
     */
    Table operator()() const;

    /** @brief Get the FileEntry at the file handle
     *
     * @param[in] handle - file handle
     *
     * @return FileEntry - file entry at the handle
     */
    FileEntry at(Handle handle) const
    {
        return tableEntries.at(handle);
    }

    /** @brief Check is file attribute table is empty
     *
     * @return bool - true if file attribute table is empty, false otherwise.
     */
    bool isEmpty() const
    {
        return fileTable.empty();
    }

    /** @brief Clear the file table contents
     *
     */
    void clear()
    {
        tableEntries.clear();
        fileTable.clear();
        padCount = 0;
        checkSum = 0;
    }

  private:
    /** @brief handle to FileEntry mappings for lookups based on file handle */
    std::unordered_map<Handle, FileEntry> tableEntries;

    /** @brief file attribute table including the pad bytes, except the checksum
     */
    std::vector<uint8_t> fileTable;

    /** @brief the pad count of the file attribute table, the number of pad
     * bytes is between 0 and 3 */
    uint8_t padCount = 0;

    /** @brief the checksum of the file attribute table */
    uint32_t checkSum = 0;
};

/** @brief Build the file attribute table if not already built using the
 *         file table config.
 *
 *  @param[in] fileTablePath - path of the file table config
 *
 *  @return FileTable& - Reference to instance of file table
 */

FileTable& buildFileTable(const std::string& fileTablePath);

} // namespace filetable
} // namespace pldm
