#include <iostream>
#include <memory>
#include "argument.hpp"
#include "writefrudata.hpp"

static void exit_with_error(const char* err, char** argv)
{
    ArgumentParser::usage(argv);
    std::cerr << std::endl;
    std::cerr << "ERROR: " << err << std::endl;
    exit(-1);
}

//--------------------------------------------------------------------------
// This gets called by udev monitor soon after seeing hog plugs for EEPROMS.
//--------------------------------------------------------------------------
int main(int argc, char **argv)
{
    int rc = 0;
    uint8_t fruid = 0;

    // Handle to per process system bus
    sd_bus *bus_type = NULL;

    // Read the arguments.
    auto cli_options = std::make_unique<ArgumentParser>(argc, argv);

    // Parse out each argument.
    auto eeprom_file = (*cli_options)["eeprom"];
    if (eeprom_file == ArgumentParser::empty_string)
    {
        // User has not passed in the appropriate argument value
        exit_with_error("eeprom data not found.", argv);
    }

    auto fruid_str = (*cli_options)["fruid"];
    if (fruid_str == ArgumentParser::empty_string)
    {
        // User has not passed in the appropriate argument value
        exit_with_error("fruid data not found.", argv);
    }

    // Extract the fruid
    fruid = strtol(fruid_str.c_str(), NULL, 16);
    if(fruid == 0)
    {
        // User has not passed in the appropriate argument value
        exit_with_error("Invalid fruid.", argv);
    }

    // Finished getting options out, so release the parser.
    cli_options.release();

    // Get a handle to System Bus
    rc = sd_bus_open_system(&bus_type);
    if (rc < 0)
    {
        fprintf(stderr, "Failed to connect to system bus: %s\n",strerror(-rc));
    }
    else
    {
        // Now that we have the file that contains the eeprom data, go read it and
        // update the Inventory DB.
        bool bmc_fru = true;
        rc = ipmi_validate_fru_area(fruid, eeprom_file.c_str(), bus_type, bmc_fru);
    }

    // Cleanup
    sd_bus_unref(bus_type);

    return (rc < 0 ? EXIT_FAILURE : EXIT_SUCCESS);
}
