/**
 * Copyright © 2019 IBM Corporation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#include "json_utils.hpp"

#include "paths.hpp"

#include <stdio.h>

#include <nlohmann/json.hpp>

#include <cstring>
#include <filesystem>
#include <optional>
#include <sstream>
#include <string>

namespace openpower
{
namespace pels
{

std::string escapeJSON(const std::string& input)
{
    std::string output;
    output.reserve(input.length());

    for (const auto c : input)
    {
        switch (c)
        {
            case '"':
                output += "\\\"";
                break;
            case '/':
                output += "\\/";
                break;
            case '\b':
                output += "\\b";
                break;
            case '\f':
                output += "\\f";
                break;
            case '\n':
                output += "\\n";
                break;
            case '\r':
                output += "\\r";
                break;
            case '\t':
                output += "\\t";
                break;
            case '\\':
                output += "\\\\";
                break;
            default:
                output += c;
                break;
        }
    }

    return output;
}
std::unique_ptr<char[]> dumpHex(const void* data, size_t size,
                                size_t indentCount, bool toJson)
{
    const int symbolSize = 100;
    std::string jsonIndent(indentLevel * indentCount, 0x20);
    if (toJson)
    {
        jsonIndent.append("\"");
    }
    std::unique_ptr<char[]> buffer{new char[std::max(70, 10 * (int)size)]()};
    char* symbol = (char*)calloc(symbolSize, sizeof(char));
    char* byteCount = (char*)calloc(11, sizeof(char));
    char ascii[17];
    size_t i, j;
    ascii[16] = '\0';
    for (i = 0; i < size; ++i)
    {
        if (i % 16 == 0)
        {
            if (!toJson)
            {
                snprintf(byteCount, 11, "%08X  ", static_cast<uint32_t>(i));
                strcat(buffer.get(), byteCount);
            }
            strcat(buffer.get(), jsonIndent.c_str());
        }
        snprintf(symbol, symbolSize, "%02X ", ((unsigned char*)data)[i]);
        strcat(buffer.get(), symbol);
        memset(symbol, 0, strlen(symbol));
        if (((unsigned char*)data)[i] >= ' ' &&
            ((unsigned char*)data)[i] <= '~')
        {
            ascii[i % 16] = ((unsigned char*)data)[i];
        }
        else
        {
            ascii[i % 16] = '.';
        }
        if ((i + 1) % 8 == 0 || i + 1 == size)
        {
            std::string asciiString(ascii);
            if (toJson)
            {
                asciiString = escapeJSON(asciiString);
            }
            strcat(buffer.get(), " ");
            if ((i + 1) % 16 == 0)
            {
                if (i + 1 != size && toJson)
                {
                    snprintf(symbol, symbolSize, "|  %s\",\n",
                             asciiString.c_str());
                }
                else if (toJson)
                {
                    snprintf(symbol, symbolSize, "|  %s\"\n",
                             asciiString.c_str());
                }
                else
                {
                    snprintf(symbol, symbolSize, "|  %s\n",
                             asciiString.c_str());
                }
                strcat(buffer.get(), symbol);
                memset(symbol, 0, strlen(symbol));
            }
            else if (i + 1 == size)
            {
                ascii[(i + 1) % 16] = '\0';
                if ((i + 1) % 16 <= 8)
                {
                    strcat(buffer.get(), " ");
                }
                for (j = (i + 1) % 16; j < 16; ++j)
                {
                    strcat(buffer.get(), "   ");
                }
                std::string asciiString2(ascii);
                if (toJson)
                {
                    asciiString2 = escapeJSON(asciiString2);
                    snprintf(symbol, symbolSize, "|  %s\"\n",
                             asciiString2.c_str());
                }
                else
                {
                    snprintf(symbol, symbolSize, "|  %s\n",
                             asciiString2.c_str());
                }

                strcat(buffer.get(), symbol);
                memset(symbol, 0, strlen(symbol));
            }
        }
    }
    free(byteCount);
    free(symbol);
    return buffer;
}

void jsonInsert(std::string& jsonStr, const std::string& fieldName,
                const std::string& fieldValue, uint8_t indentCount)
{
    const int8_t spacesToAppend = colAlign - (indentCount * indentLevel) -
                                  fieldName.length() - 3;
    const std::string jsonIndent(indentCount * indentLevel, 0x20);
    jsonStr.append(jsonIndent + "\"" + fieldName + "\":");
    if (spacesToAppend >= 0)
    {
        jsonStr.append(spacesToAppend, 0x20);
    }
    else
    {
        jsonStr.append(1, 0x20);
    }
    jsonStr.append("\"" + fieldValue + "\",\n");
}

void jsonInsertArray(std::string& jsonStr, const std::string& fieldName,
                     const std::vector<std::string>& values,
                     uint8_t indentCount)
{
    const std::string jsonIndent(indentCount * indentLevel, 0x20);
    if (!values.empty())
    {
        jsonStr.append(jsonIndent + "\"" + fieldName + "\": [\n");
        for (size_t i = 0; i < values.size(); i++)
        {
            jsonStr.append(colAlign, 0x20);
            if (i == values.size() - 1)
            {
                jsonStr.append("\"" + values[i] + "\"\n");
            }
            else
            {
                jsonStr.append("\"" + values[i] + "\",\n");
            }
        }
        jsonStr.append(jsonIndent + "],\n");
    }
    else
    {
        const int8_t spacesToAppend = colAlign - (indentCount * indentLevel) -
                                      fieldName.length() - 3;
        jsonStr.append(jsonIndent + "\"" + fieldName + "\":");
        if (spacesToAppend > 0)
        {
            jsonStr.append(spacesToAppend, 0x20);
        }
        else
        {
            jsonStr.append(1, 0x20);
        }
        jsonStr.append("[],\n");
    }
}

std::string trimEnd(std::string s)
{
    const char* t = " \t\n\r\f\v";
    if (s.find_last_not_of(t) != std::string::npos)
    {
        s.erase(s.find_last_not_of(t) + 1);
    }
    return s;
}

/**
 * @brief Lookup the component ID in a JSON file named
 *        after the creator ID.
 *
 * Keeps a cache of the JSON it reads to live throughout
 * the peltool call as the JSON can be reused across
 * PEL sections or even across PELs.
 *
 * @param[in] compID - The component ID
 * @param[in] creatorID - The creator ID for the PEL
 * @return optional<string> - The comp name, or std::nullopt
 */
