#include "interact.hpp"

#include "../info.hpp"

#include "../../../util/imgui/widget.hpp"

using namespace game::resource;
using namespace game::resource::xml;
using namespace game::util;
using namespace game::util::imgui;

namespace game::state::play::menu
{
  void Interact::update(Resources& resources, Text& text, Entity& character, bool)
  {
    static constexpr auto ZERO_FLOAT = 0.0f;

    auto& dialogue = character.data.dialogue;
    auto& strings = character.data.strings;
    auto* random = dialogue.get(Schema::Element::RANDOM);
    auto* help = dialogue.get(Schema::Element::HELP);
    auto stage = glm::clamp(0, character.stage_get(), character.stage_max_get());
    auto poolID = character.data.stage_pool_id_get(stage);
    auto isFeelingAvailable = poolID != -1;

    ImGui::PushFont(ImGui::GetFont(), resource::Font::HEADER_1);
    ImGui::SeparatorText(character.data.root()->name.c_str());
    ImGui::PopFont();

    info_content_draw(resources, character, ImVec2(ImGui::GetContentRegionAvail().x, info_height_get()));

    auto buttonHeight = ZERO_FLOAT;
    if (random)
    {
      ImGui::PushFont(ImGui::GetFont(), resource::Font::HEADER_1);
      buttonHeight += ImGui::GetFrameHeightWithSpacing();
      ImGui::PopFont();
    }
    if (help)
    {
      ImGui::PushFont(ImGui::GetFont(), resource::Font::HEADER_2);
      buttonHeight += ImGui::GetFrameHeightWithSpacing();
      ImGui::PopFont();
    }
    if (isFeelingAvailable)
    {
      ImGui::PushFont(ImGui::GetFont(), resource::Font::HEADER_2);
      buttonHeight += ImGui::GetFrameHeightWithSpacing();
      ImGui::PopFont();
    }

    auto fillerHeight = ImGui::GetContentRegionAvail().y - buttonHeight;
    if (fillerHeight > ZERO_FLOAT) ImGui::Dummy(ImVec2(ImGui::GetContentRegionAvail().x, fillerHeight));

    if (random)
    {
      ImGui::PushFont(ImGui::GetFont(), resource::Font::HEADER_1);
      if (WIDGET_FX(ImGui::Button(strings.get(Strings::InteractChatButton).c_str(),
                                  ImVec2(ImGui::GetContentRegionAvail().x, ZERO_FLOAT))))
        text.set(dialogue.dialogue_pool_entry_get(*random), character);
      ImGui::PopFont();
    }

    if (help)
    {
      ImGui::PushFont(ImGui::GetFont(), resource::Font::HEADER_2);
      if (WIDGET_FX(ImGui::Button(strings.get(Strings::InteractHelpButton).c_str(),
                                  ImVec2(ImGui::GetContentRegionAvail().x, ZERO_FLOAT))))
        text.set(dialogue.dialogue_entry_get(*help), character);
      ImGui::PopFont();
    }

    if (poolID != -1)
    {
      ImGui::PushFont(ImGui::GetFont(), resource::Font::HEADER_2);
      if (WIDGET_FX(
              ImGui::Button(strings.get(Strings::InteractFeelingButton).c_str(),
                            ImVec2(ImGui::GetContentRegionAvail().x, ZERO_FLOAT))))
        text.set(dialogue.dialogue_pool_entry_get(poolID), character);
      ImGui::PopFont();
    }
  }
}
