// Copyright 2021 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.

#include "quic/core/http/web_transport_http3.h"

#include <memory>

#include "quic/core/http/quic_spdy_session.h"
#include "quic/core/http/quic_spdy_stream.h"

namespace quic {

namespace {
class QUIC_EXPORT_PRIVATE NoopWebTransportVisitor : public WebTransportVisitor {
  void OnSessionReady() override {}
  void OnIncomingBidirectionalStreamAvailable() override {}
  void OnIncomingUnidirectionalStreamAvailable() override {}
  void OnDatagramReceived(absl::string_view /*datagram*/) override {}
  void OnCanCreateNewOutgoingBidirectionalStream() override {}
  void OnCanCreateNewOutgoingUnidirectionalStream() override {}
};
}  // namespace

WebTransportHttp3::WebTransportHttp3(QuicSpdySession* session,
                                     QuicSpdyStream* connect_stream,
                                     WebTransportSessionId id)
    : session_(session),
      connect_stream_(connect_stream),
      id_(id),
      visitor_(std::make_unique<NoopWebTransportVisitor>()) {}

void WebTransportHttp3::HeadersReceived(
    const spdy::SpdyHeaderBlock& /*headers*/) {
  ready_ = true;
  visitor_->OnSessionReady();
}

WebTransportStream* WebTransportHttp3::AcceptIncomingBidirectionalStream() {
  // TODO(vasilvv): implement this.
  return nullptr;
}
WebTransportStream* WebTransportHttp3::AcceptIncomingUnidirectionalStream() {
  // TODO(vasilvv): implement this.
  return nullptr;
}

bool WebTransportHttp3::CanOpenNextOutgoingBidirectionalStream() {
  // TODO(vasilvv): implement this.
  return false;
}
bool WebTransportHttp3::CanOpenNextOutgoingUnidirectionalStream() {
  // TODO(vasilvv): implement this.
  return false;
}
WebTransportStream* WebTransportHttp3::OpenOutgoingBidirectionalStream() {
  // TODO(vasilvv): implement this.
  return nullptr;
}
WebTransportStream* WebTransportHttp3::OpenOutgoingUnidirectionalStream() {
  // TODO(vasilvv): implement this.
  return nullptr;
}

MessageStatus WebTransportHttp3::SendOrQueueDatagram(
    QuicMemSlice /*datagram*/) {
  // TODO(vasilvv): implement this.
  return MessageStatus::MESSAGE_STATUS_UNSUPPORTED;
}
void WebTransportHttp3::SetDatagramMaxTimeInQueue(
    QuicTime::Delta /*max_time_in_queue*/) {
  // TODO(vasilvv): implement this.
}

}  // namespace quic
