#pragma once
#include "image/image.hpp"
#include "game/game-data.hpp"
#include "game/score.hpp"
#include "enity/player/plr.hpp"
namespace UI {
  enum draw_mode_e {
    none = 0, ///< без интерфейса
    line_u, ///< прозрачная полоска сверху
    line_d, ///< прозрачная полоска снизу
  } draw_mode = draw_mode_e::line_d; ///< режим отображения интерфейса
  /** рисует полоски статуса
    @param dst куда рисовать
    @param sx позиция x
    @param sy позиция y
    @param mx ширина полоски
    @param my высота полоски
    @param val текущее значение
    @param val_max макс значение
    @param bg цвет фона полоски
    @param cl цвет полоски 
    @param dir направление полоски: 0 ->, 1 \/, 2 <-, 3 /\ */
  void draw_loadbar(Image& dst, int sx, int sy, int mx, int my,
  int val, int val_max, CN(Color) bg = Color::BLACK,
  CN(Color) cl = Color::WHITE, int dir = 0) {
    using namespace a83;
    #ifdef DEBUG
    if ( !dst.check())
      error("draw_loadbar: !dst");
    if (val_max <= 0 or val_max < val)
      error("draw_loadbar: val/val_max error (" + n2s(val) + "/" +
        n2s(val_max) + ")");
    #endif
    dst.draw_rect_filled(sx, sy, mx, my, bg); // фон полоски
    (void)dir; // TODO use dir
    const int line_mx = std::lerp(0, mx, val / float(val_max));
    dst.draw_rect_filled(sx, sy, line_mx, my, cl); // сама полоска
  } // draw_loadbar
  //! интерфейс - прозрачная полоска
  void draw_HUD_line(Image& dst, int pos_y = 0, int my = 13) {
    dst.draw_rect_filled_blend_158(0, pos_y, dst.getX(), my, Color::BLACK);
    cauto x_hp = 2;
    cauto x_hp_bar = x_hp + 14;
    cauto x_hp_bar_len = 90;
    cauto x_en = x_hp_bar + x_hp_bar_len + 8;
    cauto x_en_bar = x_en + 14;
    cauto x_en_bar_len = 90;
    cauto x_score = x_en_bar + x_en_bar_len + 8;
    cauto y_bar = 5;
    // TODO locale
    Game::font->print(dst, x_hp, pos_y + 2, U"HP");
    draw_loadbar(dst, x_hp_bar, pos_y + y_bar, x_hp_bar_len, 4,
      p_plr->hp, rcast(CP(Ship_info), p_plr->p_info)->hp);
    Game::font->print(dst, x_en, pos_y + 2, U"EN");
    draw_loadbar(dst, x_en_bar, pos_y + y_bar, x_en_bar_len, 4,
      p_plr->en.val, p_plr->en.size);
    Game::font->print(dst, x_score, pos_y + 2, sconv<utf32>("SCORE: "
      + a83::n2s(Game::score)) );
  } // draw_HUD_line_d
  //! принтит игровой интерфейс
  void draw_HUD(Image& dst) {
    using namespace a83;
    switch (draw_mode) {
      default:
      case draw_mode_e::none: break;
      case draw_mode_e::line_u: draw_HUD_line(dst, 0, 13); break;
      case draw_mode_e::line_d: draw_HUD_line(dst, dst.getY() - 13, 13); break;
    }
    // TODO warning.check_missile
  } // draw_HUD
} // UI ns