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

#ifndef QUICHE_QUIC_MOQT_TOOLS_MOQT_CLIENT_H_
#define QUICHE_QUIC_MOQT_TOOLS_MOQT_CLIENT_H_

#include <memory>
#include <string>

#include "absl/status/status.h"
#include "quiche/quic/core/crypto/proof_verifier.h"
#include "quiche/quic/core/http/quic_spdy_client_session.h"
#include "quiche/quic/core/io/quic_event_loop.h"
#include "quiche/quic/core/quic_session.h"
#include "quiche/quic/moqt/moqt_session.h"
#include "quiche/quic/moqt/moqt_session_callbacks.h"
#include "quiche/quic/platform/api/quic_socket_address.h"
#include "quiche/quic/tools/quic_default_client.h"
#include "quiche/common/platform/api/quiche_export.h"

namespace moqt {

// A synchronous MoQT client based on QuicDefaultClient.
class QUICHE_EXPORT MoqtClient {
 public:
  MoqtClient(quic::QuicSocketAddress peer_address,
             const quic::QuicServerId& server_id,
             std::unique_ptr<quic::ProofVerifier> proof_verifier,
             quic::QuicEventLoop* event_loop);

  // Establishes the connection to the specified endpoint. The errors are
  // returned via the session termination callback.
  void Connect(std::string path, MoqtSessionCallbacks callbacks);

  MoqtSession* session() { return session_; }
  quic::QuicSession* quic_session() { return spdy_client_.session(); }

 private:
  absl::Status ConnectInner(std::string path, MoqtSessionCallbacks& callbacks);

  quic::QuicDefaultClient spdy_client_;
  MoqtSession* session_ = nullptr;
};

}  // namespace moqt

#endif  // QUICHE_QUIC_MOQT_TOOLS_MOQT_CLIENT_H_
