#include <iomanip>
#include <iostream>
#include <vector>

#include <termcolor.hpp>

void hexDump(const std::vector<uint8_t>& bytes, std::ostream& stream)
{
    char buff[17];
    size_t i = 0;

    stream << std::hex;
    for (i = 0; i < bytes.size(); i++)
    {
        if ((i % 16) == 0)
        {
            if (i != 0)
            {
                stream << "  " << buff << std::endl;
            }

            // Output the offset.
            stream << termcolor::blue;
            stream << "  " << std::setw(4) << std::setfill('0') << static_cast<unsigned int>(i);
            stream << termcolor::reset;
        }

        stream << termcolor::green;
        stream << " " << std::setw(2) << std::setfill('0') << static_cast<unsigned int>(bytes[i]);
        stream << termcolor::reset;

        if ((bytes[i] < 0x20) || (bytes[i] > 0x7e))
        {
            buff[i % 16] = '.';
        } else {
            buff[i % 16] = bytes[i];
        }
        buff[(i % 16) + 1] = '\0';
    }

    stream << std::dec;
    while ((i++ % 16) != 0)
    {
        stream << "   ";
    }
    stream << "  " << buff << std::endl;
}