static std::optional<std::string> lookupComponentName(uint16_t compID,
                                                      char creatorID)
{
    static std::map<char, nlohmann::json> jsonCache;
    nlohmann::json jsonData;
    nlohmann::json* jsonPtr = &jsonData;
    std::filesystem::path filename{std::string{creatorID} +
                                   "_component_ids.json"};
    filename = getPELReadOnlyDataPath() / filename;

    auto jsonIt = jsonCache.find(creatorID);
    if (jsonIt != jsonCache.end())
    {
        jsonPtr = &(jsonIt->second);
    }
    else
    {
        std::error_code ec;
        if (!std::filesystem::exists(filename, ec))
        {
            return std::nullopt;
        }

        std::ifstream file{filename};
        if (!file)
        {
            return std::nullopt;
        }

        jsonData = nlohmann::json::parse(file, nullptr, false);
        if (jsonData.is_discarded())
        {
            return std::nullopt;
        }

        jsonCache.emplace(creatorID, jsonData);
    }

    auto id = getNumberString("%04X", compID);

    auto it = jsonPtr->find(id);
    if (it == jsonPtr->end())
    {
        return std::nullopt;
    }

    return it->get<std::string>();
}

/**
 * @brief Convert the component ID to a 2 character string
 *        if both bytes are nonzero
 *
 * e.g. 0x4552 -> "ER"
 *
 * @param[in] compID - The component ID
 * @return optional<string> - The two character string, or std::nullopt.
 */
static std::optional<std::string> convertCompIDToChars(uint16_t compID)
{
    uint8_t first = (compID >> 8) & 0xFF;
    uint8_t second = compID & 0xFF;
    if ((first != 0) && (second != 0))
    {
        std::string id{static_cast<char>(first)};
        id += static_cast<char>(second);
        return id;
    }

    return std::nullopt;
}

std::string getComponentName(uint16_t compID, uint8_t creatorID)
{
    // See if there's a JSON file with the names
    auto name = lookupComponentName(compID, creatorID);

    // If PHYP, convert to ASCII
    if (!name && ('H' == creatorID))
    {
        name = convertCompIDToChars(compID);
    }

    if (!name)
    {
        name = getNumberString("0x%04X", compID);
    }

    return *name;
}

} // namespace pels
} // namespace openpower
