#pragma once

#include "include/common_utility.hpp"
#include "include/power_rail/max34451_utility.hpp"
#include "nlohmann/json.hpp"

#include <boost/algorithm/string.hpp>
#include <phosphor-logging/lg2.hpp>

#include <cstdint>
#include <filesystem>
#include <fstream>
#include <iostream>
#include <optional>
#include <string>
#include <vector>

namespace powerfault
{

using json = nlohmann::json;
using PowerFaultRail = std::vector<std::string>;
using BitToPowerRailMap = std::map<uint32_t, std::string>;
namespace fs = std::filesystem;

constexpr uint8_t kCpldClearFlag = 0x00;
constexpr uint8_t kCpldReadFlag = 0x02;
constexpr uint8_t kCpldEraseFlag = 0x04;
constexpr uint8_t kCpldDisableFlag = 0x04;
constexpr uint8_t kCpldBusyFlag = 0x02;
constexpr uint8_t kCpldUfmComponentFaultFlag = 0x04;

constexpr std::string_view kZiggurat = "Ziggurat";
constexpr std::string_view kCPLDM = "CPLD-M";
constexpr std::string_view kCPLD = "CPLD";
constexpr std::string_view kSequencer = "Sequencer";
constexpr std::string_view kReg = "Reg";
constexpr std::string_view kReverseFlag = "ReverseFlag";
constexpr std::string_view kPage = "Page";
constexpr std::string_view kBit = "Bit";
constexpr std::string_view kName = "Name";
constexpr std::string_view kType = "Type";
constexpr std::string_view kSource = "Source";
constexpr std::string_view kBus = "Bus";
constexpr std::string_view kAddress = "Address";
constexpr std::string_view kCPLDRegisters = "CPLDRegisters";
constexpr std::string_view kSequencerRegisters = "SequencerRegisters";
constexpr std::string_view kBitToPowerRailMap = "BitToPowerRailMap";
constexpr std::string_view kPageToPowerRailMap = "PageToPowerRailMap";
constexpr std::string_view kRegister = "Register";
constexpr std::string_view kCPLDRuntimeFlag = "CPLD_RUNTIME_FLAG";
constexpr std::string_view kSetCPLDFlag = "SetCPLDFlag";

struct RailInfo
{
    std::string name;
    std::string type;
    std::string source;
    uint16_t bus{};
    uint8_t address{};
    uint8_t reg = 0;
    uint8_t readLen = 0;
    uint8_t reverse_flag = 0;
    uint16_t page = 0;
    uint16_t bit = 0;

    RailInfo() = default;

