#pragma once

#include "CLI/CLI.hpp"
#include "include/common_utility.hpp"
#include "include/power_rail/max34451_utility.hpp"
#include "include/power_rail/pmbus_lib.hpp"

#include <filesystem>
#include <fstream>
#include <map>
#include <string>
#include <vector>

namespace max34451
{

/**
 * @brief Parses the BBR data array and writes the result to the log file.
 *
 * @param BBRArray The BBR data array to be parsed.
 * @param logFile The output log file to write the parsed result.
 */
void max34451BBRParser(const std::vector<uint8_t>& bbrArray,
                       std::ofstream& logFile);

/**
 * @brief Retrieves the MFR channel configuration value from the Max34451Logger
 * object.
 *
 * @param config The Max34451Logger object to retrieve the MFR channel
 * configuration from.
 * @return The MFR channel configuration value.
 */
uint16_t getMfrChannelConfig(const Max34451Logger& logger);

/**
 * @brief Sets the MFR channel configuration value in the Max34451Logger object.
 *
 * @param config The Max34451Logger object to set the MFR channel configuration
 * in.
 * @param value The value to set as the MFR channel configuration.
 */
void setMfrChannelConfig(const Max34451Logger& logger, uint16_t value);

/**
 * @brief Retrieves the MFR PSEN configuration from the Max34451Logger object.
 *
 * @param config The Max34451Logger object to retrieve the MFR PSEN
 * configuration from.
 * @return The MFR PSEN configuration as a vector of uint8_t.
 */
std::vector<uint8_t> getMfrPsenConfig(const Max34451Logger& logger);

/**
 * @brief Retrieves the MFR PWM configuration from the Max34451Logger object.
 *
 * @param config The Max34451Logger object to retrieve the MFR PWM configuration
 * from.
 * @return The MFR PWM configuration as a vector of uint8_t.
 */
std::vector<uint8_t> getMfrPwmConfig(const Max34451Logger& logger);

/**
 * @brief Retrieves the MFR NV fault log from the Max34451Logger object.
 *
 * @param config The Max34451Logger object to retrieve the MFR NV fault log
 * from.
 * @return The MFR NV fault log value.
 */
uint8_t getMfrNvFaultLog(const Max34451Logger& logger);

/**
 * @brief Retrieves the status MFR NV log configuration from the Max34451Logger
 * object.
 *
 * @param config The Max34451Logger object to retrieve the status MFR NV log
 * configuration from.
 * @return The status MFR NV log configuration value.
 */
uint16_t getStatusMfrNvLogConfig(const Max34451Logger& logger);

/**
 * @brief Retrieves the status CML Max34451 value from the Max34451Logger
 * object.
 *
 * @param logger The Max34451Logger object to retrieve the status CML Max34451
 * value from.
 * @return The status CML Max34451 value.
 */
uint8_t getStatusCmlMax34451(const Max34451Logger& logger);

/**
 * @brief Parses the status CML Max34451 value and returns a string
 * representation.
 *
 * @param statusCmlMax34451 The status CML Max34451 value to be parsed.
 * @return A string representation of the status CML Max34451 value.
 */
std::string parserStatusCmlMax34451(uint8_t statusCmlMax34451);

/**
 * @brief Retrieves the status MFR specific value from the Max34451Logger
 * object and writes the result to the log file.
 *
 * @param logger The Max34451Logger object to retrieve the status MFR specific
 * value from.
 * @param logFile The output log file to write the status MFR specific result.
 */
void getStatusMfrSpecific(const Max34451Logger& logger, std::ofstream& logFile);

/**
 * @brief Parses the status MFR specific value and writes the result to the log
 * file.
 *
 * @param statusMfrSpecific The status MFR specific value to be parsed.
 * @param logFile The output log file to write the parsed result.
 */
void parseStatusMfrSpecific(uint8_t statusMfrSpecific, std::ofstream& logFile);

/**
 * @brief Retrieves the Max34451 status and writes the result to the log file.
 *
 * @param logger The Max34451Logger object to retrieve the status from.
 * @param logFile The output log file to write the status result.
 */
void getMax34451Status(const Max34451Logger& logger, std::ofstream& logFile);

/**
 * @brief Retrieves the fault status from the Max34451Logger object.
 *
 * @param logger The Max34451Logger object to retrieve the fault status from.
 * @return The fault status value.
 */
uint16_t getFaultStatus(const Max34451Logger& logger);

/**
 * @brief Retrieves the status MFR specific value from the Max34451Logger object
 * and returns a string representation.
 *
 * @param logger The Max34451Logger object to retrieve the status MFR specific
 * value from.
 * @return A string representation of the status MFR specific value.
 */
std::string getStatusMfrSpecificMax34451Page255(const Max34451Logger& logger);

/**
 * @brief Retrieves the configuration from page 255 of the Max34451Logger object
 * and returns a string representation.
 *
 * @param logger The Max34451Logger object to retrieve the configuration from.
 * @return A string representation of the configuration from page 255.
 */
std::string getPage255Config(const Max34451Logger& logger);

/**
 * @brief Checks the Max34451 status and performs necessary actions.
 *
 * @param configFilePath The path to the configuration file.
 * @param logDirPath The path to the log directory.
 * @param logDetails True if detailed logging is enabled, false otherwise.
 */
void runMax34451Logger(const std::filesystem::path& configFilePath,
                       const std::filesystem::path& logDirPath,
                       bool logDetails);

} // namespace max34451
