CarpetX: a Cactus driver for the Einstein Toolkit based on AMReX
#include "logo.hxx"

#include <sstream>
#include <string>
#include <vector>

namespace CarpetX {
using namespace std;
string logo() {

  // buf << "                                                               \n";
  // buf << "    ██████╗ █████╗ ██████╗ ██████╗ ███████╗████████╗██╗  ██╗   \n";
  // buf << "   ██╔════╝██╔══██╗██╔══██╗██╔══██╗██╔════╝╚══██╔══╝╚██╗██╔╝   \n";
  // buf << "   ██║     ███████║██████╔╝██████╔╝█████╗     ██║    ╚███╔╝    \n";
  // buf << "   ██║     ██╔══██║██╔══██╗██╔═══╝ ██╔══╝     ██║    ██╔██╗    \n";
  // buf << "   ╚██████╗██║  ██║██║  ██║██║     ███████╗   ██║   ██╔╝ ██╗   \n";
  // buf << "    ╚═════╝╚═╝  ╚═╝╚═╝  ╚═╝╚═╝     ╚══════╝   ╚═╝   ╚═╝  ╚═╝   \n";
  // buf << "                                                               \n";

  // colours
  const string blk{"\e[30m"};
  const string red{"\e[31m"};
  const string grn{"\e[32m"};
  const string yel{"\e[33m"};
  const string blu{"\e[34m"};
  const string mag{"\e[35m"};
  const string cyn{"\e[36m"};
  const string whi{"\e[37m"};
  const string reset{"\e[39m"};

  // lines and boxes
  const string space{"  "};
  const string vline{"▕▏"};
  const string hline{"──"};
  const string hline2{"━━"};
  const string block{"██"};

  const vector<string> blu_box{
      blu + space + vline + space,
      blu + hline + block + hline,
      blu + space + vline + space,
  };
  const vector<string> grn_box{
      grn + block + block + block,
      grn + block + block + block,
      grn + block + block + block,
  };
  const vector<string> red_box{
      red + block + block + block,
      red + block + block + block,
      red + block + block + block,
  };

  const vector<string> outer_box{
      blu_box[0] + blu_box[0] + blu_box[0],
      blu_box[1] + blu_box[1] + blu_box[1],
      blu_box[2] + blu_box[2] + blu_box[2],
      blu_box[0] + grn_box[0] + blu_box[0],
      blu_box[1] + grn_box[1] + blu_box[1],
      blu_box[2] + grn_box[2] + blu_box[2],
      blu_box[0] + blu_box[0] + blu_box[0],
      blu_box[1] + blu_box[1] + blu_box[1],
      blu_box[2] + blu_box[2] + blu_box[2],
  };
  const vector<string> inner_box{
      red_box[0] + red_box[0] + red_box[0],
      red_box[1] + red_box[1] + red_box[1],
      red_box[2] + red_box[2] + red_box[2],
      red_box[0] + red_box[0] + red_box[0],
      red_box[1] + red_box[1] + red_box[1],
      red_box[2] + red_box[2] + red_box[2],
      red_box[0] + red_box[0] + red_box[0],
      red_box[1] + red_box[1] + red_box[1],
      red_box[2] + red_box[2] + red_box[2],
  };

  vector<string> logo;
  for (int line = 0; line < 9; ++line)
    logo.push_back(outer_box[line] + outer_box[line] + outer_box[line]);
  for (int line = 0; line < 9; ++line)
    logo.push_back(outer_box[line] + inner_box[line] + outer_box[line]);
  for (int line = 0; line < 9; ++line)
    logo.push_back(outer_box[line] + outer_box[line] + outer_box[line]);

  ostringstream buf;
  buf << "\n";
  for (const auto &str : logo)
    buf << "  " << str << reset << "  \n";
  buf << "\n";
  return buf.str();
}
} // namespace CarpetX