#include "http2/adapter/nghttp2_session.h"

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

namespace http2 {
namespace adapter {
namespace {

void DeleteOptions(nghttp2_option* options) {
  if (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
