// Copyright 2018 The Cobalt Authors. All Rights Reserved.
//
// 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.
#ifndef COBALT_SCRIPT_V8C_V8C_SCRIPT_DEBUGGER_H_
#define COBALT_SCRIPT_V8C_V8C_SCRIPT_DEBUGGER_H_

#include <memory>
#include <set>
#include <string>
#include <vector>

#include "base/logging.h"
#include "cobalt/script/script_debugger.h"
#include "cobalt/script/v8c/v8c_global_environment.h"
#include "v8/include/v8-inspector.h"

namespace cobalt {
namespace script {
namespace v8c {

class V8cScriptDebugger : public ScriptDebugger,
                          public v8_inspector::V8InspectorClient,
                          public v8_inspector::V8Inspector::Channel {
 public:
  V8cScriptDebugger(V8cGlobalEnvironment* v8c_global_environment,
                    Delegate* delegate);
  ~V8cScriptDebugger() override;

  void Attach(const std::string& state) override;
  std::string Detach() override;

  bool EvaluateDebuggerScript(const std::string& js_code,
                              std::string* out_result_utf8) override;

  std::set<std::string> SupportedProtocolDomains() override {
    return supported_domains_;
  }
  bool DispatchProtocolMessage(const std::string& method,
                               const std::string& message) override;

  std::string CreateRemoteObject(const ValueHandleHolder& object,
                                 const std::string& group) override;
  const script::ValueHandleHolder* LookupRemoteObjectId(
      const std::string& object_id) override;

  void StartTracing(const std::vector<std::string>& categories,
                    TraceDelegate* trace_delegate) override;
  void StopTracing() override;

  PauseOnExceptionsState SetPauseOnExceptions(
      PauseOnExceptionsState state) override;

  void AsyncTaskScheduled(const void* task, const std::string& name,
                          bool recurring) override;
  void AsyncTaskStarted(const void* task) override;
  void AsyncTaskFinished(const void* task) override;
  void AsyncTaskCanceled(const void* task) override;
  void AllAsyncTasksCanceled() override;

  // v8_inspector::V8InspectorClient implementation.
  void runMessageLoopOnPause(int contextGroupId) override;
  void quitMessageLoopOnPause() override;
  void runIfWaitingForDebugger(int contextGroupId) override;
  v8::Local<v8::Context> ensureDefaultContextInGroup(
      int contextGroupId) override;
  void consoleAPIMessage(int contextGroupId,
                         v8::Isolate::MessageErrorLevel level,
                         const v8_inspector::StringView& message,
                         const v8_inspector::StringView& url,
                         unsigned lineNumber, unsigned columnNumber,
                         v8_inspector::V8StackTrace*) override;

  // v8_inspector::V8Inspector::Channel implementation.
  void sendResponse(
      int callId, std::unique_ptr<v8_inspector::StringBuffer> message) override;
  void sendNotification(
      std::unique_ptr<v8_inspector::StringBuffer> message) override;
  void flushProtocolNotifications() override {}

 private:
  V8cGlobalEnvironment* global_environment_;
  Delegate* delegate_;
  const std::set<std::string> supported_domains_;
  std::unique_ptr<v8_inspector::V8Inspector> inspector_;
  PauseOnExceptionsState pause_on_exception_state_;

  // The session is NULL when not attached.
  std::unique_ptr<v8_inspector::V8InspectorSession> inspector_session_;
};

}  // namespace v8c
}  // namespace script
}  // namespace cobalt

#endif  // COBALT_SCRIPT_V8C_V8C_SCRIPT_DEBUGGER_H_
