#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;
  QUICHE_LOG_IF(WARNING, pending_reads || pending_writes)
      << "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