    RailInfo(const std::string& n, const std::string& t, const std::string& s,
             uint16_t bus, uint8_t address) :
        name(n), type(t), source(s), bus(bus), address(address)
    {}
};

struct ProcessResult
{
    bool success{};
    bool hasErrorInZiggurat{};
    bool runtime{};
    PowerFaultRail powerFaultRails;
    std::map<uint8_t, uint8_t> cpldRegValues;
};

struct CPLDResult
{
    bool success;
    bool runtime;
    bool hasErrorInZiggurat;
    PowerFaultRail powerFaultRails;
    std::map<uint8_t, uint8_t> cpldRegValues;
};

/**
 * @brief Reads a flag from a CPLD register.
 *
 * @param bus The bus number.
 * @param addr The address of the CPLD.
 * @param reg The register to read.
 * @return The value of the CPLD flag.
 */
uint8_t readCPLDFlag(uint8_t bus, uint8_t addr, uint8_t reg);

/**
 * @brief Executes an action on the CPLD.
 *
 * @param bus The bus number.
 * @param addr The address of the CPLD.
 * @param action The action to execute.
 */
void cpldExecuteAction(uint8_t bus, uint8_t addr, uint8_t action);

/**
 * @brief Operates the UFM (User Flash Memory) on the CPLD.
 *
 * @param bus The bus number.
 * @param addr The address of the CPLD.
 * @param action The action to perform.
 * @return true if the operation is successful, false otherwise.
 */
bool operateUFM(uint8_t bus, uint8_t addr, uint8_t action);

/**
 * @brief Processes a rail configuration from JSON.
 *
 * @param rail The JSON object containing the rail configuration.
 * @return An optional RailInfo object.
 */
std::optional<RailInfo> processRail(const nlohmann::json& rail);

/**
 * @brief Reads priority files from the specified directory.
 *
 * @param priorityDirPath The directory path.
 * @return A pair of vectors containing the priority files.
 */
std::pair<std::vector<std::string>, std::vector<std::string>>
    readPriorityFiles(const fs::path& priorityDirPath);

/**
 * @brief Reads register map files from the specified directory.
 *
 * @param registerMapDirPath The directory path.
 * @return A pair of JSON objects containing the register maps.
 */
std::pair<json, json> readRegisterMapFiles(const fs::path& registerMapDirPath);

/**
 * @brief Collects power rail configurations from the register map.
 *
 * @param registerMap The JSON object containing the register map.
 * @param registerType The type of register.
 * @return A map of power rail configurations.
 */
std::map<std::string, json> collectPowerRails(const json& registerMap,
                                              std::string_view registerType);

/**
 * @brief Processes a list of priority rails.
 *
 * @param priorityList The list of priority rails.
 * @param railInfoMap Map of rail names to RailInfo.
 * @param logDirPath The directory path for logs.
 * @param cpldRegValues Map for CPLD register values.
 * @return ProcessResult object.
 */
ProcessResult
    processPriorityList(const std::vector<std::string>& priorityList,
                        const std::map<std::string, RailInfo>& railInfoMap,
                        const fs::path& logDirPath,
                        const std::map<uint8_t, uint8_t>& cpldRegValues);

/**
 * @brief Handles a CPLD rail.
 *
 * @param railInfo The rail information.
 * @param cpldRegValues Map for CPLD register values.
 * @param logFile The output file stream.
 * @return ProcessResult object.
 */
ProcessResult handleCPLDRail(const RailInfo& railInfo,
                             std::map<uint8_t, uint8_t> cpldRegValues,
                             std::ofstream& logFile);

/**
 * @brief Handles a sequencer rail.
 *
 * @param railInfo The rail information.
 * @param logFile The output file stream.
 * @return ProcessResult object.
 */
ProcessResult handleSequencerRail(const RailInfo& railInfo,
                                  std::ofstream& logFile);

/**
 * @brief Gets the CPLD register range.
 *
 * @param railInfoMap Map of rail names to RailInfo.
 * @param cpldType The CPLD type.
 * @return A pair containing the minimum and maximum register values.
 */
std::pair<uint8_t, uint8_t>
    getCPLDRegisterRange(const std::map<std::string, RailInfo>& railInfoMap,
                         std::string_view cpldType);

/**
 * @brief Gets the CPLD bus and address.
 *
 * @param railInfoMap Map of rail names to RailInfo.
 * @param source The source type.
 * @return A pair containing the bus and address.
 */
std::pair<uint8_t, uint8_t>
    getCPLDBusAndAddress(const std::map<std::string, RailInfo>& railInfoMap,
                         std::string_view source);

/**
 * @brief Reads registers from the CPLD.
 *
 * @param bus The bus number.
 * @param address The address of the CPLD.
 * @param minReg The minimum register.
 * @param regRange The range of registers.
 * @return A map of register values.
 */
std::map<uint8_t, uint8_t> readCPLDRegisters(uint8_t bus, uint8_t address,
                                             uint8_t minReg, size_t regRange,
                                             const bool& setCPLDFlag);

/**
 * @brief Gets a map of rail information.
 *
 * @param registerMapDirPath The directory path for register maps.
 * @return A pair of a boolean and a map of rail names to RailInfo.
 */
std::pair<bool, std::map<std::string, RailInfo>>
    getRailInfoMap(const fs::path& registerMapDirPath);

/**
 * @brief Gets values of CPLD registers.
 *
 * @param railInfoMap Map of rail names to RailInfo.
 * @return A map of register values.
 */
std::map<uint8_t, uint8_t>
    getCPLDRegValues(const std::map<std::string, RailInfo>& railInfoMap,
                     const bool& setCPLDFlag);

/**
 * @brief Logs the state of power rails.
 *
 * @param priorityDirPath The directory path for priorities.
 * @param registerMapDirPath The directory path for register maps.
 * @param logDirPath The directory path for logs.
 * @param specifiedRailName The specified rail name.
 * @return true if successful, false otherwise.
 */
bool logRailState(const fs::path& priorityDirPath,
                  const fs::path& registerMapDirPath,
                  const fs::path& logDirPath,
                  std::string_view specifiedRailName);

/**
 * @brief Converts MAX34451 page value to string.
 *
 * @param page The MAX34451 page value.
 * @return The string representation.
 */
std::string fromMax34451Mb(uint8_t page);

/**
 * @brief Gets the power rail name from a bit value.
 *
 * @param bit The bit value.
 * @param bitToPowerRailMap The map of bit values to power rails.
 * @return The power rail name.
 */
void showPowerFault(bool runtime, const PowerFaultRail& powerFaultRails,
                    const fs::path& logDirPath);

} // namespace powerfault
