/*
{{copyright}} 
*/

/*
{{version}} 
*/

/*
{{license}} 
*/

#pragma once

#include <cstdint>
#include <string>

namespace sdi_toolBox::console::ANSI
{
//--------------------------------------------------------------
class EscapeCommand
{
  public:
  enum class Color : uint8_t
  {
    Black = 0,
    Red,
    Green,
    Yellow,
    Blue,
    Magenta,
    Cyan,
    White,
  };

  static constexpr uint8_t LIGHT     = 0x01 << 0;     // 0x01
  static constexpr uint8_t BRIGHT    = 0x01 << 1;     // 0x02
  static constexpr uint8_t DIM       = 0x01 << 2;     // 0x04
  static constexpr uint8_t UNDERLINE = 0x01 << 3;     // 0x08
  static constexpr uint8_t BLINK     = 0x01 << 4;     // 0x10
  static constexpr uint8_t REVERSE   = 0x01 << 5;     // 0x20

  public:
  static std::string clear();
  static std::string get(const Color   foregroundColor,
                         const uint8_t foregroundStyle = 0,
                         const Color   backgroundColor = Color::Black,
                         const uint8_t backgroundStyle = 0);
};
//--------------------------------------------------------------
inline std::string EscapeCommand::clear()
{
  return "\x1b[0m";
}
//--------------------------------------------------------------
inline std::string EscapeCommand::get(const Color foregroundColor, const uint8_t foregroundStyle, const Color backgroundColor, const uint8_t backgroundStyle)
{
  std::string command              = "\x1b[";
  int         foregroundColorValue = static_cast<int>(foregroundColor) + 30;
  if (foregroundStyle & LIGHT)
    foregroundColorValue += 60;
  command += std::to_string(foregroundColorValue) + ";";

  int backgroundColorValue = static_cast<int>(backgroundColor) + 40;
  if (backgroundStyle & LIGHT)
    backgroundColorValue += 60;
  command += std::to_string(backgroundColorValue);

  if (foregroundStyle & BRIGHT)
    command += ";1";
  if (foregroundStyle & DIM)
    command += ";2";
  if (foregroundStyle & UNDERLINE)
    command += ";4";
  if (foregroundStyle & BLINK)
    command += ";5";
  if (foregroundStyle & REVERSE)
    command += ";7";

  command += "m";
  return command;
}
//--------------------------------------------------------------
}     // namespace sdi_toolBox::console::ANSI
