#pragma once
#include "a83/macro.hpp"
#include "game/game-const.hpp"
#include "common/common.hpp"
//! система подсветки опасностей на игровом экране
class Warning {
public:
  constx float warn_dist = Game::WARN_DIST;
  constx float minimum_radius = 2.5f;
protected:
  constx uint mipmap_circle_max = 18; ///< число пререндеренных кружков
  constx float mipmap_circle_radius = 9.0f; ///< размер пререндеренного кружка
  constx float rarius_step_max = mipmap_circle_radius / mipmap_circle_max;
  std::array<Image, mipmap_circle_max> mipmap_circle = {};
  Bank_anim::Item* arrow = 0; ///< большие красные стрелки
public:
  constx uint MISSILE = 1 << 0; ///< флаг самонаводящейся ракеты
  uint status = 0;
  Warning() = default;
  ~Warning() = default;
  void init() {
    // инит пререндера кружков
    float rarius_step = 0.0f;
    for (nauto circle_pic: mipmap_circle) {
      circle_pic.init(rarius_step * 2.25f + 3.0f, rarius_step * 2.25f + 3.0f,
        Color::BLACK);
      circle_pic.circle_fill(circle_pic.getX() / 2, circle_pic.getX() / 2,
        Color::WHITE, rarius_step);
      rarius_step += rarius_step_max;
    }
    load_arrow();
  } // init
  void load_arrow();
  void draw_arrow(CN(Vec) A, CN(Vec) B, CN(Vec) offset, Image& dst) const;
  //! на вас охотится ракета!
  void add_missile_warn() { status |= MISSILE; }
  //! ret 0 if no homing msls
  auto check_missile()->decltype(status) { return (status & MISSILE); }
  //! отрисовка приближения пуль
  void draw_blt(Vec pos, CN(Vec) offset, Image& dst) const
    { draw_detector(pos, offset, 53.0f, 4.0f, dst, true); }
  //! отрисовка приближения противников
  void draw_ene(Vec pos, CN(Vec) offset, Image& dst) const
    { draw_detector(pos, offset, 42.0f, mipmap_circle_radius, dst); }
private:
  void print_mipmap_circle_diff(float x, float y, float radius, Image& dst) const {
    const uint index = std::clamp<float>(radius * (1.0f / rarius_step_max),
      0.0f, mipmap_circle_max);
    const Image& circle_pix = mipmap_circle[index];
    circle_pix.print_diff(x - circle_pix.getX() / 2, y - circle_pix.getY() / 2,
      dst);
  }
  /** рисует вокруг игрока кружки обозначающие дальность врагов
   *@param print_dist растояние от игрока */
  void draw_detector(Vec pos, CN(Vec) offset, float print_dist,
  float print_radius, Image& dst, bool use_red = false) const {
    if (p_plr->is_dead())
      return;
    if (use_red and (int(Game::timer_anim) & 1))
      return;
    cauto dist = distance(pos, g_offset.pos);
    pos.normalize();
    pos *= print_dist;
    pos += offset;
    float radius;
    //! шарик видно всегда, даж когда объект очень далеко
    if (dist > warn_dist)
      radius = minimum_radius;
    else {
      constexpr float warn_dist_mul = 1.0f / warn_dist;
      radius = std::lerp(print_radius, 0.0f, dist * warn_dist_mul);
      radius = std::max(radius, minimum_radius);
    }
    if (use_red)
      dst.circle_fill(pos.x, pos.y, Color::RED, radius);
    else
      print_mipmap_circle_diff(pos.x, pos.y, radius, dst);
  } // draw_detector
};
namespace {
  Warning warning = {};
}
#include "warning-arrow.cpp"