#pragma once
#include "image/image.hpp"
#include "common/unicode.hpp"
#include <map>
using namespace std::string_literals;
//! базовый класс для шрифтов
class Font {
public:
  std::map<uint, Image> chars = {}; ///< картинки символов
  int width = 0, height = 0; ///< высота шрифта
  int space_x = 0, space_y = 0; ///< величина отступа
  Font() = default;
  virtual ~Font() = default;
  void free() {
    chars.clear();
    width = height = 0;
    space_x = space_y = 0;
  }
  //! получить изображение символа
  CN(Image) get_char(uint char_code) const {
    #ifdef DEBUG
    try {
      return chars.at(char_code);
    } catch (CN(std::exception) ex) {
      a83::log("font.get_char (charcode: " + a83::n2hex(char_code) + "): ");
      return zero_image;
    }
    return zero_image;
    #else
    return chars.at(char_code);
    #endif
  } // get_char
  virtual void print(Image& dst, int x, int y, CN(utf32) text,
  bool black_gr = false, int wnd_x = 0, int wnd_y = 0,
  Image::print_f pf = &Image::print_max) const {
    (void)dst;
    (void)x; (void)y;
    (void)text;
    (void)wnd_x; (void)wnd_y;
  }
private:
  nocopy(Font);
}; // Font