// Copyright (c) 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "quiche/quic/core/quic_transmission_info.h"

#include "absl/strings/str_cat.h"

namespace quic {

QuicTransmissionInfo::QuicTransmissionInfo()
    : sent_time(QuicTime::Zero()),
      bytes_sent(0),
      encryption_level(ENCRYPTION_INITIAL),
      transmission_type(NOT_RETRANSMISSION),
      in_flight(false),
      state(OUTSTANDING),
      has_crypto_handshake(false),
      has_ack_frequency(false) {}

QuicTransmissionInfo::QuicTransmissionInfo(EncryptionLevel level,
                                           TransmissionType transmission_type,
                                           QuicTime sent_time,
                                           QuicPacketLength bytes_sent,
                                           bool has_crypto_handshake,
                                           bool has_ack_frequency)
    : sent_time(sent_time),
      bytes_sent(bytes_sent),
      encryption_level(level),
      transmission_type(transmission_type),
      in_flight(false),
      state(OUTSTANDING),
      has_crypto_handshake(has_crypto_handshake),
      has_ack_frequency(has_ack_frequency) {}

QuicTransmissionInfo::QuicTransmissionInfo(const QuicTransmissionInfo& other) =
    default;

QuicTransmissionInfo::~QuicTransmissionInfo() {}

std::string QuicTransmissionInfo::DebugString() const {
  return absl::StrCat(
      "{sent_time: ", sent_time.ToDebuggingValue(),
      ", bytes_sent: ", bytes_sent,
      ", encryption_level: ", EncryptionLevelToString(encryption_level),
      ", transmission_type: ", TransmissionTypeToString(transmission_type),
      ", in_flight: ", in_flight, ", state: ", state,
      ", has_crypto_handshake: ", has_crypto_handshake,
      ", has_ack_frequency: ", has_ack_frequency,
      ", first_sent_after_loss: ", first_sent_after_loss.ToString(),
      ", largest_acked: ", largest_acked.ToString(),
      ", retransmittable_frames: ", QuicFramesToString(retransmittable_frames),
      "}");
}

}  // namespace quic
