// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_UI_DEVTOOLS_DEVTOOLS_CLIENT_H_
#define COMPONENTS_UI_DEVTOOLS_DEVTOOLS_CLIENT_H_

#include <string>
#include <vector>

#include "base/memory/raw_ptr.h"
#include "components/ui_devtools/devtools_base_agent.h"
#include "components/ui_devtools/devtools_export.h"
#include "components/ui_devtools/dom.h"
#include "components/ui_devtools/forward.h"
#include "components/ui_devtools/protocol.h"

namespace ui_devtools {

class UiDevToolsServer;

// Every UI component that wants to be inspectable must instantiate
// this class and attach the corresponding backends/frontends (i.e: DOM, CSS,
// etc). This client is then attached to the UiDevToolsServer and all messages
// from this client are sent over the web socket owned by the server.
class UI_DEVTOOLS_EXPORT UiDevToolsClient : public protocol::FrontendChannel {
 public:
  static const int kNotConnected = -1;

  UiDevToolsClient(const std::string& name, UiDevToolsServer* server);

  UiDevToolsClient(const UiDevToolsClient&) = delete;
  UiDevToolsClient& operator=(const UiDevToolsClient&) = delete;

  ~UiDevToolsClient() override;

  void AddAgent(std::unique_ptr<UiDevToolsAgent> agent);
  void Disconnect();
  void Dispatch(const std::string& json);

  bool connected() const;
  void set_connection_id(int connection_id);
  const std::string& name() const;

 private:
  void DisableAllAgents();
  void MaybeSendProtocolResponseOrNotification(
      std::unique_ptr<protocol::Serializable> message);

  // protocol::FrontendChannel
  void SendProtocolResponse(
      int callId,
      std::unique_ptr<protocol::Serializable> message) override;
  void SendProtocolNotification(
      std::unique_ptr<protocol::Serializable> message) override;
  void FlushProtocolNotifications() override;
  void FallThrough(int call_id,
                   crdtp::span<uint8_t> method,
                   crdtp::span<uint8_t> message) override;

  std::string name_;
  int connection_id_;

  std::vector<std::unique_ptr<UiDevToolsAgent>> agents_;
  protocol::UberDispatcher dispatcher_;
  raw_ptr<UiDevToolsServer> server_;
};

}  // namespace ui_devtools

#endif  // COMPONENTS_UI_DEVTOOLS_DEVTOOLS_CLIENT_H_
