#include "logger.hpp"
#include "parser.hpp"
#include "parser_interface.hpp"
#include "types.hpp"
#include "worker.hpp"

#include <CLI/CLI.hpp>
#include <nlohmann/json.hpp>
#include <parser_factory.hpp>

#include <filesystem>
#include <iostream>

/**
 * @brief This file implements a generic parser APP.
 *
 * It recieves path of the VPD file(mandatory) and path to a config
 * file(optional) as arguments. It will parse the data and return parsed data in
 * a required format.
 *
 * Steps to get parsed VPD.
 * - Pass VPD file path and config file (if applicable).
 * - Read VPD file to vector.
 * - Pass that to parser_factory to get the parser and call parse API on that
 * parser object to get the Parsed VPD map.
 * - If VPD format is other than the existing formats. Follow the steps
 * - a) Add logic in parser_factory.cpp, vpdTypeCheck API to detect the format.
 * - b) Implement a custom parser class.
 * - c) Override parse API in the newly added parser class.
 * - d) Add type of parsed data returned by parse API into types.hpp,
 * "VPDMapVariant".
 *
 */

int main(int argc, char** argv)
{
    try
    {
        std::string vpdFilePath{};
        CLI::App app{"VPD-parser-app - APP to parse VPD. "};

        app.add_option("-f, --file", vpdFilePath, "VPD file path")->required();

        std::string configFilePath{};

        app.add_option("-c,--config", configFilePath, "Path to JSON config");

        CLI11_PARSE(app, argc, argv);

        vpd::logging::logMessage("VPD file path recieved" + vpdFilePath);

        // VPD file path is a mandatory parameter to execute any parser.
        if (vpdFilePath.empty())
        {
            throw std::runtime_error("Empty VPD file path");
        }

        nlohmann::json json;
        vpd::types::VPDMapVariant parsedVpdDataMap;

        // Below are two different ways of parsing the VPD.
        if (!configFilePath.empty())
        {
            vpd::logging::logMessage(
                "Processing with config file - " + configFilePath);

            std::shared_ptr<vpd::Worker> objWorker =
                std::make_shared<vpd::Worker>(configFilePath);
            parsedVpdDataMap = objWorker->parseVpdFile(vpdFilePath);

            // Based on requirement, call appropriate public API of worker class
            /*If required to publish the FRU data on Dbus*/
            // objWorker->publishFruDataOnDbus(parsedVpdDataMap);
        }
        else
        {
            // Will work with empty JSON
            std::shared_ptr<vpd::Parser> vpdParser =
                std::make_shared<vpd::Parser>(vpdFilePath, json);
            parsedVpdDataMap = vpdParser->parse();
        }

        // If custom handling is required then custom logic to be implemented
        // based on the type of variant,
        //  eg: for IPZ VPD format
        if (auto ipzVpdMap =
                std::get_if<vpd::types::IPZVpdMap>(&parsedVpdDataMap))
        {
            // get rid of unused variable warning/error
            (void)ipzVpdMap;
            // implement code that needs to handle parsed IPZ VPD.
        }
    }
    catch (const std::exception& ex)
    {
        vpd::logging::logMessage(ex.what());
        return -1;
    }

    return 0;
}
