#include "PopupHelper.h"
#include "imgui/imgui.h"
#include "regex"

void PopupHelper::OpenPopup(const std::string& id)
{
    ImGui::OpenPopup(id.c_str());
}

bool PopupHelper::DefineConfirmationDialog(const std::string& id, const std::string& text)
{
    bool result = false;

    ImVec2 center = ImGui::GetMainViewport()->GetCenter();
    ImGui::SetNextWindowPos(center, ImGuiCond_Appearing, ImVec2(0.5f, 0.5f));

    if (ImGui::BeginPopupModal(id.c_str(), NULL, ImGuiWindowFlags_AlwaysAutoResize))
    {
        ImGui::Text((text + "\n\n").c_str());
        ImGui::Separator();

        if (ImGui::Button("OK", ImVec2(120, 0))) { result = true; ImGui::CloseCurrentPopup(); }
        ImGui::SetItemDefaultFocus();
        ImGui::SameLine();
        if (ImGui::Button("Cancel", ImVec2(120, 0))) { ImGui::CloseCurrentPopup(); }
        ImGui::EndPopup();
    }

    return result;
}

bool PopupHelper::DefineTextDialog(const std::string& id, std::string& currentText)
{
    bool result = false;

    ImVec2 center = ImGui::GetMainViewport()->GetCenter();
    ImGui::SetNextWindowPos(center, ImGuiCond_Appearing, ImVec2(0.5f, 0.5f));

    if (ImGui::BeginPopupModal(id.c_str(), NULL, ImGuiWindowFlags_AlwaysAutoResize))
    {
        bool isSanitized = true;

        char buffer[256];
        memset(buffer, 0, sizeof(buffer));

        #ifdef NK_WIN
        std::strncpy(buffer, currentText.c_str(), sizeof(buffer));
        #endif

        #ifdef NK_LINUX
            strncpy(buffer, currentText.c_str(), sizeof(buffer));
        #endif
        if (ImGui::InputText("##label", buffer, sizeof(buffer)))
        {
            currentText = std::string(buffer);
        }

        // returns false when there is a match, quirky
        if (!regex_match(buffer, std::regex("[^ \\ / :*? \"<>|]+")))
        {
            isSanitized = false;
        }

        if (currentText.empty())
        {
            ImGui::TextColored(ImVec4(0.76, 0.45, 0.47, 1.0), "A file name can't be empty.");
        } 
        else if (!isSanitized)
        {
            ImGui::TextColored(ImVec4(0.76, 0.45, 0.47, 1.0), "A file name can't contain any of the following characters: \\/:*?\"<>|");
        }

        ImGui::Separator();

        if (ImGui::Button("OK", ImVec2(120, 0))) 
        { 
            if (isSanitized)
            {
                result = true;
                ImGui::CloseCurrentPopup();
            }
        }
        ImGui::SetItemDefaultFocus();
        ImGui::SameLine();
        if (ImGui::Button("Cancel", ImVec2(120, 0))) { ImGui::CloseCurrentPopup(); }
        ImGui::EndPopup();
    }

    return result;
}
