#include "http2/adapter/mock_nghttp2_callbacks.h"

#include "http2/adapter/nghttp2_util.h"

namespace http2 {
namespace adapter {
namespace test {

/* static */
nghttp2_session_callbacks* MockNghttp2Callbacks::GetCallbacks() {
  nghttp2_session_callbacks* callbacks;
  nghttp2_session_callbacks_new(&callbacks);

  // All of the callback implementations below just delegate to the mock methods
  // of |user_data|, which is assumed to be a MockNghttp2Callbacks*.
  nghttp2_session_callbacks_set_send_callback(
      callbacks,
      [](nghttp2_session*, const uint8_t* data, size_t length, int flags,
         void* user_data) -> ssize_t {
        return static_cast<MockNghttp2Callbacks*>(user_data)->Send(data, length,
                                                                   flags);
      });

  nghttp2_session_callbacks_set_send_data_callback(
      callbacks,
      [](nghttp2_session*, nghttp2_frame* frame, const uint8_t* framehd,
         size_t length, nghttp2_data_source* source, void* user_data) -> int {
        return static_cast<MockNghttp2Callbacks*>(user_data)->SendData(
            frame, framehd, length, source);
      });

  nghttp2_session_callbacks_set_on_begin_headers_callback(
      callbacks,
      [](nghttp2_session*, const nghttp2_frame* frame, void* user_data) -> int {
        return static_cast<MockNghttp2Callbacks*>(user_data)->OnBeginHeaders(
            frame);
      });

  nghttp2_session_callbacks_set_on_header_callback(
      callbacks,
      [](nghttp2_session*, const nghttp2_frame* frame, const uint8_t* raw_name,
         size_t name_length, const uint8_t* raw_value, size_t value_length,
         uint8_t flags, void* user_data) -> int {
        absl::string_view name = ToStringView(raw_name, name_length);
        absl::string_view value = ToStringView(raw_value, value_length);
        return static_cast<MockNghttp2Callbacks*>(user_data)->OnHeader(
            frame, name, value, flags);
      });

  nghttp2_session_callbacks_set_on_data_chunk_recv_callback(
      callbacks,
      [](nghttp2_session*, uint8_t flags, int32_t stream_id,
         const uint8_t* data, size_t len, void* user_data) -> int {
        absl::string_view chunk = ToStringView(data, len);
        return static_cast<MockNghttp2Callbacks*>(user_data)->OnDataChunkRecv(
            flags, stream_id, chunk);
      });

  nghttp2_session_callbacks_set_on_begin_frame_callback(
      callbacks,
      [](nghttp2_session*, const nghttp2_frame_hd* hd, void* user_data) -> int {
        return static_cast<MockNghttp2Callbacks*>(user_data)->OnBeginFrame(hd);
      });

  nghttp2_session_callbacks_set_on_frame_recv_callback(
      callbacks,
      [](nghttp2_session*, const nghttp2_frame* frame, void* user_data) -> int {
        return static_cast<MockNghttp2Callbacks*>(user_data)->OnFrameRecv(
            frame);
      });

  nghttp2_session_callbacks_set_on_stream_close_callback(
      callbacks,
      [](nghttp2_session*, int32_t stream_id, uint32_t error_code,
         void* user_data) -> int {
        return static_cast<MockNghttp2Callbacks*>(user_data)->OnStreamClose(
            stream_id, error_code);
      });

  nghttp2_session_callbacks_set_on_frame_send_callback(
      callbacks,
      [](nghttp2_session*, const nghttp2_frame* frame, void* user_data) -> int {
        return static_cast<MockNghttp2Callbacks*>(user_data)->OnFrameSend(
            frame);
      });

  nghttp2_session_callbacks_set_before_frame_send_callback(
      callbacks,
      [](nghttp2_session*, const nghttp2_frame* frame, void* user_data) -> int {
        return static_cast<MockNghttp2Callbacks*>(user_data)->BeforeFrameSend(
            frame);
      });

  nghttp2_session_callbacks_set_on_frame_not_send_callback(
      callbacks,
      [](nghttp2_session*, const nghttp2_frame* frame, int lib_error_code,
         void* user_data) -> int {
        return static_cast<MockNghttp2Callbacks*>(user_data)->OnFrameNotSend(
            frame, lib_error_code);
      });

  nghttp2_session_callbacks_set_on_invalid_frame_recv_callback(
      callbacks,
      [](nghttp2_session*, const nghttp2_frame* frame, int error_code,
         void* user_data) -> int {
        return static_cast<MockNghttp2Callbacks*>(user_data)
            ->OnInvalidFrameRecv(frame, error_code);
      });

  return callbacks;
}

}  // namespace test
}  // namespace adapter
}  // namespace http2
