/** @file
 *
 *  A brief file description
 *
 *  @section license License
 *
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you under the Apache License, Version 2.0 (the
 *  "License"); you may not use this file except in compliance
 *  with the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

#include "proxy/http3/Http3DebugNames.h"
#include "proxy/http3/Http3Types.h"

const char *
Http3DebugNames::frame_type(Http3FrameType type)
{
  switch (type) {
  case Http3FrameType::DATA:
    return "DATA";
  case Http3FrameType::HEADERS:
    return "HEADERS";
  case Http3FrameType::X_RESERVED_1:
    return "X_RESERVED_1";
  case Http3FrameType::CANCEL_PUSH:
    return "CANCEL_PUSH";
  case Http3FrameType::SETTINGS:
    return "SETTINGS";
  case Http3FrameType::PUSH_PROMISE:
    return "PUSH_PROMISE";
  case Http3FrameType::X_RESERVED_2:
    return "X_RESERVED_2";
  case Http3FrameType::GOAWAY:
    return "GOAWAY";
  case Http3FrameType::X_RESERVED_3:
    return "X_RESERVED_3";
  case Http3FrameType::X_RESERVED_4:
    return "X_RESERVED_4";
  case Http3FrameType::RESERVED:
    return "RESERVED";
  case Http3FrameType::UNKNOWN:
  default:
    return "UNKNOWN";
  }
}

const char *
Http3DebugNames::stream_type(Http3StreamType type)
{
  return Http3DebugNames::stream_type(static_cast<uint8_t>(type));
}

const char *
Http3DebugNames::stream_type(uint8_t type)
{
  switch (type) {
  case static_cast<uint8_t>(Http3StreamType::CONTROL):
    return "CONTROL";
  case static_cast<uint8_t>(Http3StreamType::QPACK_ENCODER):
    return "QPACK_ENCODER";
  case static_cast<uint8_t>(Http3StreamType::PUSH):
    return "PUSH";
  case static_cast<uint8_t>(Http3StreamType::QPACK_DECODER):
    return "QPACK_DECODER";
  default:
    return "UNKNOWN";
  }
}

const char *
Http3DebugNames::settings_id(uint16_t id)
{
  switch (id) {
  case static_cast<uint16_t>(Http3SettingsId::HEADER_TABLE_SIZE):
    return "HEADER_TABLE_SIZE";
  case static_cast<uint16_t>(Http3SettingsId::MAX_FIELD_SECTION_SIZE):
    return "MAX_FIELD_SECTION_SIZE";
  case static_cast<uint16_t>(Http3SettingsId::QPACK_BLOCKED_STREAMS):
    return "QPACK_BLOCKED_STREAMS";
  case static_cast<uint16_t>(Http3SettingsId::NUM_PLACEHOLDERS):
    return "NUM_PLACEHOLDERS";
  default:
    return "UNKNOWN";
  }
}

const char *
Http3DebugNames::error_code(uint16_t code)
{
  switch (code) {
  case static_cast<uint16_t>(Http3ErrorCode::H3_NO_ERROR):
    return "H3_NO_ERROR";
  case static_cast<uint16_t>(Http3ErrorCode::H3_GENERAL_PROTOCOL_ERROR):
    return "H3_GENERAL_PROTOCOL_ERROR";
  case static_cast<uint16_t>(Http3ErrorCode::H3_INTERNAL_ERROR):
    return "H3_INTERNAL_ERROR";
  case static_cast<uint16_t>(Http3ErrorCode::H3_STREAM_CREATION_ERROR):
    return "H3_STREAM_CREATION_ERROR";
  case static_cast<uint16_t>(Http3ErrorCode::H3_CLOSED_CRITICAL_STREAM):
    return "H3_CLOSED_CRITICAL_STREAM";
  case static_cast<uint16_t>(Http3ErrorCode::H3_FRAME_UNEXPECTED):
    return "H3_FRAME_UNEXPECTED";
  case static_cast<uint16_t>(Http3ErrorCode::H3_FRAME_ERROR):
    return "H3_FRAME_ERROR";
  case static_cast<uint16_t>(Http3ErrorCode::H3_EXCESSIVE_LOAD):
    return "H3_EXCESSIVE_LOAD";
  case static_cast<uint16_t>(Http3ErrorCode::H3_ID_ERROR):
    return "H3_ID_ERROR";
  case static_cast<uint16_t>(Http3ErrorCode::H3_SETTINGS_ERROR):
    return "H3_SETTINGS_ERROR";
  case static_cast<uint16_t>(Http3ErrorCode::H3_MISSING_SETTINGS):
    return "H3_MISSING_SETTINGS";
  case static_cast<uint16_t>(Http3ErrorCode::H3_REQUEST_REJECTED):
    return "H3_REQUEST_REJECTED";
  case static_cast<uint16_t>(Http3ErrorCode::H3_REQUEST_CANCELLED):
    return "H3_REQUEST_CANCELLED";
  case static_cast<uint16_t>(Http3ErrorCode::H3_REQUEST_INCOMPLETE):
    return "H3_REQUEST_INCOMPLETE";
  case static_cast<uint16_t>(Http3ErrorCode::H3_MESSAGE_ERROR):
    return "H3_MESSAGE_ERROR";
  case static_cast<uint16_t>(Http3ErrorCode::H3_CONNECT_ERROR):
    return "H3_CONNECT_ERROR";
  case static_cast<uint16_t>(Http3ErrorCode::H3_VERSION_FALLBACK):
    return "H3_VERSION_FALLBACK";
  case static_cast<uint16_t>(Http3ErrorCode::QPACK_DECOMPRESSION_FAILED):
    return "QPACK_DECOMPRESSION_FAILED";
  case static_cast<uint16_t>(Http3ErrorCode::QPACK_ENCODER_STREAM_ERROR):
    return "QPACK_ENCODER_STREAM_ERROR";
  case static_cast<uint16_t>(Http3ErrorCode::QPACK_DECODER_STREAM_ERROR):
    return "QPACK_DECODER_STREAM_ERROR";
  default:
    if (0x0100 <= code && code <= 0x01FF) {
      return "MALFORMED_FRAME";
    }

    return "UNKNOWN";
  }
}
