// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/developer/debug/zxdb/format/string_util.h"

namespace zxdb {

std::string GetCurrentRowMarker() {
  // U+25B6 BLACK RIGHT-POINTING TRIANGLE.
  return std::string("\xe2\x96\xb6");
}

std::string GetBreakpointMarker() {
  // U+25C9 FISHEYE.
  // It might be nice to use U+1F534 LARGE RED CIRCLE which on Mac even has
  // cool shading. But the Mac terminal things it takes 2 characters of layout
  // which makes it hard to predict layout in a cross-platform way.
  return std::string("\xe2\x97\x89");
}

std::string GetDisabledBreakpointMarker() {
  // U+25EF LARGE CIRCLE
  return std::string("\xe2\x97\xaf");
}

std::string GetBullet() {
  // U+2022 BULLET
  return std::string("\xe2\x80\xa2");
}

std::string GetExclamation() {
  // U+26A0 WARNING SIGN, U+FE0F VARIATION SELECTOR 16
  // (Without the variation selector this looks like a small black-and-white
  // version. The variation selector selects the colored emoji variant.)
  return std::string("⚠️ ");
}

std::string GetRightArrow() {
  // U+2794 HEAVY WIDE-HEADED RIGHTWARDS ARROW
  // Note that U+1F87A (" 🡺 ")looks better on Linux but isn't supported on Mac or ChromeOS, and
  // we need to support at least ssh-ing from these platforms.
  return "➔";
}

std::optional<bool> StringToBool(std::string_view s) {
  if (s == "0" || s == "false")
    return false;
  else if (s == "1" || s == "true")
    return true;
  return std::nullopt;
}

const char* BoolToString(bool b) { return b ? "true" : "false"; }

size_t UnicodeCharWidth(const std::string& str) {
  size_t result = 0;

  for (size_t i = 0; i < str.size(); i++) {
    uint32_t code_point;
    // Don't care about the success of this since we just care about
    // incrementing the index.
    fxl::ReadUnicodeCharacter(str.data(), str.size(), &i, &code_point);
    result++;
  }
  return result;
}

}  // namespace zxdb
