#pragma once

#include "common/utils.hpp"
#include "pdr_utils.hpp"

#include <libpldm/platform.h>
#include <sys/stat.h>
#include <time.h>

#include <nlohmann/json.hpp>

#include <chrono>

namespace pldm
{
namespace responder
{
namespace pdr_file
{

/**
 * Data structue to hold the complete file path, C style file pointer, 16 bit
 * file indetifier and record handle
 */
struct FileInfo
{
    std::string filePath = "";
    uint32_t fileSize;
    FILE* fp = nullptr;
    uint16_t fileIdentifier = 0;
    uint32_t recordHandle = 0;
    struct timespec last_modified{};
    pldm::utils::Json fileJsonEntry;
    std::string directoryPath = "";
    uint16_t entityType = 0;
    uint16_t containerId = 0;
    std::string configFilePath = "";
    struct timespec config_last_modified{};
    std::chrono::steady_clock::time_point snapshotCreationTime{};
};

/**
 * @brief Parse PDR JSON file and generate file descriptor PDR structure
 *
 *  @param[in] json - the JSON Object with the file descriptor PDR
 *  @param[in] configFilePath - path to the JSON configuration file
 *  @param[in] config_last_modified - last modified time of the JSON
 * configuration file
 *  @param[out] fileIdentifierToFileInfo - store FileInfo details based on the
 * fileIdentifier
 *  @param[out] recordHandleToFileInfo - store FileInfo details based on the
 * recordHandle
 *  @param[out] repo - pdr::RepoInterface
 */
void generateFileDescriptorPDR(
    const nlohmann::json& json, const std::string& configFilePath,
    const struct timespec& config_last_modified,
    std::map<uint16_t, FileInfo>& fileIdentifierToFileInfo,
    std::map<uint32_t, FileInfo>& recordHandleToFileInfo,
    pdr_utils::RepoInterface& repo);

/** @brief Fetch the updated file entry from the configuration JSON
 *
 *  This API is needed to isolate the logic of parsing the PDR configuration
 *  JSON to find a specific file entry when a configuration change occurs.
 *  Since properties like FileIdentifier or FileSize can change, this function
 *  uses the FileName as a stable key to locate the correct file definition
 *  within the newly updated JSON structure.
 *
 *  @param[in] configFilePath - path to the JSON configuration file
 *  @param[in] fileName - the name of the file to locate
 *  @param[out] fileEntry - the extracted JSON object for the file
 *
 *  @return true if the file entry was successfully found, false otherwise
 */
bool getFileEntryFromConfig(const std::string& configFilePath,
                            const std::string& fileName,
                            nlohmann::json& fileEntry);

/**
 * @brief Generate a single file PDR
 *
 * @param[in] fileEntry - the JSON object representing the file entry
 * @param[in] directoryPath - the path to the directory containing the file
 * @param[in] entityType - the type of the entity
 * @param[in] containerId - the ID of the container
 * @param[in] configFilePath - path to the JSON configuration file
 * @param[in] config_last_modified - last modified time of the JSON
 * configuration file
 * @param[out] fileIdentifierToFileInfo - store FileInfo details based on the
 * fileIdentifier
 * @param[out] recordHandleToFileInfo - store FileInfo details based on the
 * recordHandle
 * @param[out] repo - pdr::RepoInterface
 * @param[out] recordHandleToUpdate - if provided, this record handle will be
 * used to store the PDR instead of generating a new one. This is useful when we
 * want to update an existing PDR with new file information.
 */
bool generateSingleFilePDR(
    const nlohmann::json& fileEntry, const std::string& directoryPath,
    uint16_t entityType, uint16_t containerId,
    const std::string& configFilePath,
    const struct timespec& config_last_modified,
    std::map<uint16_t, FileInfo>& fileIdentifierToFileInfo,
    std::map<uint32_t, FileInfo>& recordHandleToFileInfo,
    pdr_utils::RepoInterface& repo, uint32_t* recordHandleToUpdate = nullptr);

} // namespace pdr_file
} // namespace responder
} // namespace pldm
