// Copyright 2026 DeepMind Technologies Limited
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "experimental/platform/file_dialog.h"

#include <cstring>

#include <span>
#include <string>
#include <string_view>

#include <imgui.h>

namespace mujoco::platform {

static DialogResult ImGui_FileDialog(std::string_view path) {
  static constexpr int kBufferSize = 1024;
  char buf[kBufferSize];
  std::strncpy(buf, path.data(), sizeof(buf));
  buf[sizeof(buf) - 1] = '\0';

  DialogResult::Status status = DialogResult::kPending;

  ImGui::Text("Filename");
  ImGui::SameLine();
  ImGui::SetNextItemWidth(600);
  if (ImGui::InputText("##Filename", buf, kBufferSize, ImGuiInputTextFlags_EnterReturnsTrue)) {
    status = DialogResult::kAccepted;
  }
  if (ImGui::Button("OK", ImVec2(120, 0)) || ImGui::IsKeyChordPressed(ImGuiKey_Enter)) {
    status = DialogResult::kAccepted;
  }
  ImGui::SetItemDefaultFocus();
  ImGui::SameLine();
  if (ImGui::Button("Cancel", ImVec2(120, 0)) || ImGui::IsKeyChordPressed(ImGuiKey_Escape)) {
    status = DialogResult::kCancelled;
  }

  return DialogResult{.status = status, .path = std::string(buf)};
}

DialogResult OpenFileDialog(std::string_view path,
                            std::span<std::string_view> filters) {
  return ImGui_FileDialog(path);
}

DialogResult SaveFileDialog(std::string_view path,
                            std::span<std::string_view> filters) {
  return ImGui_FileDialog(path);
}

DialogResult SelectPathDialog(std::string_view path) {
  return ImGui_FileDialog(path);
}

}  // namespace mujoco::platform
