// Copyright (c) 2022 Dominic Masters
// 
// This software is released under the MIT License.
// https://opensource.org/licenses/MIT

#include "UILabel.hpp"
#include "game/DawnGame.hpp"

using namespace Dawn;

UILabel::UILabel(UICanvas *canvas) : UIComponent(canvas) {
  evtLangUpdated = useEvent([&]{
    this->needsRebuffering = true;
    if(key.size() > 0 && this->getGame()->localeManager.getString(key).size() > 0) {
      this->hasText = true;
    }
  }, getGame()->localeManager.eventLanguageUpdated);
}

void UILabel::updatePositions() {
  UIComponent::updatePositions();
  this->updateMesh();
}

void UILabel::updateMesh() {
  if(!this->needsRebuffering || !this->hasText) return;
  if(this->font == nullptr || !this->font->isReady()) return;

  float_t width = this->width;
  if(width == 0) width = -1;

  std::string text = this->getGame()->localeManager.getString(key);
  this->font->buffer(
    text,
    this->fontSize,
    width,
    &this->mesh,
    &this->measure
  );

  this->needsRebuffering = false;
}

void UILabel::setFont(Font *font) {
  this->font = font;
  this->needsRebuffering = true;
}

void UILabel::setText(std::string key) {
  this->key = key;
  this->hasText = false;
  if(key.size() > 0 && this->getGame()->localeManager.getString(key).size()>0){
    this->hasText = true;
  }
  this->needsRebuffering = true;
}

void UILabel::setFontSize(float_t fontSize) {
  this->fontSize = fontSize;
  this->needsRebuffering = true;
}

float_t UILabel::getFontSize() {
  return this->fontSize;
}

float_t UILabel::getContentWidth() {
  this->updateMesh();
  return this->measure.getWidth();
}

float_t UILabel::getContentHeight() {
  this->updateMesh();
  return this->measure.getHeight();
}

std::vector<struct ShaderPassItem> UILabel::getSelfPassItems(
  glm::mat4 projection,
  glm::mat4 view,
  glm::mat4 transform
) {
  std::vector<struct ShaderPassItem> items;
  if(this->font == nullptr) return items;

  // this has to go eventually
  this->updateMesh();
  auto item = this->getGame()->renderManager.uiShaderProgram.getUIPassItem(
    projection,
    view,
    transform,
    this->font->getTexture(),
    this->textColor,
    &this->mesh,
    this->z
  );
  item.start = this->startQuad * QUAD_INDICE_COUNT;
  item.count = this->quadCount == -1 ? -1 : this->quadCount * QUAD_INDICE_COUNT;
  items.push_back(item);
  return items;
}

void UILabel::setTransform(
  UIComponentAlign xAlign,
  UIComponentAlign yAlign,
  glm::vec4 alignment,
  float_t z
) {
  this->needsRebuffering = true;
  UIComponent::setTransform(xAlign, yAlign, alignment, z);
}