#include "net/third_party/quiche/src/quic/core/uber_quic_stream_id_manager.h"

#include "net/third_party/quiche/src/quic/core/quic_session.h"
#include "net/third_party/quiche/src/quic/core/quic_utils.h"

namespace quic {
namespace {

Perspective Reverse(Perspective perspective) {
  return perspective == Perspective::IS_SERVER ? Perspective::IS_CLIENT
                                               : Perspective::IS_SERVER;
}

}  // namespace

UberQuicStreamIdManager::UberQuicStreamIdManager(
    QuicSession* session,
    size_t max_open_outgoing_streams,
    size_t max_open_incoming_streams)
    : bidirectional_stream_id_manager_(
          session,
          QuicUtils::GetFirstBidirectionalStreamId(
              session->connection()->transport_version(),
              session->perspective()),
          session->perspective() == Perspective::IS_SERVER
              ? QuicUtils::GetCryptoStreamId(
                    session->connection()->transport_version())
              : QuicUtils::GetInvalidStreamId(
                    session->connection()->transport_version()),
          QuicUtils::GetFirstBidirectionalStreamId(
              session->connection()->transport_version(),
              Reverse(session->perspective())),
          max_open_outgoing_streams,
          max_open_incoming_streams),
      unidirectional_stream_id_manager_(
          session,
          QuicUtils::GetFirstUnidirectionalStreamId(
              session->connection()->transport_version(),
              session->perspective()),
          QuicUtils::GetInvalidStreamId(
              session->connection()->transport_version()),
          QuicUtils::GetFirstUnidirectionalStreamId(
              session->connection()->transport_version(),
              Reverse(session->perspective())),
          max_open_outgoing_streams,
          max_open_incoming_streams) {}

void UberQuicStreamIdManager::RegisterStaticStream(QuicStreamId id) {
  if (QuicUtils::IsBidirectionalStreamId(id)) {
    bidirectional_stream_id_manager_.RegisterStaticStream(id);
    return;
  }
  unidirectional_stream_id_manager_.RegisterStaticStream(id);
}

void UberQuicStreamIdManager::SetMaxOpenOutgoingStreams(size_t max_streams) {
  bidirectional_stream_id_manager_.SetMaxOpenOutgoingStreams(max_streams);
  unidirectional_stream_id_manager_.SetMaxOpenOutgoingStreams(max_streams);
}

void UberQuicStreamIdManager::SetMaxOpenIncomingStreams(size_t max_streams) {
  bidirectional_stream_id_manager_.SetMaxOpenIncomingStreams(max_streams);
  unidirectional_stream_id_manager_.SetMaxOpenIncomingStreams(max_streams);
}

bool UberQuicStreamIdManager::CanOpenNextOutgoingBidirectionalStream() {
  return bidirectional_stream_id_manager_.CanOpenNextOutgoingStream();
}

bool UberQuicStreamIdManager::CanOpenNextOutgoingUnidirectionalStream() {
  return unidirectional_stream_id_manager_.CanOpenNextOutgoingStream();
}

QuicStreamId UberQuicStreamIdManager::GetNextOutgoingBidirectionalStreamId() {
  return bidirectional_stream_id_manager_.GetNextOutgoingStreamId();
}

QuicStreamId UberQuicStreamIdManager::GetNextOutgoingUnidirectionalStreamId() {
  return unidirectional_stream_id_manager_.GetNextOutgoingStreamId();
}

bool UberQuicStreamIdManager::MaybeIncreaseLargestPeerStreamId(
    QuicStreamId id) {
  if (QuicUtils::IsBidirectionalStreamId(id)) {
    return bidirectional_stream_id_manager_.MaybeIncreaseLargestPeerStreamId(
        id);
  }
  return unidirectional_stream_id_manager_.MaybeIncreaseLargestPeerStreamId(id);
}

void UberQuicStreamIdManager::OnStreamClosed(QuicStreamId id) {
  if (QuicUtils::IsBidirectionalStreamId(id)) {
    bidirectional_stream_id_manager_.OnStreamClosed(id);
    return;
  }
  unidirectional_stream_id_manager_.OnStreamClosed(id);
}

bool UberQuicStreamIdManager::OnMaxStreamIdFrame(
    const QuicMaxStreamIdFrame& frame) {
  if (QuicUtils::IsBidirectionalStreamId(frame.max_stream_id)) {
    return bidirectional_stream_id_manager_.OnMaxStreamIdFrame(frame);
  }
  return unidirectional_stream_id_manager_.OnMaxStreamIdFrame(frame);
}

bool UberQuicStreamIdManager::OnStreamIdBlockedFrame(
    const QuicStreamIdBlockedFrame& frame) {
  if (QuicUtils::IsBidirectionalStreamId(frame.stream_id)) {
    return bidirectional_stream_id_manager_.OnStreamIdBlockedFrame(frame);
  }
  return unidirectional_stream_id_manager_.OnStreamIdBlockedFrame(frame);
}

bool UberQuicStreamIdManager::IsIncomingStream(QuicStreamId id) const {
  if (QuicUtils::IsBidirectionalStreamId(id)) {
    return bidirectional_stream_id_manager_.IsIncomingStream(id);
  }
  return unidirectional_stream_id_manager_.IsIncomingStream(id);
}

bool UberQuicStreamIdManager::IsAvailableStream(QuicStreamId id) const {
  if (QuicUtils::IsBidirectionalStreamId(id)) {
    return bidirectional_stream_id_manager_.IsAvailableStream(id);
  }
  return unidirectional_stream_id_manager_.IsAvailableStream(id);
}

size_t UberQuicStreamIdManager::GetMaxAllowdIncomingBidirectionalStreams()
    const {
  return bidirectional_stream_id_manager_.max_allowed_incoming_streams();
}

size_t UberQuicStreamIdManager::GetMaxAllowdIncomingUnidirectionalStreams()
    const {
  return unidirectional_stream_id_manager_.max_allowed_incoming_streams();
}

void UberQuicStreamIdManager::SetLargestPeerCreatedStreamId(
    QuicStreamId largest_peer_created_stream_id) {
  if (QuicUtils::IsBidirectionalStreamId(largest_peer_created_stream_id)) {
    bidirectional_stream_id_manager_.set_largest_peer_created_stream_id(
        largest_peer_created_stream_id);
    return;
  }
  unidirectional_stream_id_manager_.set_largest_peer_created_stream_id(
      largest_peer_created_stream_id);
}

QuicStreamId UberQuicStreamIdManager::next_outgoing_bidirectional_stream_id()
    const {
  return bidirectional_stream_id_manager_.next_outgoing_stream_id();
}

QuicStreamId UberQuicStreamIdManager::next_outgoing_unidirectional_stream_id()
    const {
  return unidirectional_stream_id_manager_.next_outgoing_stream_id();
}

QuicStreamId
UberQuicStreamIdManager::max_allowed_outgoing_bidirectional_stream_id() const {
  return bidirectional_stream_id_manager_.max_allowed_outgoing_stream_id();
}

QuicStreamId
UberQuicStreamIdManager::max_allowed_outgoing_unidirectional_stream_id() const {
  return unidirectional_stream_id_manager_.max_allowed_outgoing_stream_id();
}

size_t UberQuicStreamIdManager::max_allowed_outgoing_bidirectional_streams()
    const {
  return bidirectional_stream_id_manager_.max_allowed_outgoing_streams();
}

size_t UberQuicStreamIdManager::max_allowed_outgoing_unidirectional_streams()
    const {
  return unidirectional_stream_id_manager_.max_allowed_outgoing_streams();
}

QuicStreamId
UberQuicStreamIdManager::actual_max_allowed_incoming_bidirectional_stream_id()
    const {
  return bidirectional_stream_id_manager_
      .actual_max_allowed_incoming_stream_id();
}

QuicStreamId
UberQuicStreamIdManager::actual_max_allowed_incoming_unidirectional_stream_id()
    const {
  return unidirectional_stream_id_manager_
      .actual_max_allowed_incoming_stream_id();
}

QuicStreamId UberQuicStreamIdManager::
    advertised_max_allowed_incoming_bidirectional_stream_id() const {
  return bidirectional_stream_id_manager_
      .advertised_max_allowed_incoming_stream_id();
}

QuicStreamId UberQuicStreamIdManager::
    advertised_max_allowed_incoming_unidirectional_stream_id() const {
  return unidirectional_stream_id_manager_
      .advertised_max_allowed_incoming_stream_id();
}

}  // namespace quic
