#include "logger_sink.h"
#include "core/style.h"
#include "imgui/imgui.h"

namespace satdump
{
    namespace widgets
    {
        void LoggerSinkWidget::receive(slog::LogMsg log)
        {
            if (log.lvl >= sink_lvl)
            {
                mtx.lock();
                new_item = true;
                all_lines.push_back({log.lvl, format_log(log, false)});
                if (all_lines.size() == max_lines)
                    all_lines.pop_front();
                mtx.unlock();
            }
        }

        void LoggerSinkWidget::draw()
        {
            mtx.lock();
            for (LogLine &ll : all_lines)
            {
                std::string timestamp = ll.str.substr(0, 24);
                std::string text = ll.str.substr(24, ll.str.size());

                ImGui::Text("%s", timestamp.c_str());
                ImGui::SameLine();

                if (ll.lvl == slog::LOG_TRACE)
                    ImGui::TextUnformatted(text.c_str());
                else if (ll.lvl == slog::LOG_DEBUG)
                    ImGui::TextColored(style::theme.cyan, "%s", text.c_str());
                else if (ll.lvl == slog::LOG_INFO)
                    ImGui::TextColored(style::theme.green, "%s", text.c_str());
                else if (ll.lvl == slog::LOG_WARN)
                    ImGui::TextColored(style::theme.yellow, "%s", text.c_str());
                else if (ll.lvl == slog::LOG_ERROR)
                    ImGui::TextColored(style::theme.red, "%s", text.c_str());
                else if (ll.lvl == slog::LOG_CRIT)
                    ImGui::TextColored(style::theme.fuchsia, "%s", text.c_str());
            }
            if (new_item)
            {
                ImGui::SetScrollHereY(1.0f);
                new_item = false;
            }
            if (ImGui::IsWindowAppearing())
                new_item = true;
            mtx.unlock();
        }
    } // namespace widgets
} // namespace satdump