// Copyright 2019 Google LLC
//
// 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
//
//      https://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 "third_party/mlir_edge/iree/vm/debug/debug_server_flags.h"

#include "third_party/absl/flags/flag.h"
#include "third_party/absl/strings/str_cat.h"
#include "third_party/mlir_edge/iree/base/memory.h"
#include "third_party/mlir_edge/iree/base/status.h"

#if defined(IREE_DEBUG_EMBEDDED_APP_PRESENT)
#include "third_party/mlir_edge/iree/tools/debugger/debug_app_embedded.h"
#endif  // IREE_DEBUG_EMBEDDED_APP_PRESENT

ABSL_FLAG(int32_t, iree_debug_service_port, 6000,
          "TCP port to listen for debug service connections.");
ABSL_FLAG(bool, iree_wait_for_debugger, false,
          "Waits until a debugger connects to continue startup.");
ABSL_FLAG(bool, iree_attach_debugger, false, "Attaches a debugger at startup.");

namespace iree {
namespace vm {
namespace debug {

StatusOr<std::unique_ptr<DebugServer>> CreateDebugServerFromFlags() {
  // Create the server based on whatever version is compiled in.
  // Note that this will return nullptr if no server is available.
  ASSIGN_OR_RETURN(
      auto debug_server,
      DebugServer::Create(absl::GetFlag(FLAGS_iree_debug_service_port)));
  if (!debug_server) {
    return nullptr;
  }

#if defined(IREE_DEBUG_EMBEDDED_APP_PRESENT)
  // If the embedded debug UI is present then we can launch that now.
  std::unique_ptr<EmbeddedDebugger> debugger;
  if (absl::GetFlag(FLAGS_iree_attach_debugger)) {
    LOG(INFO) << "Attaching debugger at startup...";
    ASSIGN_OR_RETURN(
        debugger,
        AttachDebugger(absl::StrCat(
            "localhost:", absl::GetFlag(FLAGS_iree_debug_service_port))));
    RETURN_IF_ERROR(debug_server->WaitUntilSessionReady());
    LOG(INFO) << "Debugger attached";
    // TODO(benvanik): C++14 to avoid this.
    auto debugger_baton = MoveToLambda(debugger);
    debug_server->AtExit([debugger_baton]() { debugger_baton.value.reset(); });
  }
#else
  if (absl::GetFlag(FLAGS_iree_attach_debugger)) {
    LOG(WARNING) << "--iree_attach_debugger specified but no embedded debugger "
                    "is present. Build with --define=IREE_DEBUG=1.";
  }
#endif  // IREE_DEBUG_EMBEDDED_APP_PRESENT

  // Wait for a debugger to connect.
  if (absl::GetFlag(FLAGS_iree_wait_for_debugger)) {
    LOG(INFO) << "Waiting for a debugger to connect...";
    RETURN_IF_ERROR(debug_server->WaitUntilSessionReady());
    LOG(INFO) << "Debugger ready, resuming...";
  }

  return std::move(debug_server);
}

}  // namespace debug
}  // namespace vm
}  // namespace iree
