#include "http2/adapter/nghttp2_session.h"

#include "common/platform/api/quiche_logging.h"

namespace http2 {
namespace adapter {

NgHttp2Session::NgHttp2Session(Perspective perspective,
                               nghttp2_session_callbacks_unique_ptr callbacks,
                               const nghttp2_option* options, void* userdata)
    : session_(MakeSessionPtr(nullptr)), perspective_(perspective) {
  nghttp2_session* session;
  switch (perspective_) {
    case Perspective::kClient:
      nghttp2_session_client_new2(&session, callbacks.get(), userdata, options);
      break;
    case Perspective::kServer:
      nghttp2_session_server_new2(&session, callbacks.get(), userdata, options);
      break;
  }
  session_ = MakeSessionPtr(session);
}

NgHttp2Session::~NgHttp2Session() {
  // Can't invoke want_read() or want_write(), as they are virtual methods.
  const bool pending_reads = nghttp2_session_want_read(session_.get()) != 0;
  const bool pending_writes = nghttp2_session_want_write(session_.get()) != 0;
  if (pending_reads || pending_writes) {
    QUICHE_VLOG(1) << "Shutting down connection with pending reads: "
                   << pending_reads << " or pending writes: " << pending_writes;
  }
}

int64_t NgHttp2Session::ProcessBytes(absl::string_view bytes) {
  return nghttp2_session_mem_recv(
      session_.get(), reinterpret_cast<const uint8_t*>(bytes.data()),
      bytes.size());
}

int NgHttp2Session::Consume(Http2StreamId stream_id, size_t num_bytes) {
  return nghttp2_session_consume(session_.get(), stream_id, num_bytes);
}

bool NgHttp2Session::want_read() const {
  return nghttp2_session_want_read(session_.get()) != 0;
}

bool NgHttp2Session::want_write() const {
  return nghttp2_session_want_write(session_.get()) != 0;
}

int NgHttp2Session::GetRemoteWindowSize() const {
  return nghttp2_session_get_remote_window_size(session_.get());
}

}  // namespace adapter
}  // namespace http2
