#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <stdexcept>
#include <phosphor-logging/log.hpp>
#include "version.hpp"
#include <phosphor-logging/elog-errors.hpp>
#include "xyz/openbmc_project/Common/error.hpp"
#include "item_updater.hpp"

namespace openpower
{
namespace software
{
namespace updater
{

using namespace sdbusplus::xyz::openbmc_project::Common::Error;
using namespace phosphor::logging;

std::string Version::getId(const std::string& version)
{
    std::stringstream hexId;

    if (version.empty())
    {
        log<level::ERR>("Error version is empty");
        elog<InvalidArgument>(xyz::openbmc_project::Common::InvalidArgument::
                              ARGUMENT_NAME("Version"),
                              xyz::openbmc_project::Common::InvalidArgument::
                              ARGUMENT_VALUE(version.c_str()));
    }

    // Only want 8 hex digits.
    hexId << std::hex << ((std::hash<std::string> {}(
                               version)) & 0xFFFFFFFF);
    return hexId.str();
}

std::map<std::string, std::string> Version::getValue(
        const std::string& filePath, std::map<std::string, std::string> keys)
{

    if (filePath.empty())
    {
        log<level::ERR>("Error filePath is empty");
        elog<InvalidArgument>(xyz::openbmc_project::Common::InvalidArgument::
                              ARGUMENT_NAME("FilePath"),
                              xyz::openbmc_project::Common::InvalidArgument::
                              ARGUMENT_VALUE(filePath.c_str()));
    }

    std::ifstream efile;
    std::string line;
    efile.exceptions(std::ifstream::failbit
                     | std::ifstream::badbit
                     | std::ifstream::eofbit);

    try
    {
        efile.open(filePath);
        while (getline(efile, line))
        {
            for(auto& key : keys)
            {
                auto value = key.first + "=";
                auto keySize = value.length();
                if (line.compare(0, keySize, value) == 0)
                {
                    key.second = line.substr(keySize);
                    break;
                }
            }
        }
        efile.close();
    }
    catch (const std::exception& e)
    {
        log<level::ERR>("Error in reading file");
    }

    return keys;
}

void Version::delete_()
{
    parent.erase(getId(version()));
}

} // namespace updater
} // namespace software
} // namespace openpower
