#include "http2/adapter/nghttp2_session.h"

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

namespace http2 {
namespace adapter {
namespace {

void DeleteOptions(nghttp2_option* options) {
  nghttp2_option_del(options);
}

}  // namespace

NgHttp2Session::NgHttp2Session(Perspective perspective,
                               nghttp2_session_callbacks_unique_ptr callbacks,
                               nghttp2_option* options,
                               void* userdata)
    : session_(MakeSessionPtr(nullptr)),
      options_(options, DeleteOptions),
      perspective_(perspective) {
  nghttp2_session* session;
  switch (perspective) {
    case Perspective::kClient:
      nghttp2_session_client_new2(&session, callbacks.get(), userdata,
                                  options_.get());
      break;
    case Perspective::kServer:
      nghttp2_session_server_new2(&session, callbacks.get(), userdata,
                                  options_.get());
      break;
  }
  session_.reset(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;
}

ssize_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
